前: Major Modes, 上: Major Modes


17.1 メジャーモードの選択方式

カレントバッファに対して明示的にメジャーモードを選択することもできます。 しかし、たいていは、ファイル名やファイル内の特別のテキストに基づいて Emacsはどのモードを使うかを決定します。

明示的に新しいメジャーモードを選択するには、M-xコマンドで行います。 メジャーモードの名前に-modeを付け加えると、 そのモードを選ぶコマンド名になります。 したがって、Lispモードに入るにはM-x lisp-modeを実行します。

ファイルを訪問すると、Emacsは通常ファイル名に基づいて 正しいメジャーモードを選択します。 たとえば、`.c'で終る名前のファイルは、Cモードで編集されます。 ファイル名とメジャーモードとの対応は、 変数auto-mode-alistで制御します。 その値は、要素がつぎのような形式のリストです。

     (regexp . mode-function)

または、つぎの形式です。

     (regexp mode-function flag)

たとえば、このリストに通常ある要素は、 ("\\.c\\'". c-mode)です。 これは、.cで終る名前のファイルにはCモードを選びます。 (Lispの構文では、`\'を含めるには`\\'が必要。 また、`\'は、正規表現の`.'の特別な意味を抑制するために必要。) リストの要素が (regexp mode-function flag)の形式で flagnil以外ならば、 functionを呼んだあとにregexpに一致する接尾辞を捨てて、 リストで他に一致するものをふたたび探します。

ファイルの空行でない最初の行の特別な種類のテキストによって、 そのファイルを編集するためにどのメジャーモードを使うかを指定できます。 モード名は、その行に`-*-'で囲まれて現れます。 他のテキストがその行にあってもかまいません。 たとえば、

     ;-*-Lisp-*-

は、EmacsにLispモードを使うように指示します。 このような明示的な指定は、 ファイル名に基づいたメジャーモードに優先します。 この行がLispのコメントになるように セミコロンを使っていることに注意してください。

モードを指定する別の書式は、つぎのとおりです。

     -*- mode: modename;-*-

これは、同様にローカル変数も指定できて、つぎのように書きます。

     -*- mode: modename; var: value; ... -*-

より詳しくは、See File Variables

ファイルの内容が`#!'で始まるときは、 ファイルの1行目で指定したコマンドインタープリタを実行することで、 実行可能なシェルコマンドとして働きます。 ファイルの残りの部分は、インタープリタへの入力として使われます。

Emacsでそのようなファイルを訪問したとき、 ファイルの名前がメジャーモードを指定しないときには、 Emacsはモードを選択するために1行目のインタープリタの名前を使います。 1行目が、`perl'や`tcl'のような認識される インタープリタプログラムの名前ならば、 Emacsはインタープリタのプログラムにとって適切なモードを使用します。 変数interpreter-mode-alistは、 インタープリタプログラム名とメジャーモードとの対応を指定します。

1行目が`#!'で始まるときには、 インタープリタを実行するときにシステムが混乱するため、 1行目では`-*-'の機能を使えません。 そのため、そのようなファイルでは、Emacsは1行目に加えて2行目でも `-*-'を探します。

使用するメジャーモードを指定しないファイルを訪問したとき、 あるいは、C-x bで新たにバッファを作るときには、 変数default-major-modeが、使用するモードを指定します。 通常、その値は、基本(fundamental)モードを指定する シンボルfundamental-modeです。 default-major-modenilなら、 メジャーモードはまえに選択していたバッファのモードと同じものとなります。

バッファのメジャーモードを変更しても、 Emacsが自動的に選択するメジャーモードに戻れます。 それには、コマンドM-x normal-modeを使います。 このコマンドは、メジャーモードを選択するために find-fileが呼び出す関数と同じ関数です。 この関数は、ファイル中にローカル変数リストがあればそれも処理します。

コマンドC-x C-wset-visited-file-nameは、 新しいファイル名がモードを示すものであるなら、 新しいメジャーモードに変更します(see Saving)。 しかし、バッファの内容がメジャーモードを指定していて、かつ、 ある『特別な』メジャーモードがそのモードの変更を許さないなら、 メジャーモードは変更されません。 change-major-mode-with-file-namenilに設定すると、 このモード変更機能をオフにできます。