昨晩の 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.