« ^ »

custom-set-variablesを上手く扱うにはどうすれば良いんだろう?

所要時間: 約 2分

Emacsの設定値を変更するための関数として、custom-set-variablesが提供されている。この関数は、例えばpackage.elによってインストールされたパッケージやテーマのシンボル、ログの表示方法など、環境に依存する値を設定する。

Emacsは custom-set-variables で変更した値を、 ~/.emacs.d/init.el に自動的に挿入する。 .emacs.d/init.el などのファイルをGitで管理する場合、Emacsが自動で挿入した値が差分となってしまう。そのような場合は custom-file 変数を指定することで任意のファイルに出力するように変更できる。

このEmacsが挿入するデータを保存するファイルはGitに保存した方が良いのだろうか。環境固有の値が含まれるのだから、他の環境に影響を与えないために各マシン間で共有することはしない。そのためGitに登録しない方が都合が良い人が多いだろう。

では本当にこれらの値は、常に環境固有の値なのだろうか。例えば package-selected-packagespackage.el によってインストールされたパッケージだが package-install-selected-packages コマンドを用いると、この値を参照し必要なパッケージをインストールする。

どのようなEmacsを扱いたいかという要求は、人それぞれに異なると思うが、僕の場合はインストールするパッケージは出来ればマシン間で同一であって欲しいためこの値は共有したい。一方で safe-local-variable-values には .dir-local.el で設定したシンボルと値がそのまま記録される。この値の中には隠しておきたいような値が含まれていることが多い(例えば秘密のプロジェクト名であったり、公開していないAPIエンドポイントなど)。

設定ファイルはGitHubの公開リポジトリとしてホスティングしているため、このような値が混入されると困ってしまう。理想的な状態としては safe-local-variable-values のみ独立したファイルに自動的に保存されて欲しい。

正確な挙動は Contents/Resources/lisp/custom.el.gz を読んでみているが良さそうだ。

現状では仕方がないのでcustom-fileへの反映自体を行わないようにした。

(setq-default enable-local-variables :all)

しかしこれはとても乱暴な方法なので、もっと上手くやれたらとも思う。