Next: , Previous: , Up: Major Modes   [Contents][Index]


24.2.2 Emacsがメジャーモードを選択する方法

Emacsはファイルをvisitするとき、ファイル名やファイル自体の内容などの情報を元にそのバッファーにたいするメジャーモードを選択します。またファイルのテキスト内で指定されたローカル変数も処理します。

Command: normal-mode &optional find-file

この関数はカレントバッファーにたいして適切なメジャーモード、およびバッファーローカル変数のバインディングを設定する。これはset-auto-mode (以下参照)を呼び出す。Emacs 26.1ではもはやhack-local-variablesを呼び出さずに、メジャーモードの初期化時のrun-mode-hooksでこれが行われる(Mode Hooksを参照)。

normal-modefind-file引数が非nilなら、normal-modefind-file関数が自身を呼び出したとみなす。この場合、normal-modeはそのファイル内の‘-*-’行、またはファイルの最後にあるローカル変数を処理できる。これを行うかどうかは変数enable-local-variablesが制御する。ファイルのローカル変数セクションの構文はLocal Variables in Files in The GNU Emacs Manualを参照のこと。

インタラクティブにnormal-modeを実行すると、引数find-fileは通常はnilである。この場合、normal-modeは無条件に任意のファイルローカル変数を処理する。

この関数はメジャーモードを選択してセットするためにset-auto-modeを呼び出す。この関数がモードを特定しなければバッファーのmajor-mode (以下参照)のデフォルト値により決定されるメジャーモードに留まる。

normal-modeはメジャーモードコマンド呼び出しの周囲にcondition-caseを使用するのでエラーはcatchされて、‘File mode specification error’とともに元のエラーメッセージがその後に報告される。

Function: set-auto-mode &optional keep-mode-if-same

この関数はカレントバッファーにたいして適切なメジャーモードを選択してセットする。この選択は関数自身の(優先順位による)決定にもとづく。優先順位は‘-*-行、ファイル終端近傍の任意の‘mode:’ローカル変数、‘#!行(interpreter-mode-alistを使用)、バッファーの先頭のテキスト(magic-mode-alistを使用)、最後がvisitされるファイル名(auto-mode-alistを使用)の順。How Major Modes are Chosen in The GNU Emacs Manualを参照のこと。enable-local-variablesnilならset-auto-modeは‘-*-行とファイル終端近傍にたいしてmodeタグのチェックを何も行わない。

モード特定のためにファイル内容をスキャンするのがふさわしくないファイルタイプがいくつかある。たとえばtarアーカイブファイルの終端付近に特定のファイルにたいしてモードを指定するローカル変数セクションをもつアーカイブメンバーファイルがたまたま含まれているかもしれない。こがそのファイルを含んだtarファイルに適用されるべきではないだろう。同様にtiffイメージファイルが‘-*-パターンにマッチするように見える行を最初の行に偶然含むかもしれない。これらの理由により、これらのファイル拡張子はいずれもinhibit-local-variables-regexpsリストのメンバーになっている。Emacsが、(モード指定に限らず)ファイルから任意の種類のローカル変数を検索することを防ぐには、このリストにパターンを追加する。

keep-mode-if-sameが非nilなら、すでにそのバッファーが適切なメジャーモードをもつときにこの関数はモードコマンドを呼び出さない。たとえばset-visited-file-nameはユーザーがセットしたかもしれないバッファーローカル変数をkillすることを防ぐために、これをtにセットする。

Function: set-buffer-major-mode buffer

この関数はbufferのメジャーモードをmajor-modeのデフォルト値にセットする。major-modenilなら、(それが適切なら)カレントバッファーのメジャーモードを使用する。例外としてbufferの名前が*scratch*なら、モードをinitial-major-modeにセットする。

バッファーを作成する低レベルのプリミティブはこの関数を使用しないが、switch-to-bufferfind-file-noselectのような中位レベルのコマンドは、バッファー作成時は常にこの関数を使用する。

User Option: initial-major-mode

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

Variable: interpreter-mode-alist

この変数は‘#!’行内のコマンドインタープリターを指定するスクリプトにたいして使用するメジャーモードを指定する。変数の値は(regexp . mode)という形式の要素をもつalistである。これはそのファイルが\\`regexp\\'にマッチするインタープリターを指定する場合にはmodeを使用することを意味する。たとえばデフォルト要素の1つは("python[0-9.]*" . python-mode)である。

Variable: magic-mode-alist

この変数の値は(regexp function)という形式の要素をもつalistである。ここでregexpは正規表現、functionは関数、またはnilである。ファイルをvisitした後にバッファーの先頭のテキストがregexpにマッチした場合、functionが非nilならset-auto-modefunctionを呼び出す。functionnilならauto-mode-alistがモードを決定する。

Variable: magic-fallback-mode-alist

これはmagic-mode-alistと同様に機能するが、そのファイルにたいしてauto-mode-alistがモードを指定しない場合だけ処理される点が異なる。

Variable: auto-mode-alist

この変数はファイル名パターン(正規表現)と対応するメジャーモードコマンドの連想配列を含む。ファイル名パターンは通常は‘.el’や‘.c’のようなサフィックスをテストするが必須ではない。このalistの通常の要素は(regexp . mode-function)のようになる。

たとえば、

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

バージョン番号とバックアップ用サフィックスをもつファイルをvisitしたとき、それらのサフィックスはfile-name-sans-versions (File Name Componentsを参照)を使用して展開されたファイル名(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’抜きのファイル名の解凍されたファイルを適切なモードに置く。

regexpがファイル名にマッチする要素がauto-mode-alistに複数ある場合には、Emacsは最初のマッチを使用する。

以下はauto-mode-alistの先頭に複数のパターンペアーを追加する方法の例である(あなたはinitファイル内でこの種の式を使ったことがあるかもしれない)。

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