かな入力時のローマ字変換にルール追加.

SKKのローマ字かな変換ルールを追加しようと思って, 定義元を探してみた.
そしたら, skk-vars.el にハッケーン.
こんな感じで永遠と定義されてるんだねー.

(defcustom skk-rom-kana-base-rule-list
  '(("a" nil ("ア" . "あ"))
    ("bb" "b" ("ッ" . "っ"))
    ...

下にスクロールしていくと, コメントが日本語で書いてあった.
この書式は, (INPUT-STATE NEXT-STATE OUTPUT)ということらしい.



SKKは, INPUT-STATEを検出すると, OUTPUTをバッファへ挿入した上で, NEXT-STATEを保持するとのこと.
つまり, かなモードで「bb」と入力されたら, 「っ」とバッファへ挿入した上で,
「b」から始まるかな文字の入力を待っている状態になると.
INPUT-STATEとOUTPUT-STATEは, US-ASCII から成る文字列を用いる.
それで面白いのが, OUTPUT.
以下, skk-var.elのコメント.

OUTPUT には、以下の 3つの形式を指定できる。

文字列 -- かなモード、カナモードとも、これが挿入される。
文字列と文字列のセル (ドットペア)
-- かなモードにおいては CDR の、カナモードにおいては CAR の文字列が、
それぞれ挿入される。
関数名シンボル
-- 関数を実行する。もしその関数の返り値が文字列ならば、その文字列を
挿入する。

読んで気付いたが, SKKにおいて, lとかは, 関数を実行してんだよね.
以下実際に割当てられている例.

    ("l" nil skk-latin-mode)
    ("q" nil skk-toggle-kana)
    ("L" nil skk-jisx0208-latin-mode)
    ("Q" nil skk-set-henkan-point-subr)
    ("X" nil skk-purge-from-jisyo)
    ("/" nil skk-abbrev-mode)
    ("$" nil skk-display-code-for-char-at-point)

「$」なんてあったんだ. 知らなかったよ.
ちなみに, 「あ」という文字の上にカーソルを置いて,
「$」を押すとミニバッファ上に「`あ' KUTEN: 04-02, JIS: 2422, EUC: a4a2, SJIS: 82a0」と表示される.
これは, かな入力モードで色んな関数を簡単に実行できるのを追加できるかもしれんぞい.


それでユーザが独自に規則を追加したい場合は,
skk-rom-kana-base-rule-list」ではなくて, 「skk-rom-kana-rule-list」を使用すべきということらしい.

同様の規則を表す変数に `skk-rom-kana-rule-list' がある。SKK は両方の規則を利
用するが、 `skk-rom-kana-rule-list' の方が優先される。従ってユーザが独自の規
則を設定したい場合には、`skk-rom-kana-rule-list' の方を使うのがよい。"

ということで, 試しに, ここ↓の一覧にあるやつで良さそうなのを足してみようかな.

emacs - 高性能エディタ - 会津大学UNIXウィキ

設定には, ここを参考にした(ついでにここの設定も拝借した).

.emacs

とりあえず, こんなの書いた.

;; skkのかな入力時, 独自の規則を追加.

(setq skk-rom-kana-rule-list
      (append skk-rom-kana-rule-list
              '(("h," nil ("、" . "、"))
                ("h." nil ("。" . "。"))
                ("z=" nil ("≠" . "≠"))
                ("z(" nil "【")
                ("z)" nil "】")
                )))
;; ルールを更新
(setq skk-rule-tree
      (skk-compile-rule-list
       skk-rom-kana-base-rule-list skk-rom-kana-rule-list))

かなり便利よ, これは.
関数の指定だけど, どうも引数を必ず取る関数じゃないと駄目みたい.
引数の使い道はイマイチよく分からんが.
引数は, nilが与えられるのかな?
まあ, それはまた今度.
とりあえず, 関数について分かったことは, 引数を1つとりさえすれば使える.



あらためて感じたけど, SKKって, めちゃくちゃ奥が深いな.
いつかどこかで読んだ, 「SKKのソースは一度目を通してみるべき」という理由がよく分かった.