Emacsはファイルをvisitするとき、ファイル名やファイル自体の内容などの情報を元にそのバッファーにたいするメジャーモードを選択します。またファイルのテキスト内で指定されたローカル変数も処理します。
この関数はカレントバッファーにたいして適切なメジャーモード、およびバッファーローカル変数のバインディングを設定する。これはset-auto-mode
(以下参照)を呼び出す。Emacs
26.1ではもはやhack-local-variables
を呼び出さずに、メジャーモードの初期化時のrun-mode-hooks
でこれが行われる(モードフックを参照)。
normal-mode
のfind-file引数が非nil
なら、normal-mode
はfind-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’とともに元のエラーメッセージがその後に報告される。
この関数はカレントバッファーにたいして適切なメジャーモードを選択してセットする。この選択は関数自身の(優先順位による)決定にもとづく。優先順位は‘-*-’行、ファイル終端近傍の任意の‘mode:’ローカル変数、‘#!’行(interpreter-mode-alist
を使用)、バッファーの先頭のテキスト(magic-mode-alist
を使用)、最後がvisitされるファイル名(auto-mode-alist
を使用)の順。How Major Modes are Chosen in The GNU Emacs
Manualを参照のこと。enable-local-variables
がnil
ならset-auto-mode
は‘-*-’行とファイル終端近傍にたいしてmodeタグのチェックを何も行わない。
モード特定のためにファイル内容をスキャンするのがふさわしくないファイルタイプがいくつかある。たとえばtarアーカイブファイルの終端付近に特定のファイルにたいしてモードを指定するローカル変数セクションをもつアーカイブメンバーファイルがたまたま含まれているかもしれない。こがそのファイルを含んだtarファイルに適用されるべきではないだろう。同様にtiffイメージファイルが‘-*-’パターンにマッチするように見える行を最初の行に偶然含むかもしれない。これらの理由により、これらのファイル拡張子はいずれもinhibit-local-variables-regexps
リストのメンバーになっている。Emacsが、(モード指定に限らず)ファイルから任意の種類のローカル変数を検索することを防ぐには、このリストにパターンを追加する。
keep-mode-if-sameが非nil
なら、すでにそのバッファーが適切なメジャーモードをもつときにこの関数はモードコマンドを呼び出さない。たとえばset-visited-file-name
はユーザーがセットしたかもしれないバッファーローカル変数をkillすることを防ぐために、これをt
にセットする。
この関数はbufferのメジャーモードをmajor-mode
のデフォルト値にセットする。major-mode
がnil
なら、(それが適切なら)カレントバッファーのメジャーモードを使用する。例外としてbufferの名前が*scratch*なら、モードをinitial-major-mode
にセットする。
バッファーを作成する低レベルのプリミティブはこの関数を使用しないが、switch-to-buffer
やfind-file-noselect
のような中位レベルのコマンドは、バッファー作成時は常にこの関数を使用する。
この変数の値は*scratch*バッファーの初期のメジャーモードを決定する。値はメジャーモードコマンドであるようなシンボルであること。デフォルト値はlisp-interaction-mode
。
この変数は‘#!’行内のコマンドインタープリターを指定するスクリプトにたいして使用するメジャーモードを指定する。変数の値は(regexp
.
mode)
という形式の要素をもつalistである。これはそのファイルが\\`regexp\\'
にマッチするインタープリターを指定する場合にはmodeを使用することを意味する。たとえばデフォルト要素の1つは("python[0-9.]*"
. python-mode)
である。
この変数の値は(regexp
function)
という形式の要素をもつalistである。ここでregexpは正規表現、functionは関数、またはnil
である。ファイルをvisitした後にバッファーの先頭のテキストがregexpにマッチした場合、functionが非nil
ならset-auto-mode
はfunctionを呼び出す。functionがnil
ならauto-mode-alist
がモードを決定する。
これはmagic-mode-alist
と同様に機能するが、そのファイルにたいして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
(ファイル名の構成要素を参照)を使用して展開されたファイル名(ファイル名を展開する関数を参照)から取り除かれて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))
この変数には与えられたメジャーモードをアクティブにするにはどの関数を呼び出せばよいかを示す連想リストが含まれている。この変数はさまざまなメジャーモードによってサポートされているファイルフォーマットにたいして、デフォルトではどの候補が使用されるかを示すために使用できる。
たとえばより改善されたPascal向けメジャーモードを提供するサードパーティー製パッケージは、通常ならpascal-mode
を使用するであろうファイルすべてにたいして、以下のようにしてnormal-mode
にspiffy-pascal-mode
を使用するよう指示できる:
(add-to-list 'major-mode-remap-defaults '(pascal-mode . spiffy-pascal-mode))
この変数はmajor-mode-remap-alist
と同じフォーマットをもつ。あるメジャーモードが両方のリストにマッチした場合には、major-mode-remap-alist
が優先される。
この関数はmajor-mode-remap-alist
とmajor-mode-remap-defaults
に応じて、modeのかわりに使用するメジャーモードをリターンする。これらの変数によるモードのリマップが行われていなければmodeをリターンする。
あるパッケージが特定のファイルフォーマットにたいしてあるメジャーモードをアクティブにしたければ、mode
引数としてそのファイルフォーマットにたいする正規メジャーモードとすることにより、どのメジャーモードをアクティブにするか見つける際にユーザーの好みを反映させることができる。