bindコマンドは、ターミナル上で使えるショートカットの一覧を確認したり、新たにショートカットを割り当てる事が可能です。例えば、コマンド履歴の前方一致検索や行削除にショートカットキーを割り当てる設定を説明しています。
※ 本ページはプロモーションが含まれています。
以前に別ページで、macのターミナルアプリのショートカット一覧についてまとめてみました。
(macOS)ターミナルでよく使うショートカット一覧
今回はもう一歩踏み込んで、ターミナルで設定されているショートカット一覧の確認方法や、新たにショートカットキーを割り当てたい時にその設定方法について説明していきます。
ターミナルのショートカット一覧確認や、ショートカットの割り当て設定はbindコマンドでできますので、bindの使い方の説明になります。
■開発やバージョンは以下の通りです。
パソコン:MacBook Pro (Retina, 15-inch, Late 2013)
OS:macOS Big Sur(バージョン11.0.1)
シェル:GNU bash, version 3.2.57
ターミナルで使っているシェルとbashのバージョンの確認方法です。
$ echo "$SHELL"
/bin/bash
$ bash --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin20)
ターミナルで設定されているショートカットを確認したい時や、ショートカットキー設定変更や新規割り当てたい時は、bindコマンドでできますので、bindについて具体的に説明していきます。
まず、-pオプションで関数名(機能)とキーバインディング(ショートカットキー)の設定一覧を見る事ができます。
$ bind -p
"\C-g": abort
"\C-x\C-g": abort
"\e\C-g": abort
"\C-j": accept-line
"\C-m": accept-line
# alias-expand-line (not bound)
# arrow-key-prefix (not bound)
〜
"\C-h": backward-delete-char
〜
"\e\C-y": yank-nth-arg
"\ey": yank-pop
例えば、「"\C-h": backward-delete-char」の一行では、'Control + h'というキーバインディング(ショートカット)は、'backward-delete-char(カーソル前の文字を削除)'という機能に割り当てられている事がわかります。"bind -p"のコマンド結果は多いので、grepであまり関係のない行を除外して表示すると、スッキリして見やすくなると思います。
$ bind -p | grep -v -e "(not bound)" -e "self-insert" -e "do-lowercase-version" -e "digit-argument"
"\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
続いて、ターミナルで使えるショートカットキーを新たに割り当ててみます。試しに、カーソルキーの上下キー(↑↓)でコマンド履歴の検索が前方一致でできるようにしてみます。
例えば、lsと入力した状態でカーソルキーの上下キーを押す事で、過去に実行したlsコマンドを検索して、過去にさかのぼったり、また戻ったりして表示してくれるようになります。
$ ls
それでは設定をしていきますが、まず、現状のhistory関連のショートカット設定を確認します。
$ bind -p | grep history
"\e<": beginning-of-history
"\e\C-i": dynamic-complete-history
"\e>": end-of-history
"\C-s": forward-search-history
# history-and-alias-expand-line (not bound)
"\e^": history-expand-line
# history-search-backward (not bound)
# history-search-forward (not bound)
"\C-n": next-history
"\eOB": next-history
"\e[B": next-history
"\en": non-incremental-forward-search-history
# non-incremental-forward-search-history-again (not bound)
"\ep": non-incremental-reverse-search-history
# non-incremental-reverse-search-history-again (not bound)
"\C-p": previous-history
"\eOA": previous-history
"\e[A": previous-history
"\C-r": reverse-search-history
# vi-fetch-history (not bound)
前方一致検索は、"history-search-backward"と"history-search-forward"の2つですが、"(not bound)"と未設定になっていますので、この2つのキーバインディングを設定します。
そのための設定コマンドが下の2行です。
$ bind '"\e[A": history-search-backward'
$ bind '"\e[B": history-search-forward'
"\e[A"がカーソルキーの上矢印(↑)で、"\e[B"がカーソルキーの下矢印(↓)です。
コマンドを実行したら、再度history関連のショートカット設定を確認してみます。
$$ bind -p | grep history
"\e<": beginning-of-history
"\e\C-i": dynamic-complete-history
"\e>": end-of-history
"\C-s": forward-search-history
# history-and-alias-expand-line (not bound)
"\e^": history-expand-line
"\e[A": history-search-backward
"\e[B": history-search-forward
"\C-n": next-history
"\eOB": next-history
"\en": non-incremental-forward-search-history
# non-incremental-forward-search-history-again (not bound)
"\ep": non-incremental-reverse-search-history
# non-incremental-reverse-search-history-again (not bound)
"\C-p": previous-history
"\eOA": previous-history
"\C-r": reverse-search-history
# vi-fetch-history (not bound)
"history-search-backward"と"history-search-forward"の2つの行の"(not bound)"がなくなり、それぞれ"\e[A"と"\e[B"に割り当てられている事がわかります。
これで設定できましたので、動作確認をします。何か適当なコマンド、例えばlsと入力してカーソルキーの上下キー(↑↓)を押したら、過去に実行したlsコマンドが表示されるようになるはずです。
また、-rオプションで、指定したキーシーケンスを解除できます。
$ bind -r "\e[A"
$ bind -r "\e[B"
これで再度"bind -p"で確認したら、"history-search-backward"と"history-search-forward"の2つは、"(not bound)"に戻っているはずです。
あとは、ターミナルを新規に起動した時に設定を有効にしたい場合、ホームディレクトリ直下にあるbashの環境設定ファイルの"~/.bashrc"か"~/.bash_profile"に、下の2行を追記すればできます。
bind '"\e[A": history-search-backward'
bind '"\e[B": history-search-forward'
追記して設定をすぐに有効にしたい場合、sourceコマンドを実行します(下は、"~/.bash_profile"に追記した場合です)。$ source ~/.bash_profile
また、"~/.bash_profile"ではなく、ホームディレクトリ直下にある"~/.inputrc"ファイルでもキーバインディングの設定ができます。 .inputrcファイルで設定する場合、以下を追記します。
$if Bash
"\e[A": history-search-backward
"\e[B": history-search-forward
$endif
.inputrcでは、bindコマンドを書く必要はありません。あと、.inputrcで書いた設定はbash以外にも使用されるため、bashにだけ有効化したい場合、"$if Bash"と"$endif"で囲みます。
そして、.inputrcに書いた設定をすぐに有効化する場合、bindコマンドの-fオプションで設定ファイルを読み込めばできます。
$ bind -f ~/.inputrc
ターミナル上でのコマンド履歴の検索で使えるショートカットキーはいくつかあるので、まとめて書いておきます。
関数名 | デフォルトで設定されている ショートカットキー |
説明 |
---|---|---|
reverse-search-history | control + R | インクリメンタルサーチ(逆方向に検索)。直近から過去へ向かって検索する。コマンド履歴から部分検索できる。 |
forward-search-history | control + S | インクリメンタルサーチ(順方向に検索)。過去から直近へ向かって検索する。コマンド履歴から部分検索できる。 |
previous-history | control + P | カーソルキーの↑(上矢印)と同じ。コマンド履歴から1つ前(直近から過去)のコマンドを表示する。 |
next-history | control + N | カーソルキーの↓(下矢印)と同じ。コマンド履歴から1つ後(過去から直近)のコマンドを表示する。 |
history-search-backward | 未設定 | reverse-search-historyの部分検索と違って、前方一致検索。 |
history-search-forward | 未設定 | forward-search-historyの部分検索と違って、前方一致検索。 |
上のテーブルで、"インクリメンタルサーチ(forward-search-history)"のショートカット"control + S"は、初期設定では使えないと思います。
"control + S"は、別機能のコマンド実行時の画面への出力の停止(スクリーンロック)に割り当てられていて、そちらが優先されるためです。
ですので、"control + S"をインクリメンタルサーチで使えるようにするには、スクリーンロックへのショートカットを無効にする必要があります。その設定はsttyコマンドでできますが、別ページで説明してますので、そちらを参考にしてください。
もう1つ、ターミナル上で行削除もショートカットキーでできるようにキーバインディングの設定をしてみます。
行削除に関しては、ショートカット一覧ページで、行の先頭へ移動(control + A)と行末までを削除(control + K)の組み合わせでできると書きましたが、これを1つのショートカット"option(⌥) + Q"でできるように設定します。
行削除の関数名は、"kill-whole-line"です。
$ bind -p | grep whole
# kill-whole-line (not bound)
"(not bound)"になっていますので、現状、行削除のショートカットは設定されていません。$ bind '"\eq": kill-whole-line'
$ bind -p | grep whole
"\eq": kill-whole-line
これで設定できましたので、動作確認をします。ターミナル上で何か適当に入力したら、カーソルがどの位置にあっても"option(⌥) + Q"を押したら、行削除されるはずです。
設定を常に有効にしたい場合は、上のコマンド履歴検索で設定したみたいに、"~/.bash_profile"や"~/.inputrc"ファイルに追記すればできます。
説明で行削除に割り当てた"option(⌥) + Q"はあくまで例です。自分で例を出しておいてあれですが、option(⌥)キーはcommand(⌘)キーの隣りにあって、"command(⌘) + Q"はアプリケーション終了のショートカットなので、"option(⌥) + Q"に何かショートカットを割り当てるのはやめたほうが良いと思います。
それに個人的な考えですが、行削除はデフォルトのショートカットキー操作で、行の先頭へ移動(control + A)と行末までを削除(control + K)の組み合わせでできると書きましたが、慣れればこれで十分だと感じます。
特に、別の環境や他人のパソコンを使ったりするエンジニアの方なら、へんにカスタマイズせずにデフォルトのショートカットキー操作に慣れておいたほうが良いかもしれません。元々未設定"(not bound)"のものにシートカットを割り当てるのは、まだ良いかもしれませんが。このへんの考え方は人それぞれですね。。
bindコマンドの基本的な使い方について、メモ程度に書いておきます。
まず、bindコマンドのヘルプを見たい場合、manコマンドではなくhelpコマンドで見れます。
$ help bind
bind: bind [-lpvsPVS] [-m keymap] [-f filename] [-q name] [-u name] [-r keyseq] [-x keyseq:shell-command] [keyseq:readline-function or readline-command]
Bind a key sequence to a Readline function or a macro, or set
a Readline variable. The non-option argument syntax is equivalent
to that found in ~/.inputrc, but must be passed as a single argument:
bind '"\C-x\C-r": re-read-init-file'.
bind accepts the following options:
-m keymap Use `keymap' as the keymap for the duration of this
command. Acceptable keymap names are emacs,
emacs-standard, emacs-meta, emacs-ctlx, vi, vi-move,
vi-command, and vi-insert.
-l List names of functions.
-P List function names and bindings.
-p List functions and bindings in a form that can be
reused as input.
-r keyseq Remove the binding for KEYSEQ.
-x keyseq:shell-command Cause SHELL-COMMAND to be executed when
KEYSEQ is entered.
-f filename Read key bindings from FILENAME.
-q function-name Query about which keys invoke the named function.
-u function-name Unbind all keys which are bound to the named function.
-V List variable names and values
-v List variable names and values in a form that can
be reused as input.
-S List key sequences that invoke macros and their values
-s List key sequences that invoke macros and their values
in a form that can be reused as input.
-Pオプションでも、関数名とバインディングの設定を一覧表示してくれます。ただ、-pオプションの方が見やすいですね。
$ bind -P | grep history
beginning-of-history can be found on "\e<".
dynamic-complete-history can be found on "\e\C-i".
end-of-history can be found on "\e>".
forward-search-history can be found on "\C-s".
history-and-alias-expand-line is not bound to any keys
history-expand-line can be found on "\e^".
history-search-backward can be found on "\e[A".
history-search-forward can be found on "\e[B".
〜
-lオプションは、関数名のみ一覧表示してくれます。
$ bind -l | grep history
beginning-of-history
dynamic-complete-history
end-of-history
forward-search-history
history-and-alias-expand-line
history-expand-line
history-search-backward
history-search-forward
〜
-vオプションは、bashの設定についての変数名と値を一覧表示してくれます。
$ bind -v
set bind-tty-special-chars on
set blink-matching-paren on
set byte-oriented off
set completion-ignore-case off
〜
-sオプションは、現在設定されているマクロとその値のキーシーケンスを一覧表示してくれます。
$ bind -s
"\eD": " > /dev/null"
キーシーケンス(キーバインド) | |
---|---|
\e[A | ↑(上矢印) |
\e[B | ↓(上矢印 |
\e[C | →(右矢印) |
\e[D | ←(左矢印) |
\ed | option(⌥)キー + d |
\C | controlキー |