zsh のコマンドライン編集機能のキーマップを bash に揃えておくと捗るかもよというお話しです。
はじめに
多くのシステムにおいてまだ標準となっていない zsh をあえて使う身としては、bash で出来たことが出来ないと歯がゆいものです。
とくにコマンド入力におけるカーソル移動のインターフェースについてそれは強く感じます。
bashでのカーソル移動
bash でのカーソル移動は GNU readline ライブラリによって提供されていて、emacs ユーザにとってはお馴染みのものです。
キー | readlineコマンド名 | 内容 |
---|---|---|
C-a |
beginning-of-line |
カーソルを行の先頭に移動 |
C-e |
end-of-line |
カーソルを行の末尾に移動 |
C-f |
forward-char |
カーソルを1文字分順方向(右)に移動 |
C-b |
backward-char |
カーソルを1文字分逆方向(左)に移動 |
M-f |
forward-word |
カーソルを1単語分文字順方向(右)に移動 |
M-b |
backward-word |
カーソルを1単語分文字逆方向(左)に移動 |
※C-a は Ctrl と a を同時に押すこと、M-f は ESC (または Ctrl-[ ) を押したあとに f を押すことを意味します |
上記は zsh でも bindkey -e
として emacs キーマップを選択することで使用可能です。
しかし長いコマンドラインを編集している場合には途中にある特定の箇所にカーソルを移動したい事があり vi の f/F に相当する機能が欲しくなります。
viのf/Fに相当するカーソル移動
bash では次のような readline コマンドが定義されています。
キー | readlineコマンド名 | 内容 |
---|---|---|
C-] |
character-search |
入力文字が次に現れる場所にカーソルを移動(viのf ) |
M-C-] |
character-search-backward |
入力文字が前に現れる場所にカーソルを移動(viのF ) |
個人的にこれをよく使うのですが、zsh の emacs キーマップでは定義が異なっているため混乱します。
キー割り当て | ウィジェット | 内容 |
---|---|---|
C-x C-f
|
vi-find-next-char |
viのf
|
なし | vi-find-prev-char |
viのF
|
zshでのキーマップをbashと同じにする
そこで次のように bash と同じキーマップを定義しておくと、今実行しているシェルが bash か zsh であるかを気にせずカーソル移動ができるのでオススメです。
bindkey '^]' vi-find-next-char
bindkey '^[^]' vi-find-prev-char
おわりに
vi と emacs の両方のいいとこ取りの zsh、まさに最強のシェルです。
ちなみに今回の bash のキーバインドについては今年 9月の JPOUG のイベントで話した時に整理したのですが、そのときは zsh のマッピングが分からず不便でした。最近になってこの設定をすることで zsh のコマンド入力におけるストレスが解消しました。