Next: , Previous: Intro to Buffer-Local, Up: Buffer-Local Variables


10.10.2 バッファローカルな束縛の作成と削除

— コマンド: make-local-variable variable

この関数は、カレントバッファにおいて、 variable(シンボル)のバッファローカルな束縛を作る。 他のバッファは影響されない。 返す値はvariable

variableのバッファローカルな値は、 variableの以前と同じ値で始まる。 variableが空であれば、空のままである。

          
          
          ;; バッファ‘b1’では、
          (setq foo 5)                ; すべてのバッファに影響する
               ⇒ 5
          
          (make-local-variable 'foo)  ; b1’にローカル
               ⇒ foo
          
          
          foo                         ; これは値を
               ⇒ 5                   ;   変えない
          
          
          (setq foo 6)                ; b1’での値を
               ⇒ 6                   ;   変更する
          foo
               ⇒ 6
          
          
          ;; バッファ‘b2’では、値は変わっていない
          (save-excursion
            (set-buffer "b2")
            foo)
               ⇒ 5

変数のlet束縛の内側でその変数をバッファローカルにしても、 そのバッファがletに入るときや抜けるときに カレントバッファになっていないと、正しく動作しない。 これは、letが、異なる種類の束縛を区別しないからであり、 どの変数の束縛を作るかだけを知っているからである。

変数が端末にローカルなときには、この関数はエラーを通知する。 そのような変数は、同時にバッファローカルな束縛を持てない。 See Multiple Displays

注意: フック変数に対してmake-local-variableを使わないこと。 そのかわりにmake-local-hookを使う。 see Hooks

— コマンド: make-variable-buffer-local variable

この関数は、variable(シンボル)を 自動的にバッファローカルにするように印を付け、 これ以降にその変数に設定しようとすると、 その時点のカレントバッファにローカルにする。

この機能の重要な点は、 (letや他の束縛を作る構文で)変数を束縛しても、 その変数のバッファローカルな束縛を作らないことである。 (setsetqで)変数を設定して初めてそのようにする。

返す値はvariableである。

警告: ユーザーが異なるバッファでは異なったカスタマイズをするかもしれないと いうだけで、ユーザーオプション変数にmake-variable-buffer-localを 使うべきだと仮定しないこと。 ユーザーは、必要ならば、どんな変数でもローカルにできる。 選択はユーザーに任せるのがよい。

2つのバッファが同じ束縛を共有しないことが重要な場面では、 make-variable-buffer-localを使う。 たとえば、異なるバッファでは異なる値を持つことに依存するような Lispプログラムで内部目的に変数を使うときには、 make-variable-buffer-localを使うのが最良である。

— Function: local-variable-p variable &optional buffer

これは、variableがバッファbuffer (デフォルトはカレントバッファ)において バッファローカルであればtを返し、 さもなければnilを返す。

— Function: buffer-local-variables &optional buffer

この関数は、バッファbufferのバッファローカルな変数を 記述したリストを返す。 (bufferを省略するとカレントバッファを使う。) バッファローカルな変数とその値を入れた要素から成る連想リスト (see Association Lists)を返す。 しかし、bufferにおける変数のバッファローカルな束縛が空であると、 変数は結果のリストに直接現れる。

          (make-local-variable 'foobar)
          (makunbound 'foobar)
          (make-local-variable 'bind-me)
          (setq bind-me 69)
          (setq lcl (buffer-local-variables))
          
              ;; まず、すべてのバッファでローカルな組み込み変数
          ⇒ ((mark-active . nil)
              (buffer-undo-list . nil)
              (mode-name . "Fundamental")
              ...
          
          
              ;; 続いて、組み込みでないバッファローカルな変数
              ;; これはバッファローカルで、かつ、空
              foobar
          
              ;; これはバッファローカルで、かつ、空ではない
              (bind-me . 69))

このリストのコンスセルのcdrに新たな値を格納しても、 変数のバッファローカルな値を変更しないことに注意してほしい。

— コマンド: kill-local-variable variable

この関数は、カレントバッファにおけるvariable(シンボル)の バッファローカルな束縛を(あれば)削除する。 その結果、このバッファでは、variableのデフォルトの束縛が 見えるようになる。 典型的には、variableの値が変わる。 なぜなら、デフォルト値は、削除したバッファローカルな値とは 普通は異なるからである。

自動的にバッファローカルにする印が付いた変数のバッファローカルな束縛を 削除すると、カレントバッファではデフォルト値が見えるようになる。 しかし、変数に再度設定すると、それに対するバッファローカルな束縛が 再度作成される。

kill-local-variablevariableを返す。

この関数がコマンドであるのは、 対話的にバッファローカルな変数を作るのが有用なように、 対話的にバッファローカルな変数を削除するのが有用な場合があるからである。

— Function: kill-all-local-variables

この関数は、カレントバッファにおいて、 『恒久的』と印付けしてある変数を除いて、 すべてのバッファローカルな変数束縛を削除する。 その結果、バッファでは、ほとんどの変数のデフォルト値が見えるようになる。

この関数は、バッファに属する他のある種の情報もリセットする。 つまり、ローカルキーマップにnil、 構文テーブルに(standard-syntax-table)の値、 大文字小文字テーブルに(standard-case-table)、 略語テーブルにfundamental-mode-abbrev-tableの値を設定する。

この関数が最初に行うことは、 ノーマルフックchange-major-mode-hook(下記参照)を 実行することである。

各メジャーモードコマンドはこの関数を呼び出すことから始める。 つまり、基本(fundamental)モードに切り替え、 それ以前のメジャーモードのほとんどの効果を消しさる。 この処理を保証するために、メジャーモードで設定する変数には、 恒久的の印を付けないこと。

kill-all-local-variablesnilを返す。

— Variable: change-major-mode-hook

関数kill-all-local-variablesは、最初にこのノーマルフックを実行する。 このフックはメジャーモードに対して、 ユーザーが別のメジャーモードに切り替えていた場合には、 なにか特別なことを行う情報を提供する。 最良の結果を得るためには、この変数をバッファローカルにしておくと その役目を終えると変数は消えてしまい、それ以降のメジャーモードに干渉しない。 see Hooks

バッファローカル変数は、 変数名(シンボル)の属性permanent-localnil以外であると、 恒久的(permanent)です。 恒久的なローカル変数は、編集作業の文脈ではなく、 どのファイルを訪問中であるとかどのように保存するとかに関連する情報に 適しています。