bashを効率良く使っていくためには、ショートカットキーの活用が欠かせない。その取っ掛かりとして、前回はカーソルを移動するためのショートカットキーを取り上げた。その過程で、bashで設定されているショートカットキーを確認する方法を紹介したが、まずはあのコマンドの出力が読めないことには先に進むのが難しい。今回はその部分について説明しよう。
bindコマンドの出力が大きなポイント
前回、bashで設定されているショートカットキーを調べる方法としてbind組み込みコマンドの使い方を紹介した。bindに「-p」を指定して実行することで、現在設定されているショートカットキーを一覧表示させることができる。以下は、Ubuntuで実行した結果だ。
daichi@DESKTOP-5NH8DRT:~$ bind -p | grep -v '^#' | lv | sort -k 2 | uniq | grep -v self-insert | column -t
"\e ": set-mark
"\C-g": abort
"\C-x\C-g": abort
"\e\C-g": abort
"\C-j": accept-line
"\C-m": accept-line
"\C-b": backward-char
"\eOD": backward-char
"\e[D": backward-char
"\C-?": backward-delete-char
"\C-h": backward-delete-char
"\C-x\C-?": backward-kill-line
"\e\C-?": backward-kill-word
"\e\C-h": backward-kill-word
"\e[1;3D": backward-word
"\e[1;5D": backward-word
"\e[5D": backward-word
"\e\e[D": backward-word
"\eb": backward-word
"\e<": beginning-of-history
"\C-a": beginning-of-line
"\eOH": beginning-of-line
"\e[1~": beginning-of-line
"\e[H": beginning-of-line
"\e[200~": bracketed-paste-begin
"\C-xe": call-last-kbd-macro
"\C-]": character-search
"\e\C-]": character-search-backward
"\C-l": clear-screen
"\C-i": complete
"\e\e": complete
"\e!": complete-command
"\e/": complete-filename
"\e@": complete-hostname
"\e{": complete-into-braces
"\e~": complete-username
"\e$": complete-variable
"\C-d": delete-char
"\e[3~": delete-char
"\e\\": delete-horizontal-space
"\e-": digit-argument
"\e0": digit-argument
"\e1": digit-argument
"\e2": digit-argument
"\e3": digit-argument
"\e4": digit-argument
"\e5": digit-argument
"\e6": digit-argument
"\e7": digit-argument
"\e8": digit-argument
"\e9": digit-argument
"\C-x\C-v": display-shell-version
"\C-xA": do-lowercase-version
"\C-xB": do-lowercase-version
"\C-xC": do-lowercase-version
"\C-xD": do-lowercase-version
"\C-xE": do-lowercase-version
"\C-xF": do-lowercase-version
"\C-xG": do-lowercase-version
"\C-xH": do-lowercase-version
"\C-xI": do-lowercase-version
"\C-xJ": do-lowercase-version
"\C-xK": do-lowercase-version
"\C-xL": do-lowercase-version
"\C-xM": do-lowercase-version
"\C-xN": do-lowercase-version
"\C-xO": do-lowercase-version
"\C-xP": do-lowercase-version
"\C-xQ": do-lowercase-version
"\C-xR": do-lowercase-version
"\C-xS": do-lowercase-version
"\C-xT": do-lowercase-version
"\C-xU": do-lowercase-version
"\C-xV": do-lowercase-version
"\C-xW": do-lowercase-version
"\C-xX": do-lowercase-version
"\C-xY": do-lowercase-version
"\C-xZ": do-lowercase-version
"\eA": do-lowercase-version
"\eB": do-lowercase-version
"\eC": do-lowercase-version
"\eD": do-lowercase-version
"\eE": do-lowercase-version
"\eF": do-lowercase-version
"\eG": do-lowercase-version
"\eH": do-lowercase-version
"\eI": do-lowercase-version
"\eJ": do-lowercase-version
"\eK": do-lowercase-version
"\eL": do-lowercase-version
"\eM": do-lowercase-version
"\eN": do-lowercase-version
"\eP": do-lowercase-version
"\eQ": do-lowercase-version
"\eR": do-lowercase-version
"\eS": do-lowercase-version
"\eT": do-lowercase-version
"\eU": do-lowercase-version
"\eV": do-lowercase-version
"\eW": do-lowercase-version
"\eX": do-lowercase-version
"\eY": do-lowercase-version
"\eZ": do-lowercase-version
"\el": downcase-word
"\e\C-i": dynamic-complete-history
"\C-x\C-e": edit-and-execute-command
"\C-x)": end-kbd-macro
"\e>": end-of-history
"\C-e": end-of-line
"\eOF": end-of-line
"\e[4~": end-of-line
"\e[F": end-of-line
"\C-x\C-x": exchange-point-and-mark
Binary file (standard input) matches
"\C-f": forward-char
"\eOC": forward-char
"\e[C": forward-char
"\C-s": forward-search-history
"\e[1;3C": forward-word
"\e[1;5C": forward-word
"\e[5C": forward-word
"\e\e[C": forward-word
"\ef": forward-word
"\eg": glob-complete-word
"\C-x*": glob-expand-word
"\C-xg": glob-list-expansions
"\e^": history-expand-line
"\e#": insert-comment
"\e*": insert-completions
"\e.": insert-last-argument
"\e_": insert-last-argument
"\C-k": kill-line
"\e[3;5~": kill-word
"\ed": kill-word
"\C-n": next-history
"\eOB": next-history
"\e[B": next-history
"\en": non-incremental-forward-search-history
"\ep": non-incremental-reverse-search-history
"\C-o": operate-and-get-next
"\C-x!": possible-command-completions
"\e=": possible-completions
"\e?": possible-completions
"\C-x/": possible-filename-completions
"\C-x@": possible-hostname-completions
"\C-x~": possible-username-completions
"\C-x$": possible-variable-completions
"\C-p": previous-history
"\eOA": previous-history
"\e[A": previous-history
"\C-q": quoted-insert
"\C-v": quoted-insert
"\e[2~": quoted-insert
"\C-x\C-r": re-read-init-file
"\e[0n": redraw-current-line
"\er": redraw-current-line
"\e\C-r": revert-line
"\C-@": set-mark
"\e\C-e": shell-expand-line
"\C-x(": start-kbd-macro
"\e&": tilde-expand
"\et": transpose-words
"\C-_": undo
"\C-x\C-u": undo
"\C-u": unix-line-discard
"\C-w": unix-word-rubout
"\eu": upcase-word
"\C-z": vi-editing-mode
"\C-y": yank
"\e.": yank-last-arg
"\e_": yank-last-arg
"\e\C-y": yank-nth-arg
"\ey": yank-pop
daichi@DESKTOP-5NH8DRT:~$
より厳密に言うと、「bind -p」は「readline」キーとそのキーに関連付けられているreadline関数を一覧表示するbashの組み込みコマンド、ということになる。左側に出力されているのがキー(ショートカットキー)であり、右側に表示されているのが関数の名前だ。
つまり、bashにおいてショートカットキーを使いこなすということは、この「bind -p」の出力を覚えるのと同じということになる。覚えにくければ割り当てを変更して覚えやすいショートカットキーにしてしまうことも可能だ。
どのような処理を行うのかは、関数名からある程度推測することができる。そして実際にショートカットキーを入力してみれば動作がわかるはずだ。このように、今後は「bind -p」の出力を見てはショートカットキーを習得していく、という作業を繰り返してく。ショートカットキーを忘れた場合にも、「bind -p」と入力すれば再確認できるのだ。
問題は、「bind -p」で出力される左側のキーが読めないということだ。
「bind -p」の左側のキーを読む方法
「bind -p」の左側の出力を読むには、まず次の書き方を理解する必要がある。
キー表記 | 対応キー |
---|---|
\C-何か | 「Ctrl」+「何か」 |
\e何か | 「ESC」「何か」 |
「\C-何か」という表記は、「Ctrl」キーを押しながら別のキーを押す、という操作を意味している。たとえば「Ctrl-g」であれば、「Ctrl」キーを押しながら「G」キーを押す、という処理になる。
もう一つの「\e何か」という表記は、「ESC」キーを押して離した後に別のキーを押す、という操作を意味している。例えば「\eb」であれば、「ESC」キーを押して離した後に「B」キーを押す、という処理になる。
では「\e[1~」は「ESC」キーを押したあとに順番に[、1、~を押すのかと言うとそうではなく、これは「Home」キーを意味している。「\e」の表記は「ESC」キーを他のキーと組み合わせる場合を表すほか、特定の文字の組み合わせで「Home」「End」「Insert」「Delete」「Page Up」「Page Down」、カーソルキー、ファンクションキー、Ctrl-カーソルキー、Alt-カーソルキーなどを示すようになっている。
上記表記については覚えるのが難しいので、対応表などを使って都度確認する必要がある。次に特にbashの設定で使いそうな対応表をまとめておく。
キー表記 | 対応キー |
---|---|
\e | 「ESC」 |
\e\e | 「ESC」「ESC」 |
\e[1~ | 「Home」 |
\e[2~ | 「Insert」 |
\e[3~ | 「Delete」 |
\e[4~ | 「End」 |
\e[5~ | 「Page Up」 |
\e[6~ | 「Page Down」 |
\eOH | 「Home」 |
\eOF | 「End」 |
\e[H | 「Home」 |
\e[F | 「End」 |
\C-? | 「Ctrl」+「Backspace」 |
\e[11~ | 「F1」 |
\e[12~ | 「F2」 |
\e[13~ | 「F3」 |
\e[14~ | 「F4」 |
\e[15~ | 「F5」 |
\e[17~ | 「F6」 |
\e[18~ | 「F7」 |
\e[19~ | 「F8」 |
\e[20~ | 「F9」 |
\e[21~ | 「F10」 |
\e[23~ | 「F11」 |
\e[24~ | 「F12」 |
\e[A | 「↑」 |
\e[B | 「↓」 |
\e[C | 「→」 |
\e[D | 「←」 |
\eOA | 「↑」 |
\eOB | 「↓」 |
\eOC | 「→」 |
\eOD | 「←」 |
\e[1;5A | 「Ctrl」+「↑」 |
\e[1;5B | 「Ctrl」+「↓」 |
\e[1;5C | 「Ctrl」+「→」 |
\e[1;5D | 「Ctrl」+「←」 |
\e[5A | 「Ctrl」+「↑」 |
\e[5B | 「Ctrl」+「↓」 |
\e[5C | 「Ctrl」+「→」 |
\e[5D | 「Ctrl」+「←」 |
\e[1;3A | 「Alt」+「↑」 |
\e[1;3B | 「Alt」+「↓」 |
\e[1;3C | 「Alt」+「→」 |
\e[1;3D | 「Alt」+「←」 |
\e[3A | 「Alt」+「↑」 |
\e[3B | 「Alt」+「↓」 |
\e[3D | 「Alt」+「←」 |
\e[3C | 「Alt」+「→」 |
\e\e[A | 「Alt」+「↑」 |
\e\e[B | 「Alt」+「↓」 |
\e\e[C | 「Alt」+「→」 |
\e\e[D | 「Alt」+「←」 |
\e\eOA | 「Alt」+「↑」 |
\e\eOB | 「Alt」+「↓」 |
\e\eOC | 「Alt」+「→」 |
\e\eOD | 「Alt」+「←」 |
\e[200~ | 貼り付け開始 |
では「Ctrl-」のほうには上記のような特定のキーへの対応はないのか、ということになるが、「Ctrl」キーにも似たようなものがある。「Backspace」「Tab」「Enter」は次のように「\C-」で表記される。
キー | 内容 |
---|---|
\C-h | 「Backspace」 |
\C-i | 「Tab」 |
\C-j | 「Enter」(厳密にはLF) |
\C-m | 「Enter」(厳密にはCR) |
このような表記になっているのは歴史的な経緯がある。ここでは説明は省くが、このように書くということを把握しておいてもらえればと思う。
後は、「bind -p」の出力を紐解いて整理してく
これで「bind -p」を読み解く準備はできた。後は「bind -p」の出力を意味ごとにグルーピングして、覚えやすいショートカットキーへ整理し、実際に練習して身に付けていくという段階に入る。場合によってはWindowsのほかのアプリケーションとの整合性を取るためにショートカットキーを設定するということも出てくるだろう。
「bind -p」の出力を読み解くための対応表は次回以降に紹介するので、その対応表を参考にしていただきたい。本稿をブックマークするか、スクリーンショットを撮るなどしておいてもらうとよいだろう。
ショートカットキーはともかく覚えて使うことで効果が発揮される。それを助けるコマンドが「bind -p」であり、その出力を理解するための対応表だ。ぜひとも活用してもらえればと思う。
付録
キー | 操作 |
---|---|
「→」 | カーソルを1文字右へ移動。 |
「←」 | カーソルを1文字左へ移動。 |
「Home」 | カーソルを行頭へ移動。 |
「End」 | カーソルを行末へ移動。 |
「Ctrl」+「→」 | カーソルを単語の末尾へ移動、すでに単語の末尾の場合は、次の単語の末尾へ移動。 |
「Ctrl」+「←」 | カーソルを単語の先頭へ移動、すでに単語の先頭の場合は、前の単語の先頭へ移動。 |