こんにちは、私のEmacsを再起動する.emacs Advent Calendar 2016です。メジャーモードとファイルの関連付けにべんりなEmacs Lispパッケージを作成、メンテナンスしてるので布教がてら紹介していきますヾ(〃><)ノ゙ undocumentedな機能も溜まってきたことだし…
magic-filetypeとは何か
なんか、メジャーモードっぽいべんり機能を寄せ集めるつもりで作ったパッケージです。
言語とメジャーモードの関連付け
基本的なことは拡張子の関連付け:ファイル名ごとにモードを設定するをお読みください。auto-mode-alist
にファイル名のパターン(拡張子など)を登録していくのが基本です。
例として、JavaScriptの編集に(標準のjavascript-mode
の代りに)js2-modeを利用する場合は.emacs
ファイルに以下のように記述します。
(add-to-list 'auto-mode-alist '("\\.js\\'" . js2-mode))
magic-filetype-major-mode-of
上記の方式には若干の問題があります。俺はjavascript-mode
を捨ててjs2-mode
に移行したぞ! と思っても、Emacsの標準設定では.json
ファイルはjs2-mode
ではなくjavascript-mode
が起動されることになります。……これではおいしくないぞ?
そんなときに利用するのがmagic-filetype-major-mode-of
です。これは言語名のシンボルからメジャーモードを返す函数です。
;; 長いから短くエイリアスにする
(defalias 'major-mode-of 'magic-filetype-major-mode-of)
;; .jsonファイルをJavaScriptと同じモードで開く
(add-to-list 'auto-mode-alist `("\\.json\\'" . ,(major-mode-of 'javascript)))
;; composer.lockファイルを .json と同じモードで開く
(add-to-list 'auto-mode-alist `("/composer\\.lock\\'" . ,(major-mode-of 'json)))
これで上記に設定したモードはすべてjs2-mode
で開くことになったわけです。めでたい。
しかし、JSONに特化したメジャーモードとしてjson-modeが存在することを知ったのでこちらに移行しようとしたい! と思ったとします。
心配ご無用です。
;; .jsonファイルをjson-modeモードで開く
(add-to-list 'auto-mode-alist '("\\.json\\'" . json-mode)))
;; composer.lockファイルを .json と同じモードで開く
(add-to-list 'auto-mode-alist `("/composer\\.lock\\'" . ,(major-mode-of 'json)))
そうです。「JSONっぽいファイル」の定義をいちいち全部置換しなくて済むのです。
magic-filetype-set-auto-mode
もっと短く書きたい… そんなあなたのためにmagic-filetype-set-auto-mode
があります。
これは、以下のように利用します。
(add-to-list 'auto-mode-alist '("\\.json\\'" . json-mode)))
(magic-filetype-set-auto-mode 'json)
(add-to-list 'auto-mode-alist '("\\.rb\\'" . enh-ruby-mode)))
(magic-filetype-set-auto-mode 'ruby)
これで、「JSONっぽいファイル」「Rubyっぽいファイル」の多くにメジャーモードの設定を施すことができます。たとへば、世の中にはGemfile
やらPuppetfile
やら多くのRubyっぽいコンフィグファイルがありますが、それらひとつひとつを設定するのは骨が折れるのでまとめて面倒見てやるよ、ってのがmagic-filetype-set-auto-mode
の発想です。
RubyとかJSONとか触ることの多い型はご検討ください。
あとがき
なんか気になったことがあれば意見ください。