Evil-modeを使ってみる
Emacsの閲覧モードであるview-modeでいろいろ設定してたら,かなりvimライクな感じになってしまったので,それならいっそのことと思いEmacs上でvimをエミュレートするevil-modeを使ってみました.使用感を確かめて導入するか決めたいと思っているのですが,少し設定をしてみたのでそれをログとして残してみます.
evilではvimの"Mode"のことを"State"と呼びます.これはEmacsのMajor Mode,Minor Modeなどと混合することを避けるためのようです.
InsertステートではEmacsの設定を優先する
vimのモードの概念を導入したいとはいえ,今までのEmacsの動作ができなくなると困ってしまうので,Insert StateではEmacsの設定を全て適用します.基本的には
(setcdr evil-insert-state-map nil)
でInsert StateはEmacsの設定が優先されるのですが,これだけだとNormal Stateに移行するためのEscまで使えなくなってしまうので,'perfect' combination of emacs+evilを参考にEscでNormal Stateに移行できるように設定します.
上のリンクの設定ではjkでもNormal Stateに移行して,jjでjを出力するようになっているのですが,key-chord.elによる同時押しのほうがスマートな気がするのでjj同時押しでNormal Stateに移行するように変更しました.
結局記述した設定ファイルは
(setcdr evil-insert-state-map nil) (define-key evil-insert-state-map [escape] 'evil-normal-state) (key-chord-define evil-insert-state-map "jj" 'evil-normal-state)
となりました.
Normalステートに移行したらIMEをオフにする
Normal Stateではhjklを始めとするctrlキーを伴わない操作をするため,IMEがオフになってくれていたほうが便利です.
# Normal StateでIMEを使うことがあるのでしょうか….
そのNormal Stateに移行するときにIMEをオフにする設定がこちら
(add-hook 'evil-normal-state-entry-hook 'mac-change-language-to-us)
僕がmacのマシンを使っているのでこんなかんじなのですが,'mac-change-language-to-us の部分を変えれば他の環境でも動作するはずです.
# より汎用的なIMEを操作する方法があったら教えて下さい
https://gitorious.org/evil/evil/blobs/raw/doc/doc/evil.pdfのHooksに各種Hookが乗っているので,これを参考に他のState移行時の設定を書いてみるとよさそうです.