今回からは、bashの解説でまとめたショートカットキーをzshで実現していく。同じショートカットキーが使えれば、bashでもzshでもほぼ同じ感覚で利用できるようになる。また、環境によってはbashがなく、zshしか使えないこともあるので、設定方法を知っておいて損はないはずだ。

bashのショートカットキー設定をzshで実現する(その1)

個々を細かく説明してももう意味がないので、まとめた結果を次に掲載しておく。

キー 操作
「Enter」 コマンドラインの内容を実行し、コマンドラインをクリア
「Ctrl」+「o」 コマンドラインの内容を実行し、コマンドラインはキープ
該当なし コマンドラインの内容をコメントに変更し、コマンドラインを実行し、コマンドラインをクリア

コマンド実行を実現するために~/.zshrcに追加する設定

bindkey '^O'        accept-and-hold     # Ctrl-o
キー 操作
「→」 カーソルを1文字右へ移動
「←」 カーソルを1文字左へ移動
「Home」 カーソルを行頭へ移動
「End」 カーソルを行末へ移動
「Ctrl」+「→」 カーソルを単語の末尾へ移動、すでに単語の末尾の場合は、次の単語の末尾へ移動
「Ctrl」+「←」 カーソルを単語の先頭へ移動、すでに単語の先頭の場合は、前の単語の先頭へ移動
キー 操作
「→」 カーソルを1文字右へ移動
「←」 カーソルを1文字左へ移動
「Ctrl」+「A」 カーソルを行頭へ移動
「Ctrl」+「E」 カーソルを行末へ移動
「Ctrl」+「→」 カーソルを単語の末尾へ移動、すでに単語の末尾の場合は、次の単語の末尾へ移動
「Ctrl」+「←」 カーソルを単語の先頭へ移動、すでに単語の先頭の場合は、前の単語の先頭へ移動

カーソル移動(Windows Terminal/Mac Terminal)を実現するために~/.zshrcに追加する設定

bindkey '^[[1;5C'   forward-word        # Ctrl-→
bindkey '^[[1;5D'   backward-word       # Ctrl-←
キー 操作
「Backspace」 カーソルの1つ左の文字を削除
「Delete」 カーソルのある場所の文字を削除
「Ctrl」+「Backspace」 カーソルの1つ左の文字から単語頭までを削除
「Ctrl」+「Delete」 カーソルから単語末までを削除
該当なし カーソルのひとつ左の文字から行頭までを削除
「Ctrl」+「End」 カーソルから行末までを削除

削除(Windows Terminal)を実現するために~/.zshrcに追加する設定

bindkey '^[[3;5~'   kill-word       # Ctrl-Delete
bindkey '^H'        backward-kill-word  # Ctrl-Backspace
bindkey '^[[1;5F'   kill-line       # Ctrl-End
キー 操作
「Backspace」 カーソルのひとつ左の文字を削除
「Delete」 カーソルのある場所の文字を削除
「ESC」「Backspace」 カーソルのひとつ左の文字から単語頭までを削除
「ESC」「Delete」 カーソルから単語末までを削除
該当なし カーソルのひとつ左の文字から行頭までを削除
「Ctrl」+「k」 カーソルから行末までを削除

削除(Mac Terminal)を実現するために~/.zshrcに追加する設定

bindkey '^[^[[3~'   kill-word       # ESC-Delete

bashからzshへのショートカットキーの移植方法

ショートカットキーの指定方法は、bashもzshもほとんど同じだ。違うのは、使うコマンドが「bind」か「bindkey」かと、ショートカットキーの書き方、指定する関数名/ウィジェット名くらいである。

指定するショートカットキーの書き方については本稿の末尾に付録として掲載しているので、それを参考にしてほしい。なお、Windows TerminalまたはMac Terminal以外のターミナルを使う場合には、それぞれのターミナルに合わせて書き方を調整する必要がある。その場合は、「Ctrl」+「V」で実際にどう書けばよいか調べてから取り組んでみてほしい。

bashの「bind」で指定する関数名と、zshの「bindkey」で指定するウィジェット名に直接の関連はないが、命名規則はよく似ている。似ている名前から探していけば、それほど苦労せずに同じ動きをするものを見つけることができるはずだ。

ただし、bashの関数(正確にはreadlineの関数)と、zshのウィジェット(正確にはzshzleのウィジェット)の全てが1対1で対応するわけではない。いくつかの機能は片方にしか存在していないからだ。本連載では、Linuxディストリビューションでデフォルト採用されていることが多いbashをベースにしているのでbashに対応させる方法を取っているが、「zshで提供されているほかの機能で代替する」という方法もあることは言い添えておく。

付録 Windows Terminal キーとキー表記

キー キー表記
「ESC」 ^[
「ESC」「ESC」 ^[^[
「Home」 ^[[H
「Insert」 ^[[2~
「Delete」 ^[[3~
「End」 ^[[F
「Page Up」 ^[[5~
「Page Down」 ^[[6~
「F1」 ^[OP
「F2」 ^[OQ
「F3」 ^[OR
「F4」 ^[OS
「F5」 ^[O15~
「F6」 ^[O17~
「F7」 ^[O18~
「F8」 ^[O19~
「F9」 ^[O20~
「F10」 ^[O21~
「Alt」+「Home」 ^[[1;3H
「Alt」+「Insert」 ^[[2;3~
「Alt」+「Delete」 ^[[3;3~
「Alt」+「End」 ^[[1;3F
「Alt」+「Page Up」 ^[[5;3~
「Alt」+「Page Down」 ^[[6;3~
「Ctrl」+「Home」 ^[[1;5H
「Ctrl」+「Insert」 ^[[2;5~
「Ctrl」+「Delete」 ^[[3;5~
「Ctrl」+「End」 ^[[1;5F
「Ctrl」+「Page Up」 ^[[5;5~
「Ctrl」+「Page Down」 ^[[6;5~
「↑」 ^[[A
「↓」 ^[[B
「→」 ^[[C
「←」 ^[[D
「Alt」+「↑」 ^[[1;3A
「Alt」+「↓」 ^[[1;3B
「Alt」+「→」 ^[[1;3C
「Alt」+「←」 ^[[1;3D
「Ctrl」+「↑」 ^[[1;5A
「Ctrl」+「↓」 ^[[1;5B
「Ctrl」+「→」 ^[[1;5C
「Ctrl」+「←」 ^[[1;5D
貼り付け開始 ^[[200~
クエリステータスレポート ^[[5n
クエリステータスレポート(応答) ^[[0n
「Backspace」 ^?
「Ctrl」+「Backspace」 ^H
「Tab」 ^I
「Enter」 ^M

付録 Mac Terminal キーとキー表記

キー キー表記
「ESC」 ^[
「ESC」「ESC」 ^[^[
「Home」 なし
「Insert」 なし
「Delete」 ^[[3~
「End」 なし
「Page Up」 なし
「Page Down」 なし
「F1」 ^[OP
「F2」 ^[OQ
「F3」 ^[OR
「F4」 ^[OS
「F5」 ^[O15~
「F6」 ^[O17~
「F7」 ^[O18~
「F8」 ^[O19~
「F9」 ^[O20~
「F10」 なし
「F11」 ^[O23~
「F12」 ^[O24~
「Alt」+「Home」 なし
「Alt」+「Insert」 なし
「Alt」+「Delete」 なし
「Alt」+「End」 なし
「Alt」+「Page Up」 なし
「Alt」+「Page Down」 なし
「Ctrl」+「Home」 なし
「Ctrl」+「Insert」 なし
「Ctrl」+「Delete」 ^[[3;5~
「Ctrl」+「End」 なし
「Ctrl」+「Page Up」 なし
「Ctrl」+「Page Down」 なし
「↑」 ^[[A
「↓」 ^[[B
「→」 ^[[C
「←」 ^[[D
「Alt」+「↑」 なし
「Alt」+「↓」 なし
「Alt」+「→」 なし
「Alt」+「←」 なし
「Ctrl」+「↑」 ^[[A
「Ctrl」+「↓」 ^[[B
「Ctrl」+「→」 ^[[1;5C
「Ctrl」+「←」 ^[[1;5D
貼り付け開始 ^[[200~
クエリステータスレポート ^[[5n
クエリステータスレポート(応答) ^[[0n
「Backspace」 ^H
「Ctrl」+「Backspace」 ^H
「Tab」 ^I
「Enter」 ^M

付録 zsh bindkey 出力キー対応表

キー表記 キー zshzle標準ウィジェット
^[a 「ESC」「a」 accept-and-hold
^[A 「ESC」「A」 accept-and-hold
^J 「Ctrl」+「J」 accept-line
^M 「Ctrl」+「M」 accept-line
^O 「Ctrl」+「O」 accept-line-and-down-history
^[[D 「←」 backward-char
^[OD 「ESC」「O」「D」 backward-char
^B 「Ctrl」+「B」 backward-char
^? 「Backspace」 backward-delete-char
^H 「Ctrl」+「H」 backward-delete-char
^[^? 「ESC」「Backspace」 backward-kill-word
^[^H 「ESC」「Ctrl」+「H」 backward-kill-word
^W 「Ctrl」+「W」 backward-kill-word
^[b 「ESC」「b」 backward-word
^[B 「ESC」「B」 backward-word
^[< 「ESC」「<」 beginning-of-buffer-or-history
^A 「Ctrl」+「A」 beginning-of-line
^[[200~ 貼り付け開始 bracketed-paste
^[C 「ESC」「C」 capitalize-word
^[^L 「ESC」「Ctrl」+「L」 clear-screen
^L 「Ctrl」+「L」 clear-screen
^[^_ 「ESC」「Ctrl」+「_」 copy-prev-word
^[w 「ESC」「w」 copy-region-as-kill
^[W 「ESC」「W」 copy-region-as-kill
^D 「Ctrl」+「D」 delete-char-or-list
^[0 「ESC」「0」 digit-argument
^[1 「ESC」「1」 digit-argument
^[2 「ESC」「2」 digit-argument
^[3 「ESC」「3」 digit-argument
^[4 「ESC」「4」 digit-argument
^[5 「ESC」「5」 digit-argument
^[6 「ESC」「6」 digit-argument
^[7 「ESC」「7」 digit-argument
^[8 「ESC」「8」 digit-argument
^[9 「ESC」「9」 digit-argument
^[l 「ESC」「l」 down-case-word
^[L 「ESC」「L」 down-case-word
^[[B 「↓」 down-line-or-history
^[OB 「ESC」「O」「B」 down-line-or-history
^N 「Ctrl」+「N」 down-line-or-history
^[> 「ESC」「>」 end-of-buffer-or-history
^E 「Ctrl」+「E」 end-of-line
^X^X 「Ctrl」+「X」「Ctrl」+「X」 exchange-point-and-mark
^[z 「ESC」「z」 execute-last-named-cmd
^[x 「ESC」「x」 execute-named-cmd
^[ 「ESC」「 」 expand-history
^[! 「ESC」「!」 expand-history
^X* 「Ctrl」+「X」「*」 expand-word
^[[C 「→」 forward-char
^[OC 「ESC」「O」「C」 forward-char
^F 「Ctrl」+「F」 forward-char
^[f 「ESC」「f」 forward-word
^[F 「ESC」「F」 forward-word
^[c 「ESC」「c」 fzf-cd-widget
^I 「Ctrl」+「I」 fzf-completion
^I 「Tab」 fzf-completion
^T 「Ctrl」+「T」 fzf-file-widget
^R 「Ctrl」+「R」 fzf-history-widget
^[g 「ESC」「g」 get-line
^[G 「ESC」「G」 get-line
^Xr 「Ctrl」+「X」「r」 history-incremental-search-backward
^S 「Ctrl」+「S」 history-incremental-search-forward
^Xs 「Ctrl」+「X」「s」 history-incremental-search-forward
^[p 「ESC」「p」 history-search-backward
^[P 「ESC」「P」 history-search-backward
^[n 「ESC」「n」 history-search-forward
^[N 「ESC」「N」 history-search-forward
^X^N 「Ctrl」+「X」「Ctrl」+「N」 infer-next-history
^[_ 「ESC」「_」 insert-last-word
^[. 「ESC」「.」 insert-last-word
^X^K 「Ctrl」+「X」「Ctrl」+「K」 kill-buffer
^K 「Ctrl」+「K」 kill-line
^U 「Ctrl」+「U」 kill-whole-line
^[d 「ESC」「d」 kill-word
^[D 「ESC」「D」 kill-word
^[^D 「ESC」「Ctrl」+「D」 list-choices
^Xg 「Ctrl」+「X」「g」 list-expand
^XG 「Ctrl」+「X」「G」 list-expand
^[- 「ESC」「-」 neg-argument
^X^O 「Ctrl」+「X」「Ctrl」+「O」 overwrite-mode
^[q 「ESC」「q」 push-line
^[Q 「ESC」「Q」 push-line
^Q 「Ctrl」+「Q」 push-line
^[‘ 「ESC」「’」 quote-line
^[" 「ESC」「”」 quote-region
^V 「Ctrl」+「V」 quoted-insert
^[h 「ESC」「h」 run-help
^[H 「ESC」「H」 run-help
“-“~ 「 」から「~」までの文字 self-insert
\M-^@”-“\M-^? 「Alt」+「Ctrl」+「@」から「Alt」+「Ctrl」+「Backspace」までの入力 self-insert
^[^I 「ESC」「Tab」 self-insert-unmeta
^[^J 「ESC」「Ctrl」+「J」 self-insert-unmeta
^[^M 「ESC」「Ctrl」+「M」 self-insert-unmeta
^[^G 「ESC」「Ctrl」+「G」 send-break
^G 「Ctrl」+「G」 send-break
^@ 「Ctrl」+「@」 set-mark-command
^[\$ 「ESC」「$」 spell-word
^[s 「ESC」「s」 spell-word
^[S 「ESC」「S」 spell-word
^[t 「ESC」「t」 transpose-words
^[T 「ESC」「T」 transpose-words
^_ 「Ctrl」+「_」 undo
^X^U 「Ctrl」+「X」「Ctrl」+「U」 undo
^Xu 「Ctrl」+「X」「u」 undo
^[u 「ESC」「u」 up-case-word
^[U 「ESC」「U」 up-case-word
^[[A 「↑」 up-line-or-history
^[OA 「ESC」「O」「A」 up-line-or-history
^P 「Ctrl」+「P」 up-line-or-history
^X^V 「Ctrl」+「X」「Ctrl」+「V」 vi-cmd-mode
^X^F 「Ctrl」+「X」「Ctrl」+「F」 vi-find-next-char
^[| 「ESC」「|」 vi-goto-column
^X^J 「Ctrl」+「X」「Ctrl」+「J」 vi-join
^X^B 「Ctrl」+「X」「Ctrl」+「B」 vi-match-bracket
^X= 「Ctrl」+「X」「=」 what-cursor-position
^[? 「ESC」「?」 which-command
^Y 「Ctrl」+「Y」 yank
^[y 「ESC」「y」 yank-pop