DDSKKの日本語入力でC-iをまともに使いたい

DDSKK を使用していて困っていたのが,「かなモード」や「カナモード」のときに transient-mark-mode が有効なときの C-i が indent-resion にならないことだ.TAB キーでは上手くいくのに,C-i だとなぜかリージョン範囲が削除される.

define-key などで調べるとタブが insert 扱いになっているせいだとわかった.アルファベットキーで試せばわかるように,insert は transient-mark-mode 有効時にリージョンを削除して文字を挿入する.ということで,特定のキーに強制的にコマンドを割り当てる方法 - (rubikitch loves (Emacs Ruby CUI Books)) で強制的に割り当てようとしたが,上手くいかない.どうやら skk-j-mode-map の方が overriding-minor-mode より優先度が高いらしい.

そこで .emacsskk-j-mode-map にキーを定義してみたが,なんと skk-j-mode-on するたびに勝手にキーマップがリセットされる.

仕方無く skk.el を読んでみたところ,関数 skk-setup-j-mode-map-options で skk-try-completion-char (初期設定では "\t") が skk-insert に設定されていることが,C-i が insert となる原因だと突き止めた.TAB キーはその後に skk-comp-wrapper が割り当てられているため,C-i と挙動が異なっているというわけだ.

この問題を解決するには,C-i にも skk-comp-wrapper を割り当てる.以下のコードを .emacs に書けばOK.

(defadvice skk-setup-j-mode-map-options (after c-i-comp-wrapper2 activate)
  (define-key skk-j-mode-map (kbd "C-i") #'skk-comp-wrapper))

C-i に skk-comp-wrapper を割り当てるコードを,第1引数が after の defadvice によって関数 skk-setup-j-mode-map-options の末尾に追加するコードとなる.

とりあえずこれで DDSKK 使用時の大きな問題が1つ解決した.しかし,DDSKK は様々な重要キーを奪っていくのを本当にどうにかしてほしいものだ.C-j で return-indent できなかったり,ReadOnly ファイルで C-p を入力してもカーソルを移動できなかったり…….DDSKK 常用の道は険しい.