昨晩の Emacs ミニミニ勉強会のネタ。
@tomoyaton
「auto-mode-alist って、("\.el\’" . emacs-lisp-mode)
とかが設定されてるけど、なんで “$” じゃなくて “\’” なの〜?」
@masutaka
「言われてみれば確かにそうですね。でも Mule 時代は
("\.el$" . emacs-lisp-mode) って設定されてた気がしますよ。」
結論から言うと、改行にマッチさせないよう、より厳格にしているからだっ
た。Mule 時代は “\’” がなかったのかな。
“$” は文字列の終端と改行にマッチする。
;; hoge.el には当然マッチ
(string-match "\\.el$" "hoge.el")
=> 4
;; hoge.ell には当然マッチしない。
(string-match "\\.el$" "hoge.ell")
nil
;; あれ、hoge.el の後ろが改行でもマッチするんだけど。。。
(string-match "\\.el$" "hoge.el
")
=> 4
“\’” は文字列の終端のみにマッチする。
;; hoge.el には当然マッチ
(string-match "\\.el\\'" "hoge.el")
=> 4
;; hoge.ell には当然マッチしない。ここまで同じ。
(string-match "\\.el\\'" "hoge.ell")
nil
;; おおっ!hoge.el の後ろが改行だとマッチしない!これか!
(string-match "\\.el\\'" "hoge.el
")
=> nil
Emacs-23.3a の Info に書いてあったけど、正直言って読んだだけでは分
からなかった。
34.3.1.1 Special Characters in Regular Expressions
`$'
is similar to `^' but matches only at the end of a line (or the
end of the accessible portion of the buffer). Thus, `x+$' matches
a string of one `x' or more at the end of a line.
When matching a string instead of a buffer, `$' matches at the end
of the string or before a newline character.
For historical compatibility reasons, `$' can be used only at the
end of the regular expression, or before `\)' or `\|'.
34.3.1.3 Backslash Constructs in Regular Expressions
`\''
matches the empty string, but only at the end of the buffer or
string being matched against.