なるべく覚えないbashのキー操作

ターミナル&bashでコマンドラインを編集する時、実にいろいろなキー操作がある。便利そうだからと、あれもこれも覚えようと欲張るのだけど、すぐに忘れてしまう...。もっと厳選して覚えておかなくては。自分にとって必要最小限のキー操作を探ってみた。

  • 勝手な方針

カーソル移動

  • 行頭・行末・単語区切りの移動で、カーソルを素早く動かす。
  • マウスカーソルで指定すれば、クリックした位置にジャンプする。
control-A・E 行頭・行末へ移動
option-←・→ 1単語ずつ移動
option-クリック クリックした位置へ移動

削除

  • 行頭・行末・スペース・単語区切りの削除によって、修正を楽にする。
control-U・K 行頭・行末まで削除
control-W 次のスペースまで削除(左方向のみ)
esc、delete・D 1単語ずつ削除(左・右方向)
control-H・D(delete・fn-delete) 1文字ずつ削除(左・右方向)
      • 凡例:esc、delete・D = escを押した後にdelete、またはescを押した後にDを押す。
      • 凡例:control-U・K = controlを押しながらU、またはcontrolを押しながらKを押す。

操作を戻す

  • 削除したテキストは、ペーストできる。
  • 編集した内容は、確実に元に戻せる。
control-Y 直前に削除したテキストをペーストする
control--
(controlとマイナス)
操作を1つ戻す(undo)
esc、R 操作を全て戻す
      • redoはないのだろうか?

コマンド履歴

↑・↓ コマンド履歴を遡る・進む
esc、shift-<・> コマンド履歴の先頭・末尾(古・新)へ移動
control-R、キーワード コマンド履歴をキーワード検索
検索中にcontrol-R・S キーワード検索を遡る・進む
  • control-Rに続けてキーワードを入力すると、コマンド履歴のキーワード検索が始まる。
  • そして、検索中にcontrol-R・Sを押すと、キーワードを含む履歴だけを自在に行き来できる。
    • 但し、以下の設定をしておく必要がある。

bashのcontrol-Sを有効にする

  • デフォルトのターミナル環境では、二つのcontrol-Sが競合している。
    • 端末のcontrol-S(画面出力を停止する)
    • bashのcontrol-S(コマンド履歴を前方検索する)
  • 優先されるのは「端末のcontrol-S」
  • でも、ほとんど使うことはない...。
  • 「bashのcontrol-S」が使えた方が、遥かに幸せになる。


そこで、端末のcontrol-Sを無効にする。すると、bashのcontrol-Sが有効になる!

  • デフォルトでは、端末設定でstop=^Sとなっている。(^ = control)
$ stty -a
speed 9600 baud; 40 rows; 270 columns;
lflags: icanon isig iexten echo echoe -echok echoke -echonl echoctl
	-echoprt -altwerase -noflsh -tostop -flusho pendin -nokerninfo
	-extproc
iflags: -istrip icrnl -inlcr -igncr ixon -ixoff ixany imaxbel iutf8
	-ignbrk brkint -inpck -ignpar -parmrk
oflags: opost onlcr -oxtabs -onocr -onlret
cflags: cread cs8 -parenb -parodd hupcl -clocal -cstopb -crtscts -dsrflow
	-dtrflow -mdmbuf
cchars: discard = ^O; dsusp = ^Y; eof = ^D; eol = ;
	eol2 = ; erase = ^?; intr = ^C; kill = ^U; lnext = ^V;
	min = 1; quit = ^\; reprint = ^R; start = ^Q; status = ^T;
	stop = ^S; susp = ^Z; time = 0; werase = ^W;
  • それをundefに設定して、stop = と反映されればOK。
$ stty stop undef

$ stty -a
speed 9600 baud; 40 rows; 270 columns;
lflags: icanon isig iexten echo echoe -echok echoke -echonl echoctl
	-echoprt -altwerase -noflsh -tostop -flusho pendin -nokerninfo
	-extproc
iflags: -istrip icrnl -inlcr -igncr ixon -ixoff ixany imaxbel iutf8
	-ignbrk brkint -inpck -ignpar -parmrk
oflags: opost onlcr -oxtabs -onocr -onlret
cflags: cread cs8 -parenb -parodd hupcl -clocal -cstopb -crtscts -dsrflow
	-dtrflow -mdmbuf
cchars: discard = ^O; dsusp = ^Y; eof = ^D; eol = ;
	eol2 = ; erase = ^?; intr = ^C; kill = ^U; lnext = ^V;
	min = 1; quit = ^\; reprint = ^R; start = ^Q; status = ^T;
	stop = ; susp = ^Z; time = 0; werase = ^W;

これで、bashのcontrol-Sが有効になった!

  • 毎回stty stop undefを入力実行するのは面倒なので、~/.bashrcに追記しておくと、bash起動時に自動的に設定される。
...中略...
# 端末の画面出力停止を無効にする
# コマンド履歴の前方検索を有効にするため
stty stop undef

optionキーを活用する

  • ターミナル >> 環境設定 >> 設定 >>「メタキーとしてoptionキーを使用」を有効にしておくことで、escの代わりにoptionも使えるようになる。
    • 以前同様、escも使える。

  • optionを使うと、連続操作が快適になるのだ!

例:

  • 「左方向に1単語ずつ削除する」操作を5回繰り返してみると...
    • esc、deleteは、交互に10回押す必要がある。
esc、delete、esc、delete、esc、delete、esc、delete、esc、delete
    • 一方、option-deleteなら、option押しながらdeleteのみ5回押しで済む!
option押しながら、delete、delete、delete、delete、delete

その他

esc、U・L・C カーソルの右方向の1単語を大文字・小文字・先頭のみ大文字にする
control-L クリア(ターミナルのスクロールエリアの履歴は残る)
command-K クリア(ターミナルのスクロールエリアの履歴も削除)

厳選

以上の操作と設定を、さらに厳選してみた。その基準は...

  • 削除は左方向のみ。(但し、行末まで削除は含む)
  • optionを使う。
  • 独断と偏見。
設定
  • ~/.bashrcに「stty stop undef」を追記する。
  • ターミナル >> 環境設定 >> 設定 >>「メタキーとしてoptionキーを使用」を有効にしておく。
操作
No. キー操作 動作 分類
1 control-A・E 行頭・行末へ移動 カーソル移動
2 option-←・→ 1単語ずつ移動 カーソル移動
3 option-クリック クリックした位置へ移動 カーソル移動
4 control-U・K 行頭・行末まで削除 削除
5 control-W 次のスペースまで削除(左方向) 削除
6 option-delete 1単語ずつ削除(左方向) 削除
7 control-Y 直前に削除したテキストをペーストする 操作を戻す
8 control--
(controlとマイナス)
操作を1つ戻す(undo) 操作を戻す
9 ↑・↓ コマンド履歴を遡る・進む 履歴
10 option-shift-> コマンド履歴の末尾(新)へ移動 履歴
11 control-R、キーワード コマンド履歴をキーワード検索 履歴
12 検索中にcontrol-R・S キーワード検索を遡る・進む 履歴