Previous: Minor Modes, Up: Modes [Contents][Index]
ファイルをvisitしたとき、Emacsは自動的にメジャーモードを選択します。これは通常、ファイル名にもとづいて選択されます—たとえば名前が‘.c’で終わるファイルは通常、Cモードで編集されます — が、ファイル内の特別なテキストにもとづいてメジャーモードが選択されるときもあります。この特別なテキストは、バッファーローカルなマイナーモードを有効にするためにも使用されます。
以下は、これの正確な手順です:
最初にEmacsは、ファイルにファイルローカル(file-local)なモード変数が含まれているかチェックします。File Variablesを参照してください。メジャーモードを指定するファイルローカル変数が存在する場合、Emacsは他の条件をすべて無視してそのメジャーモードを使用します。ファイルローカル変数を使用してメジャーモードを指定する方法はいくつかあります。一番単純なのは、空行でない最初の行に、そのモードの名前と、モード名の前後に‘-*-’を記述する方法です。他のテキストがその行にあっても問題はありません。たとえば、
; -*-Lisp-*-
これはEmacsにLispモードを使用するよう指示します。Lispがこの行をコメントとして扱うように、セミコロンがどのように使われているか注意してください。以下のように書くこともできます
; -*- mode: Lisp;-*-
ファイルローカル変数を使用して、バッファーローカルなマイナーモードを指定することもできます。これはeval
指定を使用して行います。たとえば、空行でない最初の行に以下を記述すると、これはバッファーをLispモードにして、Auto-Fillモードを有効にします。
; -*- mode: Lisp; eval: (auto-fill-mode 1); -*-
しかし、ほとんどのマイナーモードはユーザー個人の好みが表れるものなので、この方法でマイナーモードを有効にするのは、通常は不適切です。特定のファイルタイプにたいしてマイナーモードを個人的に使用したい場合は、メジャーモードフックを通じてマイナーモードを有効にするのが、より良い方法です。
2番目に、メジャーモードを指定するファイル変数が存在しない場合、Emacsは最初の行が‘#!’で開始されていないかチェックします。もし該当したら、それはそのファイルがファイルの最初の行に記述された名前のインタープリターを実行する(ファイルの残りはインタープリターへの入力として使用されます)ことにより機能する、実行可能なシェルコマンドであることを示します。したがってEmacsはインタープリター名を使って、モードの選択を試みます。たとえば、‘#!/usr/bin/perl’で始まるファイルは、Perlモードで開かれます。変数interpreter-mode-alist
は、インタープリター名とメジャーモードの対応を指定します。
最初の行が‘#!’で開始されている場合、最初の行で‘-*-’の機能は通常は使用できません。なぜならインタープリターを実行するときにシステムが混乱するからです。そのため、Emacsはそのようなファイルにたいしては、1行目と同じように2行目の‘-*-’を探します。これはマジック文字列‘'\"’で開始されるman pageで、troffプリプロセッサーのリストを指定することと同じです。
3番目に、Emacsは変数magic-mode-alist
にもとづいて、バッファーの先頭のテキストを調べて、メジャーモードの決定を試みます。デフォルトではこの変数はnil
(空のリスト)なので、Emacsはこのステップをスキップしますが、initファイルでこれをカスタマイズできます(Init Fileを参照してください)。変数の値には、以下の形式のリスト要素を指定します
(regexp . mode-function)
ここでregexpは正規表現(Regexpsを参照してください)で、mode-functionはメジャーモード関数です。ファイルの先頭のテキストがregexpにマッチした場合、Emacsはmode-functionで指定したメジャーモードを選択します。
magic-mode-alist
の要素は、以下の形式でも指定できます
(match-function . mode-function)
ここでmatch-functionは、バッファーの先頭で呼び出されるLisp関数です。この関数が非nil
を返した場合、Emacsはメジャーモードをmode-functionにセットします。
4番目に —Emacsが適正なメジャーモードをまだ見つけていない場合 —
今度はファイル名を調べます。ファイル名とメジャーモードの対応付けは、変数auto-mode-alist
で制御されます。この変数の値は、各要素が以下の形式のリストです。
(regexp . mode-function)
または以下の形式です
(regexp mode-function flag)
たとえば、通常見られるようなリストの要素は、("\\.c\\'"
.
c-mode)
のような形式で、これは名前が.cで終わるファイルにたいして、Cモードを選択する役目を負っています(正規表現で‘.’がもつ特別な意味を打ち消すために、文字列に‘\’を含めなければなりません。これはLisp構文では‘\\’と記述する必要があります)。要素が(regexp
mode-function
flag)
の形式をもち、flagが非nil
の場合、Emacsはmode-functionを呼び出した後、Emacsはregexpとマッチした接尾辞を捨てて、ほかのマッチを検索します。
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ファイルをチェックする形式が含まれています。
バッファーのメジャーモードを変更したとき、M-x
normal-modeとタイプすると、Emacsが自動的に選択するメジャーモードに戻ることができます。この関数はfind-file
がメジャーモードを選択するために呼び出す関数と同じです。この関数は、(もしあれば)ファイルの‘-*-’
行およびローカル変数リストも処理します。File Variablesを参照してください。
コマンドC-x
C-wおよびset-visited-file-name
は、新しいファイル名が何らかのモードに関係がある場合は、新しいメジャーコードに変更します(そのバッファーがファイルをvisitしていない場合、C-x
C-sも同じことを行います)。しかしバッファーの内容がメジャーモードを指定していて、ある種の“特別”なメジャーモードはモードの変更を許しません。このモード変更機能をオフにするには、change-major-mode-with-file-name
をnil
にセットして下さい。