mozc-modeでもregion-bindings-modeをまともに扱えるようにする

以下のようなEmacs Lispを記述することで解決します(改善の余地がありそう)。

use-packageを使用していますが、使用していない方は適宜読み替えてください。

  1. (defun mozc-mark-escape ()
  2.   "Temporarily disable mozc-mode because of region-bindings-mode."
  3.   (deactivate-input-method)
  4.   (add-hook 'deactivate-mark-hook 'toggle-input-method)
  5.   (add-hook 'input-method-activate-hook
  6.             (lambda ()
  7.               (remove-hook 'deactivate-mark-hook 'toggle-input-method))))
  8.  
  9. ;;--- mozc
  10. ;; apt install emacs-mozc
  11. (use-package mozc-popup)
  12. (use-package mozc
  13.   :bind
  14.   (("C-0" . toggle-input-method))
  15.   :config
  16.   (set-language-environment "Japanese")
  17.   (setq default-input-method "japanese-mozc")
  18.   (setq mozc-candidate-style 'popup)
  19.   (add-hook 'input-method-activate-hook
  20.             (lambda ()
  21.               (add-hook 'activate-mark-hook 'mozc-mark-escape)))
  22.   (add-hook 'input-method-inactivate-hook
  23.             (lambda ()
  24.               (remove-hook 'activate-mark-hook 'mozc-mark-escape))))

事の起こり

タイトルの通り、mozc-modeでregion-bindings-modeがまともに使えなかったことが原因なのですが、もう少し詳しく説明したいと思います。

・ mozc-modeについて

mozc-modeとは、Emacsでmozcによる日本語入力を可能にするモードです。

日本人でEmacsを使用している方はほぼほぼ利用しているのではないでしょうか。

そういうわけで詳細な説明は省きます。

・ region-bindings-modeについて

mozc-modeに比べるとマイナーなパッケージですので少しばかり紹介します。

region-bindings-modeを導入すると、範囲選択中にのみ有効なキーバインドを設定することができます。

あまり嬉しさが伝わらないかもしれないので具体例を挙げます。

例えば、選択している範囲をkill ringに登録するコマンド(kill-ring-saveのこと。いわゆるコピー)はデフォルトで“M-w”に割り当てられていますが、もう少し押しやすいキーに割り当てたいと思ったことはないでしょうか。

そこで、region-bindings-modeを導入します。

  1. (use-package region-bindings-mode
  2.   :config
  3.   (region-bindings-mode-enable))
  4.  
  5. (define-key region-bindings-mode-map (kbd "c") 'kill-ring-save)

これで、範囲選択中に“c”を押すだけでコピーを実行することが出来ます。

そもそも範囲選択中に文字を入力することはないので、CtrlとかMetaとかを組み合わせる必要がないよね?というわけです。

region-bindings-modeは、expand-regionmultiple-cursorsといったパッケージと組み合わせることで更に効力を発揮します。導入されていない方はこれらのパッケージもおすすめです。

・ それで何が問題だったのか

日々ありがたくmozc-modeやregion-bindings-modeを使わせて頂いていたのですが、あることに気が付きました。

範囲選択中に“c”を入力することでコピーを行えるように設定しているのですが、mozc-modeでは全角の“c”が入力されていまい、コピーを行うことが出来ないのです…。

これは不便です。

mozc-modeでregion-bindings-modeの利点を活かすことが全く出来ません。

解決方法

全角文字もキーバインドに登録してしまうとか、やり方は色々あると思いますが、とりあえずシンプルな方法として、mozc-modeで範囲選択が実行されたときのみ入力モードをデフォルトに切り替える方法を考えました。

以下がその記述になります。

  1. (defun mozc-mark-escape ()
  2.   "Temporarily disable mozc-mode because of region-bindings-mode."
  3.   (deactivate-input-method)
  4.   (add-hook 'deactivate-mark-hook 'toggle-input-method)
  5.   (add-hook 'input-method-activate-hook
  6.             (lambda ()
  7.               (remove-hook 'deactivate-mark-hook 'toggle-input-method))))
  8.  
  9. (add-hook 'input-method-activate-hook
  10.             (lambda ()
  11.               (add-hook 'activate-mark-hook 'mozc-mark-escape)))
  12. (add-hook 'input-method-inactivate-hook
  13.             (lambda ()
  14.               (remove-hook 'activate-mark-hook 'mozc-mark-escape)))
  • “input-method-activate-hook”
  • “input-method-inactivate-hook”
  • “activate-mark-hook”
  • “deactivate-mark-hook”

この4つのhookをいい感じに組み合わせることで、mozc-modeで範囲選択が実行されたときのみ入力モードをデフォルトに切り替えることが出来ます。

“input-method-hogehoge-hook”は入力メソッドの有効・無効の切り替わり時に呼ばれるhookで、“hogehoge-mark-hook”は範囲選択の活性・不活性時に呼ばれるhookです。

見て分かる通り、中々トリッキーな記述になってしまいました。

バグの原因になりそうなので、もっと良いやり方があれば教えていただけると助かります。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です