ファイルにローカル変数の値を指定できます。そのファイルをvisitしているバッファー内で、これらの変数にたいしてバッファーローカルなバインディングを作成するために、Emacsはこれらを使用します。ファイルローカル変数の基本的な情報については、Local Variables in Files in The GNU Emacs Manualを参照してください。このセクションではファイルローカル変数が処理される方法に影響する関数と変数を説明します。
ファイルローカル変数が勝手に関数や、後で呼び出されるLisp式を指定できたら、ファイルのvisitによってEmacsが乗っ取られてしまうかもしれません。Emacsは既知のファイルローカル変数だけにたいして、指定された値が安全だと自動的にセットすることにより、この危険から保護します。これ以外のファイルローカル変数は、ユーザーが同意した場合のみセットされます。
追加の安全策としてEmacsがファイルローカル変数を読み込むとき、一時的にread-circle
をnil
にバインドします(入力関数を参照)。これは循環認識と共有されたLisp構造からLispリーダーを保護します(循環オブジェクトの読み取り構文を参照)。
この変数はファイルローカル変数を処理するかどうかを制御する。以下の値が利用できる:
t
(デフォルト)安全な変数をセット、安全でない変数は問い合わせる(1回)。
:safe
安全な変数だけをセット、問い合わせはしない。
:all
問い合わせをせずに、すべての変数をセット。
nil
変数をセットしない。
すべての変数にたいして問い合わせる(1回)。
これは正規表現のリストである。ファイルがこのリストの要素にマッチする名前をもつなら、すべてのファイルローカル変数のフォームはスキャンされない。どんなときにこれを使いたいかの例は、Emacsがメジャーモードを選択する方法を参照のこと。
たとえenable-local-variables
がnil
であっても、いくつかのローカル変数セッティングは、デフォルトでは注意する必要があるだろう。これはデフォルトにおいてローカル変数lexical-binding
のセッティングの場合だけだが、この変数(シンボルのリスト)を使用して制御できる。
これはローカル変数が常に有効となるディレクトリーのリストである。これらのディレクトリーからロードされたディレクトリーローカル変数は、.dir-locals.elにある変数のようにたとえ危険であっても有効化される。このリストのディレクトリーは完全に展開された絶対ファイル名でなければならない。変数enable-remote-dir-locals
が非nil
にセットされている場合には、これらのディレクトリーはリモートディレクトリーかもしれない。
この関数はカレントバッファーの内容により指定された任意のローカル変数にたいしてパースを行い、適切にバインドと評価を行う。変数enable-local-variables
はここでも効果をもつ。しかしこの関数は‘-*-’行の、‘mode:’ローカル変数を探さない。set-auto-mode
はこれを行ってenable-local-variables
も考慮する(Emacsがメジャーモードを選択する方法を参照)。
この関数はfile-local-variables-alist
内に格納されたalistを調べて、各ローカル変数を順に適用することにより機能する。この関数は変数に適用する前(か後)に、before-hack-local-variables-hook
(かhack-local-variables-hook
)を呼び出す。alistが非nil
の場合のみ、事前のフック(before-hook)を呼び出し、その他のフックは常に呼び出す。この関数はそのバッファーがすでにもつメジャーモードと同じメジャーモードが指定された場合は‘mode’要素を無視する。
オプションの引数handle-modeがt
なら、この関数が行うのはメジャーモードを指定するシンボルをリターンすることだけであり、‘-*-’行やローカル変数リストがメジャーモードを指定していればそのモード、それ以外はnil
をリターンする。この関数はモードや他のファイルローカル変数をセットしない。handle-modeの値がnil
とt
のいずれでもなければ‘-*-’行の‘mode’に関するすべてのセッティングとローカル変数リストは無視されて、別のセッティングが適用される。handle-modeがnil
ならすべてのファイルローカル変数がセットされる。
このバッファーローカルな変数は、ファイルローカル変数のセッティングのalistを保持する。alistの各要素は(var . value)
という形式で、varはローカル変数のシンボル、valueはその値である。Emacsがファイルをvisitするとき、最初にすべてのファイルローカル変数をこのalistに収集して、その後で変数に1つずつ関数hack-local-variables
を適用する。
Emacsはfile-local-variables-alist
に格納されたファイルローカル変数を適用する直前にこのフックを呼び出す。
Emacsはfile-local-variables-alist
に格納されたファイルローカル変数を適用し終えた直後にこのフックを呼び出す。
ある変数にたいしてsafe-local-variable
プロパティによって安全な値を指定できます。このプロパティは引数を1つとる関数です。与えられた値にたいして、その関数が非nil
をリターンしたらその値は安全です。一般的に目にするファイル変数の多くは、safe-local-variable
プロパティをもちます。これらのファイル変数にはfill-column
、fill-prefix
、indent-tabs-mode
が含まれます。ブーリーン値の変数にたいしては、プロパティの値にbooleanp
を使用します。
Cソースコード内で定義された変数にsafe-local-variable
プロパティを定義したければ、それらの変数の名前とプロパティをfiles.elのセクション“Safe
local variables”のリストに追加してください。
defcustom
を使用してユーザーオプションを定義する際には、defcustom
に引数:safe
function
を追加してsafe-local-variable
プロパティをセットできます(カスタマイゼーション変数の定義を参照)。しかし:safe
を使用して定義された安全性の述語は、そのdefcustom
を含むパッケージのロード時の一度だけ認識されるものであり、それでは遅すぎることがしばしばあります。代替策としては、以下のようにオプションに安全性の述語を割り当てるためにautoloadクッキー(autoloadを参照)を使用できます:
;;;###autoload (put 'var 'safe-local-variable 'pred)
autoload
で指定された安全な値の定義は、そのパッケージのautoloadファイル(Emacsに同梱されたパッケージのほとんどではloaddefs.el)にコピーされて、セッションの開始からEmacsにより認識されます。
この変数はある変数の値が安全であることをマークする、別の方法を提供する。これはコンスセル(var
. val)
のリストでありvarは変数名、valはその変数にたいして安全な値である。
Emacsが一連のファイルローカル変数にしたがうかどうかユーザーに尋ねるとき、ユーザーはそれらの変数が安全だとマークすることができる。安全とマークするとsafe-local-variable-values
にこれらのvariable/valueペアーが追加されて、ユーザーのカスタムファイルに保存する。
特定のローカル変数にたいして常に完全に無視したい値がいくつかある場合には、この変数を使用できる。値はsafe-local-variable-values
と同じ形式であり、ファイルが指定するローカル変数の処理時にこのリストに現れる値にセットされるファイルローカル変数は常に無視される。safe-local-variable-values
の場合のように、ファイルローカル変数にしたがうべきかEmacsがユーザーに尋ねる際に、ユーザーは特定の値を恒久的に無視することを選択でき、この選択によってこの変数は変更されてユーザーのcustomファイルに保存される。この変数にある変数/値ペアーは、safe-local-variable-values
内にある同一ペアーより優先される。
この関数は上記の条件に基づき、symに値valを与えても安全なら非nil
をリターンする。
いくつかの変数は危険(risky)だと判断されます。ある変数が危険なら、その変数がsafe-local-variable-values
に自動的に追加されることはありません。ユーザーがsafe-local-variable-values
を直接カスタマイズすることで明示的に値を許さない限り、危険な変数をセットする前にEmacsは常に確認を求めます。
名前が非nil
のrisky-local-variable
プロパティをもつすべての変数は危険だと判断されます。defcustom
を使用してユーザーオプションを定義するとき、defcustom
に引数:risky
value
を追加することにより、ユーザーオプションにrisky-local-variable
プロパティをセットできます。それに加えて名前が‘-command’、‘-frame-alist’、‘-function’、‘-functions’、‘-hook’、‘-hooks’、‘-form’、‘-forms’、‘-map’、‘-map-alist’、‘-mode-alist’、‘-program’、‘-predicate’で終わるすべての変数は自動的に危険だと判断されます。後に数字をともなう変数‘font-lock-keywords’と‘font-lock-keywords’、さらには‘font-lock-syntactic-keywords’も危険だと判断されます。
この関数はsymが上記の条件にもとづき危険な変数なら非nil
をリターンする。
この変数はファイルによりローカル値を与えらるべきではない変数のリストを保持する。これらの変数に指定された任意の値は、完全に無視される。
“変数”‘Eval:’も抜け道になる可能性があるので、Emacsは通常はそれを処理する前に確認を求めます。
この変数は‘-*-’の行中、またはvisitされるファイル内のローカル変数リストにたいする、‘Eval:’の処理を制御する。値t
は無条件に実行し、nil
はそれらを無視することを意味します。それ以外なら各ファイルにたいして何を行うか、ユーザーに確認を求めることを意味する。デフォルト値はmaybe
。
この変数はファイルローカル変数リスト内で‘Eval:’“変数”が見つかった際に評価しても安全な式のリストを保持する。
式が関数呼び出しであり、その関数がsafe-local-eval-function
プロパティをもつなら、その式の評価が安全かどうかはそのプロパティ値が決定します。プロパティ値はその式をテストするための述語(predicate)、そのような述語のリスト(成功した述語があれば安全)、またはt
(引数が定数である限り常に安全)を指定できます。
テキストプロパティには、それらの値に関数呼び出しを含めることができるので抜け道になる可能性があります。したがってEmacsはファイルローカル変数にたいして指定された文字列値から、テキストプロパティを取り除きます。