Next: , Previous: Example Major Modes, Up: Major Modes


22.1.3 メジャーモードの選択方法

Emacsは、ファイル名やファイル自体の情報をもとに、 当該ファイルを訪問するときの新しいバッファに対する メジャーモードを自動的に選択します。 また、ファイル内のテキストで指定されたローカル変数も処理します。

— コマンド: fundamental-mode

基本(fundamental)モードは、特化してないメジャーモードである。 他のメジャーモードは、実質的には、このモードとの対比で定義されている。 つまり、基本(fundamental)モードから始めて、 それらのメジャーモードではなにを変更するかを定義している。 関数fundamental-modeはフックを実行しないため、 読者はカスタマイズできない。 (Emacsの基本(fundamental)モードのふるまいを変えたければ、 Emacsの大局的な状態を変える必要がある。)

— コマンド: normal-mode &optional find-file

この関数は、カレントバッファに対して 適切なメジャーモードとバッファローカルな変数を確立する。 この関数はまずset-auto-modeを呼び出し、 続いて、ファイルのローカル変数を必要に応じて解析、束縛、評価するために hack-local-variablesを実行する。

normal-modeに対する引数find-filenil以外であると、 normal-modefind-fileから呼び出されたと仮定する。 その場合、ファイルの末尾や‘-*-’の形式の行にある ローカル変数リストを処理することもある。 変数enable-local-variablesは、この処理を行うかどうかを制御する。 ファイル内でのローカル変数リストの構文については、 See ファイルにローカルな変数

読者が対話的にnormal-modeを実行すると 引数find-fileは通常nilである。 その場合、normal-modeは、ローカル変数リストを無条件に処理する。

normal-modeは、メジャーモード関数を呼び出す周りでは condition-caseを使うので、エラーを補足して ‘File mode specification error’にもとのエラーメッセージを続けて エラーを報告する。

— User Option: enable-local-variables

この変数は、訪問したファイル内のローカル変数リストを処理するかどうかを 制御する。 値tは、ローカル変数リストを無条件に処理することを意味する。 nilは、それらを無視することを意味する。 それ以外の値であると、各ファイルごとにユーザーに問い合わせる。 デフォルト値はtである。

— Variable: ignored-local-variables

この変数は、ファイルのローカル変数リストで設定してはならない 変数のリストを保持する。 それらの変数に対して指定した値は無視される。

このリストに加えて、 属性risky-local-variablenil以外の値である変数も無視されます。

— User Option: enable-local-eval

この変数は、訪問したファイル内のローカル変数リストの‘Eval:’を 処理するかどうかを制御する。 値tは、それらを無条件に処理することを意味する。 nilは、それらを無視することを意味する。 それ以外の値であると、各ファイルごとにユーザーに問い合わせる。 デフォルト値はmaybeである。

— Function: set-auto-mode

この関数は、カレントバッファに対して適切なメジャーモードを選択する。 ‘-*-行の値、 (auto-mode-alistを使って)訪問したファイルの名前、 (interpreter-mode-alistを使って)‘#!行、 ファイルのローカル変数リストをもとに決定する。 しかし、この関数はファイルの末尾付近にある ローカル変数‘mode:’は調べないが、 関数hack-local-variablesは調べる。 See メジャーモードの選択方式

— User Option: default-major-mode

この変数は、新たなバッファに対するデフォルトのメジャーモードを保持する。 標準値はfundamental-modeである。

default-major-modeの値がnilであると、 Emacsは(以前の)カレントバッファのメジャーモードを 新たなバッファのメジャーモードとする。 しかし、メジャーモードコマンドのシンボルの属性mode-classの 値がspecialであると、新たなバッファのメジャーモードにはせず、 かわりに基本(fundamental)モードを使う。 この属性を持つモードは、 特別に準備したテキストに対してのみ有用であるdiredやrmailなどである。

— Function: set-buffer-major-mode buffer

この関数はバッファbufferのメジャーモードを default-major-modeの値とする。 この変数がnilであると、 (適切ならば)カレントバッファのメジャーモードを使う。

バッファを作成する低レベルの基本関数ではこの関数を使わないが、 switch-to-bufferfind-file-noselectなどの 中レベルのコマンドではバッファを作成するときにこのコマンドを使う。

— Variable: initial-major-mode

この変数の値は、最初のバッファ‘*scratch*’のメジャーモードを決定する。 値は、メジャーモードコマンドのシンボルであること。 デフォルト値は、lisp-interaction-modeである。

— Variable: auto-mode-alist

この変数は、ファイル名のパターン(正規表現、see Regular Expressions)と 対応するメジャーモードの連想リストを保持する。 通常、ファイル名パターンでは‘.el’や‘.c’などの接尾辞を調べるが、 そうでなくてもよい。 連想リストの通常の要素は (regexp . mode-function)の形である。

たとえばつぎのとおり。

          (("\\`/tmp/fol/" . text-mode)
           ("\\.texinfo\\'" . texinfo-mode)
           ("\\.texi\\'" . texinfo-mode)
           ("\\.el\\'" . emacs-lisp-mode)
           ("\\.c\\'" . c-mode)
           ("\\.h\\'" . c-mode)
           ...)

展開したファイル名(see File Name Expansion)がregexpに一致する ファイルを訪問すると、 set-auto-modeは対応するmode-functionを呼び出す。 この機能により、Emacsはほとんどのファイルに対して 適切なメジャーモードを選択する。

auto-mode-alistの要素が(regexp function t)の 形であると、functionを呼び出したあとで、 Emacsはファイル名のそれまで一致しなかった部分についてauto-mode-alistを 再度探索する。 この機能は解凍パッケージには有用である。 ("\\.gz\\'" function t)の形の要素で、 ファイルを解凍し、‘.gz’を除いたファイル名に従って 解凍済みファイルを適切なモードにできる。

auto-mode-alistにいくつかのパターン対を追加する方法を示す。 (この種の式を読者のファイル.emacsに使える。)

          (setq auto-mode-alist
            (append
          
             ;; ドットで始まる(ディレクトリ名付きの)ファイル名
             '(("/\\.[^/]*\\'" . fundamental-mode)
          
               ;; ドットのないファイル名
               ("[^\\./]*\\'" . fundamental-mode)
          
               ;; .C’で終るファイル名
               ("\\.C\\'" . c++-mode))
             auto-mode-alist))
— Variable: interpreter-mode-alist

この変数は、‘#!’行でコマンドインタープリタを指定している スクリプトに対して用いるメジャーモードを指定する。 この値は、(interpreter . mode)の形の要素から成る リストであること。 たとえば、デフォルトには("perl" . perl-mode)の要素がある。 各要素は、ファイルが指定するインタープリタがinterpreterに 一致したらモードmodeを使うことを意味する。 interpreterの値は、実際には正規表現である。

auto-mode-alistが使用すべきメジャーモードが 指定しなかった場合にのみこの変数を使う。

— Function: hack-local-variables &optional force

この関数は、カレントバッファの内容に指定されたローカル変数を 必要に応じて、解析、束縛、評価する。

normal-modeで述べたenable-local-variablesの処理は、 実際にはここで行う。 引数forceは、通常、 normal-modeに与えられた引数find-fileからくる。