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


22.2.2 How Emacs Chooses a Major Mode

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

Command: normal-mode &optional find-file

この関数は、カレントバッファーにたいして適切なメジャーモードと、バッファーローカル変数のバインディングを設定する。これはまずset-auto-mode(以下参照)を呼び出し、その後にhack-local-variablesを実行してパース処理を行って、そのファイルのローカル変数(File Local Variablesを参照)を適切にバインド、または評価する。

normal-modefind-file引数が非nilの場合、normal-modefind-file関数が自身を呼び出したとみなす。この場合、normal-modeはそのファイル内の‘-*-’行の、またはファイルの最後にあるローカル変数を処理するかもしれない。これを行うかどうかは、変数enable-local-variablesが制御する。ファイルのローカル変数セクションの構文は、See 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’抜きのファイル名にたいして適切なモードに解凍されたファイルを配す。

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

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