ショック・File Local Variables

恥しながら、ファイルローカル変数というものを知らなかった。きっと他にも知らない人がいると思うので簡単に説明しておこう、ファイルローカル変数とはそのファイル内でのみ有効になる変数ということで、ファイルの一行目に次のように書くことで有効にできる。

 -*- variable-name: variable-value -*-

これで、variable-nameという変数にvariable-valueという値が割り付けられる。詳しくはFile-local Variables in Emacshttp://www.kmc.gr.jp/~tak/memo/emacs-local-variable.html)を参照してほしい。

で、何が恥しいかと言うと、先日作ったauto-compileコマンドだ(id:kt-blackout:20040421参照)。Elispが読めない人のために何をしているか解説すると次のようになる

  1. ファイルの先頭から正規表現『-\\*- auto-compile: \\(.*\\) -\\*-』を捜す
  2. 正規表現の括弧の中味を取得して、変数cmdにセット。
  3. cmdが空ならば、M-x compileと同じようにミニバッファでコンパイルコマンドを問い合わせる
  4. cmdをcompile関数に渡す
  5. コンパイル

このコマンドがしたかったことは、ファイル毎にコンパイルコマンドを設定できるようにすることだ。コンパイルコマンドの指定を"-*- auto-compile: XXX -*-"としたのは、どこかで同じような設定をしているコマンドを見たことがあったので、Emacsの習慣だと思ったからだ。最初に書いた通り、これは習慣ではなくて、決まり事だったんだ。

この時点でauto-compileの悪いところは

  • "-*- auto-compile: XXX -*-"を検索する必要は無い(Emacsによって自動的にファイルローカル変数になるから)
  • ローカル変数を設定出来るのだから、compile-command(M-x compileが参照するコンパイルコマンド格納変数)をローカル変数として宣言すれば、ファイル事にコンパイルコマンドを指定可能

ということで、auto-compile自体が無意味であることが分かった(泣)。auto-compileと同じ事をするためにはソースファイルの一行目に

/* -*- compile-command: "gcc test.c" -*- */

と、書いておけば良い。敢えて、自分のスクリプトを擁護すると、上記の方法ではファイルの読み込み時にローカル変数がセットされるため、有効にするためには一度ファイルを閉じて再度開く必要があるが、auto-compileは自力で読み込むため、書いた時点で有効になる。あと、auto-compile-insertは結構便利だから、もう少し作りこんでみるつもり。