本文へ移動
vast-cowのブログ
前のページへ戻る

Bashの補完がちょっと便利になるAlt-gとReadlineショートカット

この記事を編集

Bashを使っていて、こんなディレクトリがあるとします。

$ ls
aaa-bbb-ccc

このディレクトリに移動したいけれど、名前の先頭の aaa ではなく、途中の bbb だけ覚えている。

つい、

cd bbb<TAB>

とやりたくなりますが、通常のBashのTAB補完は基本的に前方一致なので、これでは aaa-bbb-ccc は補完されません。

そこで使えるのがglobです。

cd *bbb*

* は任意の文字列にマッチするので、aaa-bbb-ccc が該当します。

ただ、ここでもう一つ欲が出ます。

cd *bbb*

と入力した時点で、

cd aaa-bbb-ccc/

に展開して確認してから実行したい。

そんなときに便利なのが Alt-g です。

Alt-g:globを使って補完する

Bashのコマンドライン編集を担当しているReadlineには、glob-complete-word という機能があります。

デフォルトでは Alt-g に割り当てられているので、

cd *bbb*

まで入力して Alt-g を押すと、globにマッチする名前を使って補完できます。

たとえば、

$ cd *bbb*<Alt-g>

から、

$ cd aaa-bbb-ccc/

という具合です。

「名前の一部しか覚えていない」という場面でかなり便利です。

通常のTAB補完と使い分けると、

cd aaa<TAB>       # 先頭を覚えている
cd *bbb*<Alt-g>   # 途中だけ覚えている

という操作ができます。

Ctrl-x *:globをその場で展開する

Alt-g と一緒に覚えておきたいのが、

Ctrl-x *

です。

こちらは glob-expand-word で、globパターンそのものをマッチしたファイル名に展開します。

たとえば、

$ echo *bbb*

と入力して Ctrl-x * を押すと、

$ echo aaa-bbb-ccc

のようになります。

複数マッチする場合には、それらがまとめて展開されます。

感覚的には、

Alt-g      → globを使って「補完」
Ctrl-x *   → globを使って「展開」

と覚えておくと分かりやすいです。

Alt-.:直前のコマンドの最後の引数を再利用する

個人的にBashを使うなら覚えておきたいショートカットの一つが Alt-. です。

たとえば、

mkdir /tmp/very-long-directory-name

を実行した直後に、

cd <Alt-.>

とすると、

cd /tmp/very-long-directory-name

になります。

つまり、直前のコマンドの最後の引数を挿入してくれます。

ファイルを作ってすぐ開く場合などにも使えます。

touch some-very-long-filename.txt
vim <Alt-.>

Alt-. を繰り返し押せば、さらに古いコマンドの末尾引数を遡ることもできます。

Ctrl-r:コマンド履歴を検索する

これは知っている人も多いと思いますが、Ctrl-r も非常に便利です。

押すと過去のコマンドをインクリメンタル検索できます。

たとえば以前実行した、

docker compose exec app bundle exec rails console

をもう一度使いたい場合、矢印キーで延々と履歴を遡る必要はありません。

Ctrl-r を押して、

rails

などと入力すれば、それを含む履歴を探せます。

長いコマンドを頻繁に再利用するなら必須級です。

Ctrl-x Ctrl-e:入力中のコマンドをエディタで編集する

コマンドが長くなってくると、シェルの1行編集ではつらくなることがあります。

そんなときは、

Ctrl-x Ctrl-e

を押します。

すると現在入力しているコマンドを $EDITOR で編集できます。

たとえば、

find . -type f -name '*.log' -mtime +7 ...

のような長いコマンドを組み立てている途中で、

Ctrl-x Ctrl-e

を押せば、設定されている vim や nano などのエディタで編集できます。

保存して終了すると、その内容がシェルに戻されて実行されます。

複雑なワンライナーではかなり便利です。

その他、覚えておくと便利なReadline操作

BashではEmacs風のReadlineキーバインドがデフォルトで使われています。

よく使うものをまとめると次の通りです。

キー動作
Alt-gglobパターンを使って補完
Ctrl-x *globを実際のファイル名に展開
Alt-*補完候補をまとめて挿入
Alt-.過去のコマンドの最後の引数を挿入
Ctrl-rコマンド履歴を検索
Ctrl-x Ctrl-e現在のコマンドをエディタで編集
Ctrl-a行頭へ移動
Ctrl-e行末へ移動
Alt-b1単語戻る
Alt-f1単語進む
Ctrl-wカーソルより前の単語を削除
Alt-dカーソルより後ろの単語を削除
Ctrl-uカーソルより前を削除
Ctrl-kカーソルより後ろを削除
Ctrl-_Undo
Alt-#入力中のコマンドをコメント化して履歴へ入れる

全部覚える必要はありません。

まずは、

Alt-g
Alt-.
Ctrl-r
Ctrl-x Ctrl-e
Ctrl-x *

あたりを覚えておくだけでも、Bashでの操作がかなり楽になります。

TABをglob補完にすることもできる

ちなみにReadlineの設定を変更すれば、Alt-g の glob-complete-word をTABに割り当てることもできます。

~/.inputrc に、

"\t": glob-complete-word

と設定する方法です。

すると、

cd *bbb*<TAB>

という操作が可能になります。

ただし、これは通常のTAB補完を置き換えてしまいます。

普段の、

cd aaa<TAB>

という操作にも影響するため、個人的にはTABは通常補完のまま残し、

通常の補完 → TAB
glob補完    → Alt-g

と使い分ける方が扱いやすいと思います。

まとめ

今回の発見は単純で、

aaa-bbb-ccc/

というディレクトリに対して、

cd *bbb*

まで入力したら、

Alt-g

を押せばglobを利用した補完ができる、というものです。

Bashには、普段TABと矢印キーだけで操作しているとなかなか気づかないReadlineの機能がかなりあります。

特に、

Alt-g          glob補完
Ctrl-x *       glob展開
Alt-.          前の引数を再利用
Ctrl-r         履歴検索
Ctrl-x Ctrl-e  エディタで編集

の5つは、知っておくと日常的なシェル操作で役立ちます。

Bashの操作を速くしたい場合、コマンドやツールを追加するだけでなく、Readlineのキーバインドを調べてみるのもおすすめです。


この記事を編集
この記事を共有:

コメント


前の記事
NetworkManagerのチェックポイント機能(nmcli device checkpoint)の使い方
次の記事
GitHub Pagesで全文検索・コメント対応ブログを構築する