25.3 ファイルのモードを選択する

ファイルをvisitしたとき、Emacsは自動的にメジャーモードを選択します。これは通常、ファイル名にもとづいて選択されます—たとえば名前が‘.c’で終わるファイルは通常、Cモードで編集されます — が、ファイル内の特別なテキストにもとづいてメジャーモードが選択されるときもあります。この特別なテキストは、バッファーローカルなマイナーモードを有効にするためにも使用されます。

以下は、これの正確な手順です:

最初にEmacsは、ファイルにファイルローカル(file-local)なモード変数が含まれているかチェックします。ファイル内のローカル変数を参照してください。メジャーモードを指定するファイルローカル変数が存在する場合、Emacsは他の条件をすべて無視してそのメジャーモードを使用します。ファイルローカル変数を使用してメジャーモードを指定する方法はいくつかあります。一番単純なのは、空行でない最初の行に、そのモードの名前と、モード名の前後に‘-*-’を記述する方法です。他のテキストがその行にあっても問題はありません。たとえば、

; -*-Lisp-*-

これはEmacsにLispモードを使用するよう指示します。Lispがこの行をコメントとして扱うように、セミコロンがどのように使われているか注意してください。以下のように書くこともできます

; -*- mode: Lisp;-*-

ファイルローカル変数を使用して、バッファーローカルなマイナーモードを指定することもできます。これはeval指定を使用して行います。たとえば、空行でない最初の行に以下を記述すると、これはバッファーをLispモードにして、Auto-Fillモードを有効にします。

; -*- mode: Lisp; eval: (auto-fill-mode 1); -*-

しかし、ほとんどのマイナーモードはユーザー個人の好みが表れるものなので、この方法でマイナーモードを有効にするのは、通常は不適切です。特定のファイルタイプにたいしてマイナーモードを個人的に使用したい場合は、メジャーモードフックを通じてマイナーモードを有効にするのが、より良い方法です。

2番目にEmacsはファイルの拡張子がディレクトリーローカルauto-mode-alistのいずれかにマッチするかどうかをチェックします。これらは.dir-locals.elの手法により発見されます(ディレクトリーごとのローカル変数を参照)。

3番目に、メジャーモードを指定するファイル変数が存在しない場合、Emacsは最初の行が‘#!’で開始されていないかチェックします。もし該当したら、それはそのファイルがファイルの最初の行に記述された名前のインタープリターを実行する(ファイルの残りはインタープリターへの入力として使用されます)ことにより機能する、実行可能なシェルコマンドであることを示します。したがってEmacsはインタープリター名を使って、モードの選択を試みます。たとえば、‘#!/usr/bin/perl’で始まるファイルは、Perlモードで開かれます。変数interpreter-mode-alistは、インタープリター名とメジャーモードの対応を指定します。

最初の行が‘#!’で開始されている場合、最初の行で‘-*-’の機能は通常は使用できません。なぜならインタープリターを実行するときにシステムが混乱するからです。そのため、Emacsはそのようなファイルにたいしては、1行目と同じように2行目の‘-*-’を探します。これはマジック文字列‘'\"’で開始されるman pageで、troffプリプロセッサーのリストを指定することと同じです。

4番目に、Emacsは変数magic-mode-alistにもとづいて、バッファーの先頭のテキストを調べて、メジャーモードの決定を試みます。デフォルトではこの変数はnil(空のリスト)なので、Emacsはこのステップをスキップしますが、initファイルでこれをカスタマイズできます(Emacs初期化ファイルを参照してください)。変数の値には、以下の形式のリスト要素を指定します

(regexp . mode-function)

ここでregexpは正規表現(正規表現の構文を参照してください)で、mode-functionはメジャーモード関数です。ファイルの先頭のテキストがregexpにマッチした場合、Emacsはmode-functionで指定したメジャーモードを選択します。

magic-mode-alistの要素は、以下の形式でも指定できます

(match-function . mode-function)

ここでmatch-functionは、バッファーの先頭で呼び出されるLisp関数です。この関数が非nilを返した場合、Emacsはメジャーモードをmode-functionにセットします。

5番目に —Emacsが適正なメジャーモードをまだ見つけていない場合 — 今度はファイル名を調べます。ファイル名とメジャーモードの対応付けは、変数auto-mode-alistで制御されます。この変数の値は、各要素が以下の形式のリストです。

(regexp . mode-function)

または以下の形式です

(regexp mode-function flag)

たとえば、通常見られるようなリストの要素は、("\\.c\\'" . c-mode)のような形式で、これは名前が.cで終わるファイルにたいして、Cモードを選択する役目を負っています(正規表現で‘.’がもつ特別な意味を打ち消すために、文字列に‘\’を含めなければなりません。これはLisp構文では‘\\’と記述する必要があります)。

要素が(regexp mode-function flag)の形式をもち、flagが非nilの場合には、(nilでなければ)mode-functionを呼び出した後に、Emacsはregexpとマッチした接尾辞を捨ててほかのマッチを検索します。この“再帰的な拡張子除去(recursive extension stripping)”は拡張子を複数もち、実際に正しいモードを指定する“内側”の拡張子を、“外側”の拡張子が隠しているようなファイルに使用されます。たとえばバックアップファイルや拡張子.gpgをもつGPG暗号化ファイルには、この機能が使用されます。

GNU/Linuxおよび、ファイル名の大文字小文字を区別する他のシステムでは、Emacsはauto-mode-alistの検索で大文字小文字を区別します。この検索が失敗すると、2回目は大文字小文字を区別せずにalistを再検索します。2回目の検索を行わないようにするには、変数auto-mode-case-foldnilに変更します。Microsoft Windowsのような、ファイル名の大文字小文字を区別しないシステムでは、Emacsは大文字小文字を区別しないでauto-mode-alistを検索します。

最後に、Emacsがまだ使用するメジャーモードを見つけられない場合、Emacsはバッファーの先頭のテキストと、変数magic-fallback-mode-alistを比較します。この変数は上述したmagic-mode-alistと同じように機能しますが、auto-mode-alistに調べられるという点が異なります。デフォルトではmagic-fallback-mode-alistにはイメージファイル、HTML/XML/SGMLファイル、PostScriptファイル、およびUnixスタイルのConfファイルをチェックする形式が含まれています。

Once a major mode is found, Emacs does a final check to see if the mode has been remapped by major-mode-remap-alist, in which case it uses the remapped mode instead. This is used when several different major modes can be used for the same file type, so you can specify which mode you prefer. Note that this remapping affects the major mode found by all of the methods described above, so, for example, the mode specified by the first line of the file will not necessarily be the mode actually turned on in the buffer visiting the file. (This remapping also affects revert-buffer, see バッファーのリバート.) When several modes are available for the same file type, you can tell Emacs about your major-mode preferences by customizing major-mode-remap-alist. For example, put this in your ~/.emacs init file (see Emacs初期化ファイル)

  (add-to-list 'major-mode-remap-alist '(c-mode . c-ts-mode))

to force Emacs to invoke c-ts-mode when c-mode is specified by auto-mode-alist or by file-local variables. Conversely,

  (add-to-list 'major-mode-remap-alist '(c-mode))

will force Emacs to never remap c-mode to any other mode.

The default value of major-mode-remap-alist is nil, so no remapping takes place. However, loading some Lisp packages or features might introduce mode remapping, because Emacs assumes that loading those means the user prefers using an alternative mode. So for predictable behavior, we recommend that you always customize major-mode-remap-alist to express your firm preferences, because this variable overrides any remapping that Emacs might decide to perform internally.

If you have changed the major mode of a buffer, you can return to the major mode Emacs would have chosen automatically, by typing M-x normal-mode. This is the same function that find-file calls to choose the major mode. If the buffer is visiting a file, this command also processes the file’s ‘-*-’ line and file-local variables list (if any). See ファイル内のローカル変数. If the buffer doesn’t visit a file, the command processes only the major mode specification, if any, in the ‘-*-’ line and in the file-local variables list. M-x normal-mode takes the mode remapping into consideration, so if you customized major-mode-remap-alist after the buffer’s major mode was chosen by Emacs, normal-mode could turn on a mode that is different from the one Emacs chose originally.

コマンドC-x C-wおよびset-visited-file-nameは、新しいファイル名が何らかのモードに関係がある場合は、新しいメジャーコードに変更します(そのバッファーがファイルをvisitしていない場合、C-x C-sも同じことを行います)。しかしバッファーの内容がメジャーモードを指定していて、ある種の特別なメジャーモードはモードの変更を許しません。このモード変更機能をオフにするには、change-major-mode-with-file-namenilにセットして下さい。


This page has generated for branch:work/emacs-30_69b16e5c63840479270d32f58daea923fe725b90, commit:8c196e027afcda4529432b01ae733033b6ca1270 to check Japanese translation.