skk-azikで「っ」が誤爆しやすい問題


skk48に名乗りを上げたとおり、普段は skk を使っているのだけれども、私は単なるskkではなく、 azik を使っている。

azikは簡単に言うと、日本語ローマ字入力(qwertyを想定)に特化したskkの拡張で、以下のような便利なマッピングになっている。

  • 長音(ー)は小指が遠いので「:」で入力できる
  • 促音も二回重ねるのが面倒なので「;」で入力できる
  • 日本語は「子音+an(晩餐はb + an, s + anとか)」、「子音+in(新品はs + in, p + in)」のように 子音 + 母音 + n からなる語が多く含まれるので、「子音 + zで子音+az」「子音 + kで子音+in」といった感じに、少ないキータイプで入力することが可能になる。(なので、 az ikazik )
  • さらに拡張で「 dsです 」「 msます 」のように、さらに簡易にするマッピングもされている(自分はあまりこれは使ってない)

詳細については、公式サイトを見てほしい。 http://hp.vector.co.jp/authors/VA002116/azik/azikinfo.html

ところで、われらがemacsの ddskk にもazik用の設定が搭載されているのだが、なぜかそのマッピングの中に tU が、 にわりあてられているせいで、よく入力中に、意図せず が入力されてしまう問題が発生していた。

もし、私と同じように、 ddskk + azikを利用していて、例えば「疲れた」や「積む」のような、「つ」から始まる感じを入力しようとして、「▽っかれた」のように、頭が ではなく になってしまう人がいたら、同じ症状だと思う。おそらく意識せず Tu と打とうとして、 TU とか tU と入力しているはず。

いろいろ試して以下の設定で改善することが確認できた。私も長年、そもそも何がおきているかわからずに困っていたのだけれど、もし同様に困っている人いたら参考になれば幸いである。

(leaf ddskk
  :straight t
  :bind
  (("C-x C-j" . skk-mode)
   ("C-x j"   . skk-mode))
  :init
  (defvar dired-bind-jump nil)  ; dired-xがC-xC-jを奪うので対処しておく
  :custom
  (skk-use-azik . t)                     ; AZIKを使用する
  (skk-azik-keyboard-type . 'jp106)      ;
  :hook
  (skk-azik-load-hook . my/skk-azik-disable-tU)
  :preface
  (defun my/skk-azik-disable-tU ()
    "ddskkのazikモードが`tU'を`つ'として扱うのを抑制する."
    (setq skk-rule-tree (skk-compile-rule-list
                         skk-rom-kana-base-rule-list
                         (skk-del-alist "tU" skk-rom-kana-rule-list)))))

内容の解説

基本的にドキュメントを読む限り、 skk-rom-kana-rule-list にユーザ独自の設定は入れるので、そこから消せばよいはずなのだが、再コンパイルしないとだめだったのでそのようにしている。ちなみに、 skk-del-alistskk-rom-kana-rule-list から不要なのを削除するための便利な関数である。追加したい場合は普通に append すればよい。

参考: http://mail.ring.gr.jp/skk/200106/msg00009.html

また、普通なら leaf なり、 use-package なりの、 :config ブロックに設定すればよいのだけど、ロード後の処理の影響からか、 azikの設定に上書きされてしまっているように見えたので、 skk-azikの中で最後に呼ばれる skk-azik-load-hook を使って、自前のルール修正関数を呼ぶようにしている。

printデバッグしてみたら、 :config がそもそも呼ばれてなかったようにも見えたのでもうすこし上手いやりかたがあるのかもしれない。


See also