Emacs の正規表現による空白文字の謎。
GNU Emacs Lisp Reference Manual - 正規表現のシンタックス によると、空白文字を表すのは、\s ではなく、\s- となっています。
実際に、C-u C-s による Regex I-search を使ってみると、確かに \S- で、空白文字にマッチします。
しかし、
(defun skip-white-forward () (skip-chars-forward "\s-" ))
のように、行頭から空白文字をスキップしてくれるよう関数を定義して、評価すると、
Debugger entered--Lisp error: (error "Invalid modifier in string")
の様にエラーとなってしまいます。\s- がいかんみたいです。どうしたもんかと正規表現について調べていたら、便利なツール Emacs らくらく入門 /syntax-classによると、\s の後には構文クラス(シンタックスクラス)がくっついて、小文字のs であれば、そのクラスの属する文字に一致、大文字のS であれば、そのクラスに属さない文字に一致、というわけらしいです。
このページにある、表がとても分かりやすいですね。
正規表現 | 構文種別 | その種別に属する文字 |
---|---|---|
\sc の例 | c の意味 | 具体的文字 |
\s- | 空白文字 | スペース、タブ |
\s (空白) | 空白文字 | スペース、タブ |
\sw | (英)単語を作る文字 | A-Za-z0-9 |
\s_ | シンボルを作る文字 | 上記 と $&*+-_<> の文字 |
んで、先ほどのskip-white-forward() ですが、
(defun skip-white-forward () (skip-chars-forward "\s " ))
"\s "にすると、正しく評価されるようになりました。
結局、\s- だとなぜエラーなのかは分かりませんが、上手くいったので、今日は勘弁しておくことにします。
ちなみに、この関数は xyzzy の組込み関数だったりします。skip-white-forward - refwiki
xyzzy の便利関数をパッケージにした xyzzy.el とかいう cl.el みたいな奴があってもいいんじゃないかなと思ったんですが、どうなんでしょうね。