Emacs

auto-minor-modeでファイル名によってマイナーモードを起動する

Emacsの機能を有効化する仕組みには、メジャーモードとマイナーモードがあります。この記事では、マイナーモードを簡単に有効化するための機能として、auto-minor-modeを紹介します。

モードとは

C言語用モードc-modeや、Markdown用モードmarkdown-modeのような特定の言語モードは、典型的でもっともふつうに利用されるメジャーモードです1

メジャーモードは、ファイルを開いたときにauto-mode-alistの設定に従って自動的に起動することができます。詳しくは拡張子の関連付け:ファイル名ごとにモードを設定する - Qiitaを読んでください。

しかしながら、同じ仕組みでマイナーモードを起動することはできません。

auto-minor-mode

Emacs Lispパッケージjoewreschnig/auto-minor-modeは、上記のメジャーモードのためのauto-mode-alistと同じ感覚で利用できるauto-minor-mode-alistを提供します。

インストール方法

Emacs25以降が必要です。Emacs 25.1がリリースされてそろそろ一年になるので、いつまでも24.x系を使ってるひとはそろそろ系に移行してもいい頃では。もう遠からずEmacs 26.1がリリースされますしね。

MELPAが追加された環境ではM-x package-installminor-minor-modeを探してください。それ以外は特に設定の必要はありません。

どうやって設定するの?

記述方法はauto-mode-alistほとんど同じです。若干異なるのは、メジャーモードは同時にひとつまでしか起動できないのでauto-mode-alistは最初に条件にマッチしたものだけが起動されますが、マイナーモードは複数起動可能なので、auto-minor-mode-alist条件にマッチしたもの全てが起動されますRun through an auto ALIST and enable all matching minor modes.

基本的な設定

init.elなどで以下のように記述することもできます。

(add-to-list 'auto-minor-mode-alist '("\.php\\'" . foo-minor-mode))

しかし、このような設定は可能ですが、一般的には無意味です。なぜならば、ふつうにはフックを使って以下のように書いた方が良いからです。

(add-hook 'php-mode-hook 'foo-minor-mode)

では、どのようなときにauto-minor-modeが役に立つのでせうか。

ドキュメントには以下のような例が挙げられます。つまり、単なる拡張子とは別の条件でマイナーモードを起動する場合です。

(add-to-list 'auto-minor-mode-alist '("-theme\\.el\\'" . rainbow-mode))

この場合は、 hoge.el では発火せず、 hoge-theme.el のようなファイルでのみrainbow-modeが起動します。

特定のディレクトリ

次に、あるディレクトリ以下のすべてのファイルでマイナーモードを起動したいときです。 (こちらの用法はドキュメントには載ってません)

;; /etc/ ディレクトリでのみ foo-minor-mode を起動する
(add-to-list 'auto-minor-mode-alist '("^/etc/" . foo-minor-mode))
;; ~/work/your-project/ でのみ foo-minor-mode を起動する
(add-to-list 'auto-minor-mode-alist `(,(format "^%s/work/your-project/" (getenv "HOME")) . foo-minor-mode))
;; ディレクトリ名が重複しない、あるいは重複して問題ない場合はフルパスを指定する必要はない
(add-to-list 'auto-minor-mode-alist '("/work/your-project/" . foo-minor-mode))

よくないところ

エディタの初期化ファイル(init.el)に、特定のプロジェクト固有の設定を書くような構成はかっこわるいんじゃないかなって気もします。そのために.emacs.dディレクトリをGitHubの公開リポジトリに置けなくなる、みたいになってもやだしね。

また別のアプローチのアイディアはあるので、なにか形になったらまた紹介しますね ヾ(〃><)ノ゙

脚注


  1. それに留まらず、画面内にJPEGなどの画像を表示するimage-modeや表形式のリストUIを提供するtabulated-list-modeのようなメジャーモードもあります。