* Evilの:q

* ( ´_ゝ`)ノシこの記事はEvil Advent Calender 2014 5日目の記事です

** VimとEvilの違い

Evil話の前置きで「ロードスという名の島がある。・・・」なみに定型句となっている、
「Evil≠Vim
これは時として私のような貧弱な素Vimmerにも牙をむきます。

** VimmerからEvilに移ったら割と体験するイベント

今回はそのひとつexモードのコマンド:q[uit]です。
Evilデフォルトで使うとC-x C-cみたいな挙動になります。
ウィンドウ一つでメモ帳な使い方していれば問題ないですが
今時Emacs使う人はタブで複数のファイルを開くのが普通なので
ウィンドウ丸ごと閉じられて

( ^o^)< Evilすごい!再現度高い!
( ˘⊖˘) 。o(よし!exステートも試してみよう!)
:q |┗(☋` )┓三
( ◠‿◠ )☛ お前はEvilの闇を覗いてしまったのだ
▂▅▇█▓▒░('ω')░▒▓█▇▅▂うわあああああああああああ

となった方は結構いると思います。
Emacsは一度起動したら起動しっぱなしの利用法がメインなので
うっかりでも起きると困りますね。

** ウィンドウ丸ごと閉じる悲劇は回避しよう

とりあえずの回避方法。

init.elに

(evil-ex-define-cmd "q[uit]" 'kill-this-buffer)

動作環境:windows7 Emacs 24.2 Evil 1.0.8

と書けばkill-this-bufferの挙動になるのでウィンドウ丸ごと終了は回避できます。
ただ、これだと現在編集中のファイルが変更未保存だと
保存するかどうか確認メッセージを出してきます。
:qとしては期待通りの挙動ですが、現状:q!でも挙動は同じです。
:q!の挙動が再現できれば便利だと思います。Emacsハッカーさんよろしくお願いします。
(他力本願)

** 意外とキーバインドやコマンド変更は簡単なEvil

Evilは各種キーバインド用関数をノーマルステートだと
(define-key evil-normal-state-map (kbd "使いたいキー")
'使いたい機能の関数。evilのじゃなくてもいい。)

exコマンドは簡単なものなら今回みたいな書き方でいけるようです。
(完全再現ではないですが)
Vimと比べてなら機能が関数名なので
書いて数か月後に、ぱっと見であれ?この設定なんだっけ?な事態は少な目。
便利。