zshのviキーバインド

zsh、それは「至高のシェル」

最近まで、シェルというものを特別に意識して使用していませんでした。
bashを今まで使用していたのだと思います。
zshは「至高のシェル」らしいです。そんな「至高」という言葉に惹かれたのか ・・・ 現在、zshを使用しています。
そういう単語に弱いんですかね、私は。
さて、zshはまだまだ奥が深いようで・・・使いこなせているかどうかすらわかりません。そんな中、zshにはviキーバインドというものがあるとのことで、普段vimを使用している自分にとっては使用しないわけにはいきません。

keybindを確認

キーバインドを確認するコマンドはbindkey -M [viins|vicmd]です。
viins → vi insertの略でインサート時(通常時)のキーバインド
vicmd → vi commandの略でコマンド時(Escを入力時)のキーバインド
それでは、確認してみます。

bindkey -M viins

とコマンドを打つと

"^A"-"^C" self-insert
"^D" list-choices
"^E"-"^F" self-insert
"^G" list-expand
"^H" vi-backward-delete-char
"^I" expand-or-complete
"^J" accept-line
"^K" self-insert
"^L" clear-screen
"^M" accept-line
"^N" history-beginning-search-forward-end
"^O" self-insert
"^P" history-beginning-search-backward-end
"^Q" vi-quoted-insert
"^R" redisplay
"^S"-"^T" self-insert
"^U" vi-kill-line
"^V" vi-quoted-insert
"^W" vi-backward-kill-word
"^X" self-insert
省略
...

という感じでずらずらと出力されてきます。

同様に、vicmdも確認すると

bindkey -M vicmd
"^D" list-choices
"^G" list-expand
"^H" vi-backward-char
省略
...

以上から、すでに割り当てられているキーと、割りあり当てられていないキーを確認します。

.zshrcに記述

割り当てられていないキーに、push-lineを割り当てます。
zshにはviキーバインドのほかにemacsキーバインドが存在します。このemacsキーバインドでは"Ctrl+q"にpush-lineが割り当てられています。確認方法は、bindkey -M emacs
ここでは、~/.zshrcにキーバインドを記述について紹介します。

# vi keybind
bindkey -v
bindkey -v '^Y' push-line

bindkey -vでemacsキーバインドではなく、viキーバインドを使用するということを明示します。emacsキーバインドを使いたい場合は、bindkey -eとしてください。次の行ですが、bindkey -v "割り当てたいキー" "機能"という形になってます。emacsと同様に"Ctrl+q"に割り当てたかったのですが、すでに割り当てられていたので"Ctrl+y"にしました。vオプションは、インサート時のキーバインドを設定するという意味です。コマンド時のキーバインドを設定したいときは、aオプションを使用します。

何に役立つ?

このpush-lineの使い方の例を紹介します。
長いコマンドを打ち込んでEnterを押す直前に、別のコマンドを使用したい場合があると思います。この場合、消して長いコマンドをもう一度打ち直すのはとても面倒くさいと思います。そんなときに便利なのが、このpush-lineです。
push-lineの機能を直感的にいうと、一時的に現在入力した文字をスタックにぶち込んで(push)、別のコマンドを打ち込んだ後、自動的に引き出して(pull)くれるものです。
これだけの説明だけでは、わかりずらいと思うので、ぜひ一回試してみてください。
emacsキーバインドなら設定は不要なんで。

参考

zshはここで知りました:http://journal.mycom.co.jp/column/zsh/index.html
keybind大変参考になりました:http://d.hatena.ne.jp/teramako/20080122/p2
vi,zshで参照 : http://memo.officebrook.net/20090316.html#p01