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-install
でminor-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の公開リポジトリに置けなくなる、みたいになってもやだしね。
また別のアプローチのアイディアはあるので、なにか形になったらまた紹介しますね ヾ(〃><)ノ゙
脚注
-
それに留まらず、画面内にJPEGなどの画像を表示する
image-mode
や表形式のリストUIを提供するtabulated-list-mode
のようなメジャーモードもあります。 ↩