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移行時の設定を書いてみるとよさそうです.

雑感

Emacsの機能を維持したまま,vimの機能(の一部)を導入することが出来ました.
Insert StateではCtrl+bfnp,Normal Stateではhjklが移動で微妙に慣れが必要そうだったり,一長一短なところもあるのでしばらく使用感を確かめてみたいと思います.