Go to the first, previous, next, last section, table of contents.

マイナーモード

マイナーモードは、メジャーモードを修正したものではありません。そうではなく、マ イナーモードは多くの(異なる)メジャーモードからアクセスできるものでなくてはいけ ません。例えば、auto-fill-mode と auto-fustify-mode はテキストの挿入が可能なメ ジャーモードであれば、どこでも起動することができます。マイナーモードをインプリ メントするのは、 (しばしば)メジャーモードをインプリメントするよりずっと難かし いことがあります。この難かしさは、"マイナーモードは自分で自分自身を deactivate できなくてはいけない" という点や、(その際) "そのメジャーモードの環境をそのマイ ナーモードを起動する前の状態に復元しなくてはいけない" という(慣例としての)規則 からきています。

いくつかのマイナーモードは、バッファにテキストを挿入する際の方法の変更を目的と しています。多くの場合、(この種の)マイナーモードにおけるインプリメンテーション 上の最大の問題は、(その)走っているシステムに対して(必要とされる)フックを挿入す る方法を探すことです。 C のコードでテキスト挿入に作り込まれた auto-fill-hook は、 auto-fill-mode がアクティブでスペースを挿入(タイプ??) した時に呼ばれま す。 (2 つのモードは非常によく似ているため) このフックは auto-justify-mode で も呼ばれます。

しかし、その他の self-insert 文字に対応しなくてはいけないマイナーモードにとっ て、(その)コードを書くことは非常に困難です。主たる理由は、(その最後にタイプさ れたキーの挿入を行なうプリミティブである) self-insert-command が primitive 関 数である点です。以下に、これを行なう方法の 1つを示します (しかし、動かない!!):

; 'my-self-insert-command の関数セルを self-insert-command
; の関数値に設定する。
(fset 'my-self-insert-command (symbol-function 'self-insert-command))
; my-minor-mode-hook という変数を定義する
(defvar my-minor-mode-hook nil "Function that my minor mode should run")
; この変数を 各バッファに対しローカルにする。Make-local-variable は
; 変数を(make-local-variable が呼ばれた時の)カレントバッファに対し
; ローカルにする
; make-variable-buffer-local は すぐに その変数を
; 全てのバッファに対しローカルにする。
(make-variable-buffer-local 'my-minor-mode-hook)
; タイプされた文字を実際に挿入する前に my-minor-mode-hook を 走らせる
; よう self-insert-command を (再)定義する。
(defun self-insert-command (arg)
  (interactive "p")           ; 必要な繰返しの回数を受け取る
  (run-hook 'my-minor-mode-hook)
  (my-self-insert-command arg))

メジャーモード同様、マイナーモードのセットアップには、いくつかの慣例が存在しま す。 (モード初期化関数の名前、グローバルシンボルの名前、キーマップや他のテーブ ルの使用といった) メジャーモードにおける慣例のいくつかはマイナーモードにも適用 されます。

マイナーモードの初期化関数は、呼ばれるたびにそのモードの on/off をトグルする か、正の integer を与えるとそのモードを on にします。

マイナーモード関数は、そのマイナーモードと同じ名前を持つ変数に nil でない値を 設定しなくてはいけません。 (その最初の要素がそのマイナーモード変数で、2番目の 要素がそのマイナーモード用の short ストリングである) リストを、minor-mode- alist に追加しなくてはいけません。セクション 20.3 [minor-mode-alist]、ページ 188 参照。

ローカルキーマップにキーバインディングを追加する場合、そのキーマップを (マイ ナーモードがアクティブでなかった時の) もとの値にリストアできなくてはいけませ ん。


Go to the first, previous, next, last section, table of contents.