Emacsがファイルを開く際、ファイル名やファイル自体の情報に基づいて、バッファ用のメジャーモードを自動的に選択します。また、ファイル本文で指定されたローカル変数も処理します。
この関数は、現在のバッファに対して適切なメジャーモードとバッファローカル変数のバインディングを設定します。set-auto-mode(後述)を呼び出します。Emacs 26.1以降、hack-local-variablesは実行されなくなりました。現在はメジャーモードの初期化時にrun-mode-hooksで処理が行われます(モードフックを参照)。
normal-mode の引数 find-file が
nil 以外である場合、normal-mode
は find-file 関数が自身を呼び出しているとみなします。この場合、‘-*-’ 行またはファイルの末尾でローカル変数を処理することがあります。変数 enable-local-variables
によって、その処理を行うかどうかが制御されます。ファイルのローカル変数セクションの構文については、The GNU
Emacs Manual の Local
Variables in Files を参照してください。
normal-mode を対話的に実行した場合、引数 find-file は通常 nil
となります。この場合、normal-mode は無条件に任意のファイルローカル変数を処理します。
この関数は set-auto-mode
を呼び出してメジャーモードを選択し、設定します。ここでモードが指定されない場合、バッファは major-mode のデフォルト値(後述)で決定されたメジャーモードのままとなります。
normal-mode はメジャーモードコマンドの呼び出しを condition-case で囲んでいるため、エラーが捕捉され、‘File mode specification error’
に続いて元のエラーメッセージが報告されます。
この関数は、現在のバッファに適したメジャーモードを選択して設定します。判定は(優先順位に従って)、‘-*-’ 行、ファイル末尾付近にある任意の ‘mode:’ ローカル変数、‘#!’ 行(interpreter-mode-alist を使用)、バッファ先頭のテキスト(magic-mode-alist を使用)、そして最後に訪問済みのファイル名(auto-mode-alist を使用)に基づいて行われます。The
GNU Emacs Manual の How
Major Modes are Chosen を参照してください。enable-local-variables が nil
の場合、set-auto-mode は ‘-*-’ 行やファイル末尾付近でモードタグを確認しません。
ファイルの内容をスキャンしてモード指定子を探すことが適切ではないファイル形式があります。例えば、tarアーカイブのファイル末尾付近に、そのファイル固有のモードを指定するローカル変数セクションを持つメンバーファイルが含まれている場合があります。これを、格納元のtarファイルに適用すべきではありません。同様に、TIFF画像ファイルに、‘-*-’パターンに一致するように見える1行目が含まれている場合があります。こうした理由から、これら両方のファイル拡張子はリスト
inhibit-local-variables-regexps
に含まれています。Emacsが(モード指定子だけでなく)あらゆる種類のローカル変数を探索しないよう、このリストにパターンを追加してください。
keep-mode-if-same が nil
でない場合、バッファがすでに適切なメジャーモードであれば、この関数は mode コマンドを呼び出しません。例えば、set-visited-file-name
は、ユーザーが設定した可能性のあるバッファローカル変数を消失させないよう、これを t に設定します。
この関数は、buffer のメジャーモードをデフォルト値である major-mode に設定します。それが nil
の場合は、現在のバッファのメジャーモード(適切であれば)を使用します。例外として、buffer の名前が
*scratch* である場合は、モードを initial-major-mode に設定します。
バッファを作成するための低レベルプリミティブはこの関数を使用しませんが、switch-to-buffer や find-file-noselect
といった中レベルコマンドは、バッファを作成する際に常にこの関数を使用します。
この変数の値によって、初期 *scratch*
バッファのメジャーモードが決定されます。値には、メジャーモードコマンドであるシンボルを指定してください。デフォルト値は lisp-interaction-mode です。
この変数は、‘#!’
行でコマンドインタプリタを指定しているスクリプトで使用するメジャーモードを指定します。その値は (regexp . mode)
形式の要素からなるアリスタであり、これはファイルで指定されたインタプリタが \\`regexp\\' に一致する場合にモード mode
を使用することを意味します。例えば、デフォルト要素の一つに ("python[0-9.]*"
. python-mode) があります。
この変数の値は、(regexp . function) という形式の要素を持つアリストであり、ここで regexp は正規表現、function は関数または nil です。ファイルを読み込んだ後、バッファ先頭のテキストが 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)
...)
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)
という形式のエントリは、ファイルを解凍し、その後、ファイル名 sans ‘.gz’ に応じて解凍後のファイルを適切なモードに設定することができます。
auto-mode-alist に regexp
がファイル名と一致する要素が複数ある場合、Emacs は最初の一致箇所を使用します。
auto-mode-alist
の先頭に複数のパターンペアを付加する方法の例を以下に示します。(init ファイルでこのような表現を使用することがあります。)
(setq auto-mode-alist (append ;; File name (within directory) starts with a dot. '(("/\\.[^/]*\\'" . fundamental-mode) ;; File name has no dot. ("/[^\\./]*\\'" . fundamental-mode) ;; File name ends in ‘.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 にそのファイル形式の正規のメジャーモードを渡す必要があります。