Previous: , Up: メジャーモードとマイナーモード   [Contents][Index]


24.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ファイルをチェックする形式が含まれています。

一旦メジャーモードが見つかれば、Emacsはそのモードがmajor-mode-remap-alistによってリマップ(remap: 再マップ)されているか最終チェックを行います(リマップされていればそのモードを使用する)。リマップは同一のファイルタイプに使用できる複数の異なるモードが存在する際に、好みのモードを指定できるようにするために使用されます。

バッファーのメジャーモードを変更したとき、M-x normal-modeとタイプすると、Emacsが自動的に選択するメジャーモードに戻ることができます。この関数はfind-fileがメジャーモードを選択するために呼び出す関数と同じです。そのバッファーがファイルをvisitしている場合には、このコマンドは(もしあれば)ファイルの‘-*-’行とファイルローカル変数も処理します。ファイル内のローカル変数を参照してください。そのバッファーがファイルをvisitしていなければ、このコマンドは(もしあれば)‘-*-’内のモード指定とファイルローカル変数リストだけを処理します。

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