Emacsである特定の種類のファイルを編集するときにその編集に特化した機能を提供するEmacs Lispをメジャーモードといいます。C言語を編集するc-modeやHTMLを編集するhtml-modeなどがそうです。(テキストの編集だけでなくディレクトリ操作を行うdiredや、Emacsからシェルが扱えるshellなどもメジャーモードです。)
メジャーモードではだいたい、次のような機能が提供されます。
(defun test-mode () "Test Mode " (interactive) (kill-all-local-variables) (setq mode-name "Test") (setq major-mode 'test-mode) (run-hooks 'test-mode-hook)) (provide 'test-mode)
上から順に説明すると、
(defun test-mode ()
test-modeという関数名で引数なしで関数の宣言が始まります。
"Test Mode "
は関数test-modeの説明文字列である。説明文字列は関数定義の場合は引数リストの次に与えることができる(省略可能)。説明文字列は次のような方法で参照できる。
Emacsの適当なバッファで、
(description 'test-mode)
と打ち込んだ後、M-x eval-last-sexpと入力すると関数test-modeの説明文字列がミニバッファに表示される。Lisp interactionモードにおいては、
(description 'test-mode)
と打ち込んだ後、C-x C-eと入力することにより、説明文字列をミニバッファに表示させることもできる。
M-x apropos
このコマンドを入力した後「test-mode」と入力すると「test-mode」という文字列を含む変数や関数などの説明文字列が表示される。この例では、関数test-modeや変数test-mode-map、関数test-mode-messageの説明文字列が表示される。
説明文字列は関数の動作には影響がない。また、説明文字列は省略可能です。
(interactive)
このtest-mode関数がインタラクティブに呼び出せるようにします。インタラクティブな関数呼び出しとは、
M-x 関数名 RET
のようにして関数を呼び出すことである。
「M-x モード本体の関数名 RET」としてモードを起動することは一般的である。そのためにはこの3行目が必要である。
(kill-all-local-variables)
test-modeが呼ばれる前のメジャーモードのバッファーローカルな変数の束縛を消去する。メジャーモード関数の最初では必ず呼ばれるべき関数である。詳しい説明は以下を読んでください。
(setq mode-name "Test")
Emacsに"Test"というモード名が表示されるようにします。
(setq major-mode 'test-mode)
現在のメジャーモードがtest-modeであると設定します。
(run-hooks 'test-mode-hook))
test-modeが有効になった際に実行したい関数がリストtest-mode-hookに登録されていた場合は、それを実行する。
詳しくはここを参照してください:Mode Hooks
関数定義はここまでとなります。
(provide 'test-mode)
おまじない。ファイル名から.elをとったものとする。
上記コードをtest-mode.elという名前で保存してload-pathの通ったディレクトリに置き、.emacsのどこかに以下のコードを追加する。
(require 'test-mode)
provideしたものと同じものを書く。
Emacsを立ち上げて
M-x test-mode RET
と入力し、モード名に"TestMode"と表示されていれば成功。何の機能も持たないメジャーモードを実装した。