はじめに
先日出社して仕事をしていた際、後輩から「便利なコマンドを見つけたので共有します!」と言われ、「どれどれ?我Linuxコマンドはそれなりに知っておるぞ?」とうかがったところほんとに便利だったのでこの記事に残そうと思いました。良い後輩を持ちました。そして出社もたまには悪くないですね。。
さて、本記事は、bash のコマンド履歴検索を便利に行いたいという願望のある方向けです。コマンドの実行履歴を「あいまい検索・一覧プレビュー・選択」できる環境を作れるようになります。※記事自体はUbuntu / WSL2 の bash を前提にしていますが、他の環境でも考え方は同じです。
筆者環境: WSL2 (Ubuntu) + bash。fzf は apt でインストールしたものを利用してます。
fzf とは
fzf(fuzzy finder)は、コマンドラインで動く汎用のあいまい検索ツールです。標準入力で受け取った行を、インタラクティブに絞り込み・選択できます。
- 高速: 数百万行でもミリ秒単位で処理できるよう最適化されている
- ポータブル: 単一バイナリで動作する
- シェル統合が付属: Bash / Zsh / Fish 向けのキーバインドが同梱されている
シェル統合を有効にすると、次の3つのキーバインドが使えるようになります。
| キー | 動作 |
|---|---|
Ctrl+R |
コマンド履歴をあいまい検索して挿入 |
Ctrl+T |
カレント配下のファイル/ディレクトリを検索して挿入 |
Alt+C |
ディレクトリを検索して cd
|
本記事では、このうち Ctrl+R に絞って解説します。
Ctrl+R を fzf 化すると何が変わるか
bash 標準の Ctrl+R をご存知でしょうか。
bash上でCtrl+R は実行したコマンド履歴を検索できる便利なショートカットです。
しかし、デフォルトでは逐次インクリメンタル検索で「1件ずつ」しか候補を辿れません。機能そのものは便利なのですが、検索時のヒット条件を考えるのが難しく、うろ覚えのコマンドを探すのは大変で、使っていると「もうちょっと便利になればなぁ」という気持ちになります。なって下さい。
しかし、fzf を有効にすることでCtrl+Rを以下の様に進化させることができます。
- 入力した語句にあいまいマッチした履歴が一覧で表示される
- 複数の候補を↑↓で見比べながら選べる
- スペース区切りで複数キーワードのAND検索ができる
「昨日打った、あの docker の長いコマンド…」を数文字で手繰り寄せられます。
インストールとキーバインドの有効化
インストール
# Ubuntu / Debian / WSL2
sudo apt install fzf
# macOS (Homebrew)
brew install fzf
キーバインドを有効化する(.bashrc)
apt 版の fzf は、キーバインド定義ファイルを /usr/share/doc/fzf/examples/ 配下に置きます。これを .bashrc で source すれば Ctrl+R が有効になります。
# fzf のキーバインド有効化設定
source /usr/share/doc/fzf/examples/key-bindings.bash
この1行で が使えるようになります。
※設定後は反映を忘れずに。
source ~/.bashrc
使い方 — あいまい検索の構文
Ctrl+R を押すと検索画面が開きます。ただ文字を打つだけでもあいまいマッチしますが、構文を覚えると精度が上がります。
| 記法 | 意味 | 例 |
|---|---|---|
abc |
あいまいマッチ |
posgre が postgres にヒット |
'word |
完全一致(その語を含む) | 'docker |
^word |
前方一致 | ^git |
word$ |
後方一致 | .log$ |
!word |
除外(含まない) | !test |
foo bar |
AND(スペース区切り) | git commit |
foo | bar |
OR | py$ | rb$ |
例: docker !test ^sudo なら「sudo で始まり、docker を含み、test を含まない」履歴だけに絞り込めます。
おまけ(さらに便利にするカスタマイズ)
外観と挙動を調整する(FZF_DEFAULT_OPTS)
すべての fzf 呼び出しに効くデフォルトオプションです。
export FZF_DEFAULT_OPTS="--height 40% --layout=reverse --border"
-
--height 40%: 画面全体を占有せず下部40%に表示 -
--layout=reverse: 入力欄を上に(一覧が上から並ぶ) -
--border: 枠線を表示
Ctrl+R だけの挙動を調整する(FZF_CTRL_R_OPTS)
Ctrl+R 専用のオプションです。公式でも紹介されている「Ctrl+Y で選択コマンドをクリップボードにコピー」の例が便利です。
export FZF_CTRL_R_OPTS="
--bind 'ctrl-y:execute-silent(echo -n {2..} | clip.exe)+abort'
--color header:italic
--header 'Press CTRL-Y to copy command into clipboard'"
上記の clip.exe は WSL2 向けです。環境に合わせて置き換えてください。
- WSL2:
clip.exe - macOS:
pbcopy - Linux (X11):
xclip -selection clipboardやxsel -b
まとめ
-
fzfはコマンドラインのあいまい検索ツールで、シェル統合によりCtrl+Rを強化できる - 有効化は
.bashrcにsource .../key-bindings.bash(または新版ならeval "$(fzf --bash)")の1行 - あいまい検索の構文(
'^$!とスペース区切りAND)を覚えると絞り込みが速い
参考
- fzf 公式リポジトリ(README / キーバインド / 環境変数の一次情報): https://github.com/junegunn/fzf
- fzf Wiki(設定例・ヒント集): https://github.com/junegunn/fzf/wiki