(macOS)bindでターミナルのショートカット一覧の確認、新規ショートカットの割り当て設定

bindコマンドは、ターミナル上で使えるショートカットの一覧を確認したり、新たにショートカットを割り当てる事が可能です。例えば、コマンド履歴の前方一致検索や行削除にショートカットキーを割り当てる設定を説明しています。

※ 本ページはプロモーションが含まれています。

動作環境と今回の目的

最終更新日:2021/5/29

以前に別ページで、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コマンドでできますので、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(カーソル前の文字を削除)'という機能に割り当てられている事がわかります。
また、"(not bound)"と書いてある行は、キーバインディング(ショートカット)が未設定です。

"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コマンドを実行して、再度確認してみます。
$ 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コマンドの基本的な使い方について、メモ程度に書いておきます。

まず、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オプションでも、関数名とバインディングの設定を一覧表示してくれます。ただ、-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オプション

-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オプション

-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オプション

-sオプションは、現在設定されているマクロとその値のキーシーケンスを一覧表示してくれます。

$ bind -s
"\eD": " > /dev/null"

"bind -p"コマンドでのキーシーケンスの見方

キーシーケンス(キーバインド)
\e[A ↑(上矢印)
\e[B ↓(上矢印
\e[C →(右矢印)
\e[D ←(左矢印)
\ed option(⌥)キー + d
\C controlキー

(広告)Amazonでコマンド操作関連のKindleや書籍を探す。コマンド操作に強くなる!