GNU Emacs 32.0.50 (9008bf64c3) のマニュアルを PLaMo 翻訳で機械翻訳したものです。誤訳を含むことがあります。原文: https://www.gnu.org/software/emacs/manual/html_node/elisp/Creating-Buffer_002dLocal.html ・ emacs-doc.conao3.com

12.11.2 バッファローカルバインディングの作成と削除

コマンド: make-local-variable variable

この関数は、現在のバッファにおいて variable(シンボル)に対するバッファローカルなバインディングを作成します。他のバッファには影響しません。返される値は variable です。

variable のバッファローカル値は、当初 variable が持っていた値と同じになります。variable が void だった場合は、引き続き void のままとなります。

;; In buffer ‘b1’:
(setq foo 5)                ; Affects all buffers.
     ⇒ 5
(make-local-variable 'foo)  ; Now it is local in ‘b1’.
     ⇒ foo
foo                         ; That did not change
     ⇒ 5                   ;   the value.
(setq foo 6)                ; Change the value
     ⇒ 6                   ;   in ‘b1’.
foo
     ⇒ 6

;; In buffer ‘b2’, the value hasn’t changed.
(with-current-buffer "b2"
  foo)
     ⇒ 5

ある変数に対して let バインディング内でバッファローカル変数を作成しても、その処理を行うバッファが let への進入時および退出時のいずれにおいてもカレントでない限り、確実に動作しません。これは、let が異なる種類のバインディングを区別せず、単にどの変数に対してバインディングが行われたかしか把握していないためです。

定数や読み取り専用変数をバッファローカルにするのは誤りです。決して変化しない変数を参照してください。

変数がターミナルローカル(複数のターミナルを参照)である場合、この関数はエラーを通知します。このような変数は、バッファローカルな束縛を同時に持つことはできません。

警告: フック変数に make-local-variable を使用しないでください。add-hook または remove-hook で local 引数を使用すれば、フック変数は必要に応じて自動的にバッファローカルになります。

マクロ: setq-local &rest pairs

pairs は変数と値のペアのリストです。このマクロは、現在のバッファ内で各変数に対してバッファローカルなバインディングを作成し、それらにバッファローカルな値を割り当てます。これは、各変数に対して make-local-variable を呼び、続いて setq を呼び出すのと同等です。変数にはクォートされていないシンボルを指定してください。

(setq-local var1 "value1"
            var2 "value2")
コマンド: make-variable-buffer-local variable

この関数は variable(シンボル)を自動的にバッファローカルに設定するため、それ以降にこれを設定しようとするたびに、その時点でのカレントバッファに対してローカルになります。よく混同される make-local-variable とは異なり、この設定を取り消すことはできず、すべてのバッファにおける変数の挙動に影響します。

この機能の特異な点は、変数をバインドしても(let やその他のバインド構文を用いて)、バッファローカルなバインドが作成されないことです。現在のバッファ内で作成された let 形式のバインドが存在しない状態で、単に変数を設定する(set や setq を用いる)場合にのみ、バッファローカルなバインドが作成されます。

variable にデフォルト値が設定されていない場合、このコマンドを呼び出すと nil というデフォルト値が設定されます。variable に既にデフォルト値が設定されている場合は、その値は変更されません。その後、variable に対して makunbound を呼び出すと、void 型のバッファローカル値となり、デフォルト値には影響しません。

返される値は variable です。

定数や読み取り専用変数をバッファローカルにするのは誤りです。決して変化しない変数を参照してください。

警告: ユーザーがバッファごとに異なるカスタマイズを望む可能性があるという理由だけで、ユーザーオプション変数に make-variable-buffer-local を使用すべきだと決めつけないでください。ユーザーは必要に応じて、任意の変数をローカルに設定できます。その選択はユーザーに任せるのが得策です。

make-variable-buffer-local を使用するべきなのは、2つのバッファが決して同じバインディングを共有しないことが極めて重要な場合です。例えば、別々のバッファに個別の値を保持することに依存しているLispプログラムにおいて、変数を内部的な目的で使用する場合、make-variable-buffer-local の使用が最善の解決策となり得ます。

マクロ: defvar-local variable &optional value docstring

このマクロは、variable を初期値 value および docstring を持つ変数として定義し、自動的にバッファローカルとしてマークします。これは、defvar を呼び出した後に make-variable-buffer-local を呼び出すことと同等です。variable はクォートされていないシンボルである必要があります。

関数: local-variable-p variable &optional buffer

これは、variable がバッファ buffer(デフォルトは現在のバッファ)においてバッファローカルである場合は t を、そうでない場合は nil を返します。

関数: local-variable-if-set-p variable &optional buffer

variable がバッファ buffer 内でバッファローカルな値を持つか、あるいは自動的にバッファローカルである場合、t を返します。それ以外の場合は、nil を返します。省略された場合や nil の場合、buffer のデフォルトは現在のバッファとなります。

関数: buffer-local-value variable buffer

この関数は、バッファ buffer における variable(シンボル)のバッファローカルバインディングを返します。バッファ buffer において variable にバッファローカルバインディングがない場合は、代わりに variable のデフォルト値(バッファローカル変数のデフォルト値 を参照)を返します。

関数: buffer-local-boundp variable buffer

バッファ buffer に variable(シンボル)のバッファローカルな束縛があるか、あるいは variable にグローバル束縛がある場合、non-nil を返します。

関数: buffer-local-variables &optional buffer

この関数は、バッファ buffer 内のバッファローカル変数を記述するリストを返します。(buffer を省略した場合は、現在のバッファが使用されます。)通常、各リスト要素は (sym . val) という形式をとり、ここで sym はバッファローカル変数(シンボル)、val はそのバッファローカル値となります。ただし、buffer における変数のバッファローカルな束縛が void である場合、そのリスト要素は単に sym となります。

(make-local-variable 'foobar)
(makunbound 'foobar)
(make-local-variable 'bind-me)
(setq bind-me 69)
(setq lcl (buffer-local-variables))
    ;; First, built-in variables local in all buffers:
⇒ ((mark-active . nil)
    (buffer-undo-list . nil)
    (mode-name . "Fundamental")
    ...
    ;; Next, non-built-in buffer-local variables.
    ;; This one is buffer-local and void:
    foobar
    ;; This one is buffer-local and nonvoid:
    (bind-me . 69))

なお、このリスト内のコンスセルのCDRに新しい値を格納しても、変数のバッファローカルな値は変更されません。

コマンド: kill-local-variable variable

この関数は、現在のバッファにおける variable(シンボル)のバッファローカルなバインディング(もしあれば)を削除します。その結果、このバッファでは variable のデフォルトのバインディングが表示されるようになります。通常、デフォルト値は直前に削除されたバッファローカルな値とは異なるため、これにより variable の値が変化することになります。

設定時に自動的にバッファローカルになる変数のバッファローカルバインディングを削除すると、現在のバッファでデフォルト値が表示されるようになります。ただし、その変数を再度設定すると、再びバッファローカルバインディングが作成されます。

kill-local-variable は variable を返します。

この関数がコマンドとなっているのは、バッファローカル変数を対話的に作成するのが便利なのと同様に、対話的に1つのバッファローカル変数を消去することも時に便利だからです。

関数: kill-all-local-variables &optional kill-permanent

この関数は、現在のバッファにおけるすべてのバッファローカル変数のバインドを解除します。その結果、バッファではほとんどの変数のデフォルト値が表示されるようになります。デフォルトでは、永続としてマークされた変数や、nil または permanent-local-hook 以外のプロパティを持つローカルフック関数(フックの設定を参照)は破棄されませんが、オプション引数 kill-permanent が nil 以外である場合は、それらの変数までもが破棄されます。

kill-permanent がシンボル permanent-local の場合、この関数はローカル変数を破棄し、あらゆる変数ウォッチャーを無視します。reset の場合は、変数ウォッチャーを無視し、バッファが新規に作成されたかのようにリセットします。これらの値の使用には注意してください。例えば、reset は default-directory などのバッファ変数を nil に設定するため、予期しない動作を招く可能性があります。

この関数は、バッファに関するその他の特定の情報もリセットします。具体的には、ローカルキーマップをnilに、構文テーブルを(standard-syntax-table)の値に、ケーステーブルを(standard-case-table)に、そして略語テーブルをfundamental-mode-abbrev-tableの値に設定します。

この関数が最初に行う処理は、通常のフック change-major-mode-hook の実行です(後述)。

すべてのメジャーモードコマンドは、この関数を呼び出すことから始まります。この関数は、ファンダメンタルモードに切り替え、直前のメジャーモードによるエフェクトの大部分を消去する働きをします。この処理を確実に機能させるため、メジャーモードが設定する変数には永続フラグを立てないようにしてください。

kill-all-local-variables は nil を返します。

変数: change-major-mode-hook

関数 kill-all-local-variables は、他の処理を行う前にこの通常のフックを実行します。これにより、メジャーモードは、ユーザーが別のメジャーモードに切り替えた際に特別な処理が行われるよう設定できるようになります。また、ユーザーがメジャーモードを変更した際に解除されるべき、バッファ固有のマイナーモードにとっても有用です。

最適な結果を得るには、この変数をバッファローカルにしてください。そうすることで、処理終了後に消滅し、後続のメジャーモードに干渉しなくなります。Hooksを参照してください。

バッファローカル変数は、その変数名(シンボル)がnilではないpermanent-localプロパティを持つ場合、永続的となります。こうした変数はkill-all-local-variablesの影響を受けず、したがってメジャーモードを変更してもローカルバインディングがクリアされることはありません。永続的なローカル変数は、内容の編集方法ではなく、ファイルの出所や保存方法に関するデータに適しています。