ファイルを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モードを選択する役目を負っています(正規表現で‘.’がもつ特別な意味を打ち消すために、文字列に‘\’を含めなければなりません。これはLisp構文では‘\\’と記述する必要があります)。
"\\.c\\'"
.
c-mode)
要素が(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-fold
をnil
に変更します。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-name
をnil
にセットして下さい。