zshのVimモードあれこれ

この記事は新年まで勝手にVim記事を書き続けるの2日目(2010/12/27)です。
adventしたかったけれどもうクリスマス後なので。。


いきなりVimそのものから離れますがzshVimモードです。
zshそのもののすごさ紹介は他に譲りますが
あまり他では見ないVimモードについて触れてみたいと思います。


まずVimモードにあなたのzshを変更しましょう。
"-e"?そんなEmacsモードで大丈夫か?

bindkey -v

これであなたのzshVimによって解き放たれました。
入力を間違えたからといってしても虚しくなるばかりですね。


この状態でコマンドを入力するとき、まずインサートモードで新しい行が開始されます。
インサートモードと言うことは入力が可能ですので"ls"とタイプすれば

ls

と入力されるわけです。あとはするとlsの結果が表示されます。
ここまでは普通ですね。


インサートモードがあるならノーマルモードがあるはずです。
そうEscを押せばインサートモードを抜けてノーマルモードに入ります。
ここからがVimモードの気持ち悪いところです。
左右移動もhlで可能、jkで上下つまりカーソルキー上下での候補選択が可能になります。


では長くコマンドを入力中にもし途中で行頭に移動したくなったら?
もし行末に移動したくなったら?コマンドを途中で切り取りしたくなったら?
これまではemacsキーで

  • C-a(行頭)
  • C-e(行末)
  • C-k(カーソル移行をKillカット)

していたと思いますがVimモードではVimのキーで操作できます。
つまりこうなりますね

  • 0
  • $
  • D

素敵ですね。
ほかにも

  • dd
  • p

など一通りのVimのコマンドが利用できます。


このままでもかなりの気持ち悪さですが
いま何モードかEsc連打しないとわからないのはスマートでありませんね。
zshが本気を出せば表示することが可能です。
色々な方の切り貼り+自分風味で恐縮ですが

#zshプロンプトにモード表示####################################
function zle-line-init zle-keymap-select {
  case $KEYMAP in
    vicmd)
    PROMPT="%{$fg[red]%}[%{$reset_color%}%n/%{$fg_bold[red]%}NOR%{$reset_color%}%{$fg[red]%}]%#%{$reset_color%} "
    ;;
    main|viins)
    PROMPT="%{$fg[red]%}[%{$reset_color%}%n/%{$fg_bold[cyan]%}INS%{$reset_color%}%{$fg[red]%}]%#%{$reset_color%} "
    ;;
  esac
  zle reset-prompt
}
zle -N zle-line-init
zle -N zle-keymap-select

とすることで
f:id:nishikawasasaki:20101227234024p:image
のように現在のモードが表示可能です。
zshの恐ろさですね。


さらにさらにヴィジュアルモードを忘れていました。
こちらはすごい方の力をお借りします。
"\太\古\の\正\規\表\現 zshvimのビジュアルモードを再現-完結編-"
http://zshscreenvimvimpwget.blog27.fc2.com/blog-entry-3.html
こちらの記事を参考に.zshrcへ追加して下さい。
ノーマルモードで"v"入力後にhlで左右に選択してyでyank可能です。


さてこれであなたのzsh
げに恐ろしきVimモードになれたのではないでしょうか。
茨の道ともきくzshVimモード。
明らかにEmacsモードの方が他shで培ったキーバインドで使いやすい気もしますが
試してみてはいかがでしょ