前: Major Modes, 上: Major Modes
カレントバッファに対して明示的にメジャーモードを選択することもできます。 しかし、たいていは、ファイル名やファイル内の特別のテキストに基づいて 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)
の形式で
flagがnil
以外ならば、
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-mode
がnil
なら、
メジャーモードはまえに選択していたバッファのモードと同じものとなります。
バッファのメジャーモードを変更しても、
Emacsが自動的に選択するメジャーモードに戻れます。
それには、コマンドM-x normal-modeを使います。
このコマンドは、メジャーモードを選択するために
find-file
が呼び出す関数と同じ関数です。
この関数は、ファイル中にローカル変数リストがあればそれも処理します。
コマンドC-x C-wとset-visited-file-name
は、
新しいファイル名がモードを示すものであるなら、
新しいメジャーモードに変更します(see Saving)。
しかし、バッファの内容がメジャーモードを指定していて、かつ、
ある『特別な』メジャーモードがそのモードの変更を許さないなら、
メジャーモードは変更されません。
change-major-mode-with-file-name
をnil
に設定すると、
このモード変更機能をオフにできます。