導入
バージョンアップするの遅くない?
経緯
実は昨日まで 29.3 を使っていたのですけども、普段自宅では仕事しないし、あまり Emacs は起動しないのもあり、気づくのが遅かったというか、Emacs くんもバージョンアップしたらすぐに設定エラーにしてくれたら良いんですけどもね。実はフォント設定をいろいろいじっていて init.el を更新していたのですが、何かのタイミングで突然 Emacs くんがご機嫌ナナメになるため、
・バージョンアップの結果なのか
・自分が init.el の編集で何かやらかしたのか
わからない状態となりまして、結果前者だったのですが、Emacs くんがエラー吐いて素で起動するようになってしまいかなり復旧するまで大変でした。(2時間ぐらいかかったかもw)
Emacs くんの内部事情はよくわかりませんが、たぶん init.el をバイトコンパイルしたものをどこかにキャッシュしていて、それで突然のタイミングでご機嫌ナナメになるのでしょう。知らんけど。それはそれで Emacs くんのキャッシュの動作がおかしいんじゃないかなと思いますけれども。Windows や Cygwin のせいかも?しれません。
原因
何がいけなかったか原因をメモに残して、今後の自分への戒めにしたいと思います。
主な原因(1)
最近の Emacs では英大小文字の区別が厳密になったようです。
これはバッファのキル(削除)を禁止する設定ですが、バッファ名の記述に厳密さが求められます。というか以前の Emacs がテキトーだったので、より正しく動作するように修正されたと言うべきでしょうか。
(誤)
;;; buffer を kill しない
(with-current-buffer "*scratch*" (emacs-lock-mode 'kill))
(with-current-buffer "*messages*" (emacs-lock-mode 'kill))
;;; ^
(正)
;;; buffer を kill しない
(with-current-buffer "*scratch*" (emacs-lock-mode 'kill))
(with-current-buffer "*Messages*" (emacs-lock-mode 'kill))
;;; ^
このように英大小文字を厳密に合わせないと Emacs くんはオコになります。
いままで何も言ってこなかったのにねw
(誤)
;;; dired ls のタイムスタンプに日本語を使わない
(setenv "lc_all")
(setenv "lc_time" "posix")
(正)
;;; dired ls のタイムスタンプに日本語を使わない
(setenv "LC_ALL")
(setenv "LC_TIME" "POSIX")
setenv で設定する環境変数も同様に厳密さが求められ、英大文字にしないと曜日部分が日本語になってしまいます。
主な原因(2)
キー設定で kbd 関数を使う必要があります。
この設定は C-z 誤入力で Emacs くんが最小化してムカつく(マウスを触らないと Emacs くんを元に戻せないため非常にイライラしますw)のを防ぎ、利用者の精神を安定化する効果があります。
(誤)
;; c-z で最小化するのを無効にする
(global-set-key "\c-z" nil)
(正)
;; c-z で最小化するのを無効にする
(global-set-key (kbd "C-z") nil)
従来は OK だった書き方ですが、最近の Emacs くんは激オコになります。おそらく最近の Emacs くんは「絶対バックスラッシュ許さないマン」に進化したと思われます。これがあちこちに有ったため、あちこちでエラーが出まくって原因特定にすごい時間がかかりました。
おわりに
他にもダメな設定は潜んでいて、まだ気づいてないものがあるかも知れませんし、今後のバージョンアップで今の init.el の書き方では Emacs くんが怒り出す可能性もあります。最近全然 Emacs を起動してなかったので、いつのバージョンから仕様が変わったのかはよくわかりません。今後のバージョンアップ時にまた同じようなトラブルに遭う可能性はあるので気をつけたいところです。
バージョンアップの際は、ざっとでもリリースノートに目を通したほうが良いですね。(自分は読んでもよくわからんのでスルーしますがw)
蛇足
ちなみにフォントは PlemolJP に変えました。見やすいフォントなので気に入ってます。