LoginSignup
29
28

More than 5 years have passed since last update.

zshでもbashと同じようなカーソル移動を行う

Last updated at Posted at 2014-12-03

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-aCtrla を同時に押すこと、M-fESC(または 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 のコマンド入力におけるストレスが解消しました。

29
28
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
29
28