メモ

マイナーモードの作り方。

  1. マイナーモード状態を保存する変数とかキーマップとか定義。
  2. モード定義様の関数を作る。メジャーモードと似たような感じ。引数は(&optional (arg nil sv)。(interactive "p")すること。argとsvはヘルプによればSVがnilならば状態は反転。ARGが負数もしくはnilならば無効になり、ARGが非負数値もしくはnon-nilならば有効。つまり新しい状態は引数で降ってくるってことになるかと。
  3. ed::toggle-mode する。引数はtoggle-mode VAR*1 ARG SV。ARGとSVは降ってきた引数をそのまま渡せるようだ。
  4. (update-mode-line t)でモード行の更新。
  5. モードが設定されていなければ、モードの初期化処理*2を行う。モードが設定されていた場合、解除処理*3。後始末は自分でしなければいけないということらしい。
  6. *minor-mode-alist*にマイナーモードを突っ込む。ヘルプに出ていないので実際の処理がどうなっているのかは正確にはわからないけれど、(モード状態変数 . 表示名)をpushnewする。keyにはcarを指定。多分ed::toggle-modeで*minor-mode-alist*を使ってるんだろうなぁ。

requireとload-libraryの違い。

後者は対話的。すでに読み込まれていた場合でもload-libraryの場合はもう一度読み込む。

*1:状態保存用変数はここで使う

*2:set-minor-mode-map(キーマップ設定)。目的のフックを仕掛けたりなんだり。マイナーモード固有の初期化処理

*3:unset-minor-mode-mapする(キーマップ解除)、それと仕掛けたフックを解除したり。