2019年12月24日火曜日

yatex-modeでmozc-im使用時に,ドル記号入力で直接入力に切り替える.

emacsでyatex-modeを使っているときに,日本語入力中でもドル記号を入力すれば,直接入力に切り替わりドル記号が2つ入力されて欲しい人間です.

mozc.elを使っているときには,mozc-mode-mapを書き換えることで上記に対応していたのですが,mozc-imではキーマップが用意されていません.そこでキーイベントを拾う関数であるmozc-im-input-methodにアドバイスを定義することで上記を解決してみました.
(require 'mozc-im)
(setq default-input-method "japanese-mozc-im")

(defadvice mozc-im-input-method (around insert-dollars (event))
  (if (and (eq major-mode 'yatex-mode)
    (equal event ?$))
      (YaTeX-insert-dollar)
    ad-do-it))
(ad-activate 'mozc-im-input-method)
mozc.elでも,mozc-mode-mapを書き換える方法でなく,これと同様にmozc-handle-eventという関数にアドバイスを定義すれば同じ挙動を示します.


追記:defadviceは古いそうなので,advice-addを使用したものに書き換えてみました.
(require 'mozc-im)
(setq default-input-method "japanese-mozc-im")

(defun mozc-im-input-method--yatex-insert-dollars (orig-fun key)
  (if (and (eq major-mode 'yatex-mode)
    (equal key ?$))
      (YaTeX-insert-dollar)
    (funcall orig-fun key)))
(advice-add 'mozc-im-input-method :around #'mozc-im-input-method--yatex-insert-dollars)


追記:2020/03/13:キー入力の度に毎回メジャーモードの判定をするのもおかしいので,以下のように書き換えました.
(require 'mozc-im)
(setq default-input-method "japanese-mozc-im")

(defun mozc-im-input-method--yatex-insert-dollars (orig-fun key)
  (if (equal key ?$)
      (YaTeX-insert-dollar)
    (funcall orig-fun key)))

(add-hook 'yatex-mode-hook 
   '(lambda ()
      (advice-add 'mozc-im-input-method :around #'mozc-im-input-method--yatex-insert-dollars)))