markdown-modeでSKKの変換確定するためにRETするとカーソルが行頭に飛ぶ問題の回避策

markdown-mode 2.1 で SKK 15.2 使ってると、確定しようと思って <return> すると、 確定後にカーソルが行頭に飛んでしまうという問題に遭遇した。 C-j で確定する場合は起こらない。

TL;DR

以下を init.el 相当のファイルに書けば回避出来る。

(defun my--markdown-entery-key-ad (this-func &rest args)
  "markdown-modeでskk-henkan-mode中にエンターすると行頭にカーソルが飛んでしまう問題の対応"
  (if skk-henkan-mode (skk-kakutei)
    (apply this-func args)))
(advice-add #'markdown-enter-key :around #'my--markdown-entery-key-ad)

原因解明に至るまで

<return> = <C-m> では起こり、C-j では起こらないので、まずはキーバインドを確認したところ、 前者は markdown-enter-key という関数が割り当てられていた。

実装は至ってシンプルだった:

(defun markdown-enter-key ()
  "Handle RET according to to the value of `markdown-indent-on-enter'."
  (interactive)
  (newline)
  (when markdown-indent-on-enter
    (markdown-indent-line)))

次に trace-functionmarkdown-enter-keyskk-kakutei をトレースしたところ、 以下のような出力が得られた:

1 -> (markdown-enter-key)
| 2 -> (skk-kakutei)
| 2 <- skk-kakutei: nil
1 <- markdown-enter-key: nil

markdown-enter-key が発動して (newline) が評価された結果、 skk-kakutei が発動して変換確定、その後に markdown-indent-line が呼ばれているのがどうも悪いらしい。

回避方法

これは markdown-enter-key が呼ばれた時に skk-henkan-mode 中だったら、 本来の挙動ではなく skk-kakutei だけを行なうようにする ことで回避出来そうだ。

こういう部分的な挙動の修正には advice を使うといい。 というわけで前述の挙動をそのまま定義すると、冒頭のようなコードになる。

Avatar
yewton
ソフトウェアエンジニア

父親兼エンジニア

comments powered by Disqus

関連項目