冬にオススメmagic-filetypeで関連付け

  • 7
    いいね
  • 0
    コメント

こんにちは、私のEmacsを再起動する.emacs Advent Calendar 2016です。メジャーモードとファイルの関連付けにべんりなEmacs Lispパッケージを作成、メンテナンスしてるので布教がてら紹介していきますヾ(〃><)ノ゙ undocumentedな機能も溜まってきたことだし…

magic-filetypeとは何か

なんか、メジャーモードっぽいべんり機能を寄せ集めるつもりで作ったパッケージです。

言語とメジャーモードの関連付け

基本的なことは拡張子の関連付け:ファイル名ごとにモードを設定するをお読みください。auto-mode-alistにファイル名のパターン(拡張子など)を登録していくのが基本です。

例として、JavaScriptの編集に(標準のjavascript-modeの代りに)js2-modeを利用する場合は.emacsファイルに以下のように記述します。

init.el
(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です。これは言語名のシンボルからメジャーモードを返す函数です。

init.el
;; 長いから短くエイリアスにする
(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が存在することを知ったのでこちらに移行しようとしたい! と思ったとします。

心配ご無用です。

init.el
;; .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があります。

これは、以下のように利用します。

init.el
(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とか触ることの多い型はご検討ください。

あとがき

なんか気になったことがあれば意見ください。