curluneの日記

日々試行錯誤。雑多に、気ままに、てきとーに。HoloLens/Oculus Rift,Touchと戯れる日々。

bashのEscはショートカットが割当られているから連打でキャンセルにならないというお話 ひとりぷちアドベントカレンダー2017 12日目

bashEscはキャンセルとはかぎらないよ、というお話です。

危ない事は無いと思うけれど、Esc癖のある方は気をつけましょう。

Escはメタキーの代わり

bashでは、Esc次の入力をメタキーと押した事にする、というものになっています。

Escを押してから>を押すと、メタキーを押しながら>押した場合と同じ扱いです。 そのため、適当にEscを押してからキーを入力すると何らかのショートカットが発動する場合があるのです。

Readline の記法

このセクションでは、emacs 形式の記法を使ってキーストロークを表します。 コントロールキーは C-key で表します (例: C-n は Control-N の意味です)。同様に メタ キーは M-key で表すので、M-x は Meta-X を表すことになります。 (メタ キーがないキーボードでは、M-x は ESC x を表します。つまり、 エスケープキーを押した後に x キーを押します。これは ESC を メタプレフィックス (meta prefix) にする操作です。 M-C-x の組み合わせは、ESC-Control-x つまり、エスケープキーを押した後に、コントロールキーを押したまま x を押すことを意味します。)

Man page of BASH

メタキー周りのショートカット

手元で次のようなショートカットが割当られていました。\eEscです。

bind -p | grep '\\e'
"\e\C-g": abort
"\eOD": backward-char
"\e[D": backward-char
"\e\C-h": backward-kill-word
"\e\C-?": backward-kill-word
"\eb": backward-word
"\e<": beginning-of-history
"\eOH": beginning-of-line
"\e[H": beginning-of-line
"\ec": capitalize-word
"\e\C-]": character-search-backward
"\e\e": complete
"\e!": complete-command
"\e/": complete-filename
"\e@": complete-hostname
"\e{": complete-into-braces
"\e~": complete-username
"\e$": complete-variable
"\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
"\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
"\e>": end-of-history
"\eOF": end-of-line
"\e[F": end-of-line
"\eOC": forward-char
"\e[C": forward-char
"\ef": forward-word
"\eg": glob-complete-word
"\e^": history-expand-line
"\e#": insert-comment
"\e*": insert-completions
"\e.": insert-last-argument
"\e_": insert-last-argument
"\ed": kill-word
"\eOB": next-history
"\e[B": next-history
"\en": non-incremental-forward-search-history
"\ep": non-incremental-reverse-search-history
"\e=": possible-completions
"\e?": possible-completions
"\eOA": previous-history
"\e[A": previous-history
"\e\C-r": revert-line
"\er": revert-line
"\e ": set-mark
"\e\C-e": shell-expand-line
"\e&": tilde-expand
"\et": transpose-words
"\eu": upcase-word
"\e.": yank-last-arg
"\e_": yank-last-arg
"\e\C-y": yank-nth-arg
"\ey": yank-pop

終わりに

Escがキャンセル系でない、というのは若干なれない感じはあります。

けれどもコマンドラインのような、ほとんどのキーが入力用に使われる場面では、同時押し以外でショートカットが割り当てられる、というのは案外便利な物です。