Linuxディストリビューションで標準的に採用されているインタラクティブシェルは「bash」だ。bashを使いこなす1つのポイントはショートカットキーにある。本連載の第285回では、こうした観点から、WindowsやMacでよく使われるショートカットキーに似た使い勝手になるようにbashのショートカットキーを設定した。今回、このショートカットキーをzshでも実現する設定を作成した。zshを使う場合には、以下のショートカットキー設定を参考にしていただきたい。

zshを使う 便利ショートカットキーまとめ

~/.zshrcに追加する設定 (Windows Terminal用)

stty start undef                # Free for Ctrl-s
stty stop undef                 # Free for Ctrl-q
stty discard undef              # Free for Ctrl-o

bindkey '^O'        accept-and-hold     # Ctrl-o
bindkey '^[[1;5C'   forward-word        # Ctrl-→
bindkey '^[[1;5D'   backward-word       # Ctrl-←
bindkey '^[[3;5~'   kill-word       # Ctrl-Delete
bindkey '^H'        backward-kill-word  # Ctrl-Backspace
bindkey '^[[1;5F'   kill-line       # Ctrl-End
bindkey '^Q'        quoted-insert       # Ctrl-q

~/.zshrcに追加する設定 (Mac Terminal用)

stty start undef                # Free for Ctrl-s
stty stop undef                 # Free for Ctrl-q
stty discard undef              # Free for Ctrl-o

bindkey '^O'        accept-and-hold     # Ctrl-o
bindkey '^[[1;5C'   forward-word        # Ctrl-→
bindkey '^[[1;5D'   backward-word       # Ctrl-←
bindkey '^[^[[3~'   kill-word       # ESC-Delete
bindkey '^Q'        quoted-insert       # Ctrl-q
キー 操作
「Enter」 コマンドラインの内容を実行し、コマンドラインをクリア。
「Ctrl」+「o」 コマンドラインの内容を実行し、コマンドラインはキープ
該当なし コマンドラインの内容をコメントに変更し、コマンドラインを実行し、コマンドラインをクリア
キー 操作
「→」 カーソルを1文字右へ移動
「←」 カーソルを1文字左へ移動
「Home」 カーソルを行頭へ移動
「End」 カーソルを行末へ移動
「Ctrl」+「→」 カーソルを単語の末尾へ移動、すでに単語の末尾の場合は、次の単語の末尾へ移動
「Ctrl」+「←」 カーソルを単語の先頭へ移動、すでに単語の先頭の場合は、前の単語の先頭へ移動
キー 操作
「→」 カーソルを1文字右へ移動
「←」 カーソルを1文字左へ移動
「Ctrl」+「A」 カーソルを行頭へ移動
「Ctrl」+「E」 カーソルを行末へ移動
「Ctrl」+「→」 カーソルを単語の末尾へ移動、すでに単語の末尾の場合は、次の単語の末尾へ移動
「Ctrl」+「←」 カーソルを単語の先頭へ移動、すでに単語の先頭の場合は、前の単語の先頭へ移動
キー 操作
「Backspace」 カーソルのひとつ左の文字を削除
「Delete」 カーソルのある場所の文字を削除
「Ctrl」+「Backspace」 カーソルのひとつ左の文字から単語頭までを削除
「Ctrl」+「Delete」 カーソルから単語末までを削除
該当なし カーソルのひとつ左の文字から行頭までを削除
「Ctrl」+「End」 カーソルから行末までを削除
キー 操作
「Backspace」 カーソルのひとつ左の文字を削除
「Delete」 カーソルのある場所の文字を削除
「ESC」「Backspace」 カーソルのひとつ左の文字から単語頭までを削除
「ESC」「Delete」 カーソルから単語末までを削除
該当なし カーソルのひとつ左の文字から行頭までを削除
「Ctrl」+「k」 カーソルから行末までを削除
キー 操作
「↑」 コマンド履歴からひとつ前のコマンドを表示(古いほうへ)
「↓」 コマンド履歴からひとつ後のコマンドを表示(新しいほうへ)
「Ctrl」+「r」 インクリメンタルコマンド履歴検索(古いほうへ)
「Ctrl」+「s」 インクリメンタルコマンド履歴検索(新しいほうへ)
キー 操作
キー 操作
「Tab」 補完
キー 操作
該当なし キーボードマクロの記録を開始
該当なし キーボードマクロの記録を終了
該当なし キーボードマクロを実行
キー 操作
「Ctrl」+「_」 アンドゥ
「Ctrl」+「l」 スクリーンクリア
キー 操作
「Ctrl」+「v」 文字をそのまま入力する
「Ctrl」+「q」 文字をそのまま入力する

bashとzsh

bashとzshは提供している機能がよく似ている。完全に同じ機能を提供しているわけではないのだが、主要なところは似たような機能を提供しており、それぞれに固有の機能を使ってシェルスクリプトを作成するといった使い方をするのでなければ、どちらでも同じようなことができると考えておけばよいと思う。

Linuxディストリビューションはbashをデフォルトのインタラクティブシェルに採用する傾向があるが、Macでは今はzshをデフォルトのインタラクティブシェルに採用している。MacからLinuxサーバにログインして使っているのであれば、Macの~/.zshrcに上記設定を追加して、bashと近いショートカットキーが使えるようにしておくと便利だ。

組み込み機器ではzshが使われることも多い。これはbashのライセンスを嫌って代わりの似たような多機能シェルとしてzshが第一候補になるからだろう。いずれにせよ、設定ファイルを記述すれば、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