fzf 入門 - 履歴・ファイルをあいまい検索で爆速に

fzf 入門 - 履歴・ファイルをあいまい検索で爆速に

fzf とは?

結論: fzf は標準入力のリストを対話的にあいまい検索し、選んだ行を標準出力に返す UNIX フィルタ。履歴・ファイル・プロセスなど「一覧から 1 つ選ぶ」操作をすべて高速化する。

fzf(fuzzy finder)は、コマンドラインで動く汎用のあいまい検索ツールである。動作原理はシンプルで、次の 3 ステップに尽きる。

  1. 標準入力(stdin)から行のリストを受け取る
  2. 入力欄に打った文字で部分一致・あいまい一致しながら候補を絞り込む
  3. 確定した行を標準出力(stdout)に書き出す

この「stdin を受けて stdout に返す」という性質のおかげで、fzf はあらゆるコマンドと組み合わせられる。find | fzfps -ef | fzfgit log | fzf ——どんな一覧でも、その場で絞り込んで 1 行(または複数行)を選べる。

この記事で身につくこと

  • CTRL-R / CTRL-T / ALT-C の 3 大キーバインドで日常操作を爆速化する
  • あいまい検索の拡張構文(完全一致・前方一致・否定)を使い分ける
  • --preview で中身を見ながら選ぶ実務レシピを書く

前提(対象環境)

  • OS: Linux(Ubuntu / RHEL 系)/ macOS
  • シェル: bash または zsh
  • fzf バージョン: 0.48.0 以降を推奨(fzf --bash 等の統合フラグが使える)

fzf をインストールするには?

結論: ディストリのパッケージ管理(apt / dnf / brew)が最も手軽。最新版や全機能が欲しい場合は GitHub の公式インストールスクリプトを使う。

パッケージマネージャ経由が簡単。

# Ubuntu / Debian
sudo apt install fzf

# Fedora / RHEL 系
sudo dnf install fzf

# macOS(Homebrew)
brew install fzf

ディストリ同梱版が古い場合や、キーバインド・補完を確実に入れたい場合は、公式リポジトリから直接インストールする。

git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf
~/.fzf/install

インストールスクリプトは対話形式で、キーバインド・補完・シェル設定への追記を行うか尋ねてくる。基本はすべて y で問題ない。

fzf --version
0.55.0 (cabc3c0)

バージョンが 0.48.0 未満なら、後述のシェル統合は「旧方式(ファイルを source する)」が必要になる。まずは新しい版を入れるのが近道。

シェル統合で 3 つのキーバインドを有効化する

結論: シェル統合を有効化すると CTRL-R(履歴)・CTRL-T(ファイル挿入)・ALT-C(ディレクトリ移動)が使えるようになる。fzf 0.48.0 以降は 1 行追記するだけ。

設定ファイルに次の 1 行を追記する。

# ~/.bashrc(bash)
eval "$(fzf --bash)"
# ~/.zshrc(zsh)
source <(fzf --zsh)

追記後、source ~/.bashrc(または新しいターミナルを開く)で反映される。これで 3 つのキーバインドが有効になる。

キー 動作
CTRL-R コマンド履歴をあいまい検索して挿入
CTRL-T カレント配下のファイル/ディレクトリを選んでコマンド行に挿入
ALT-C サブディレクトリを選んでその場で cd

最も恩恵が大きいのは CTRL-R である。標準の CTRL-R(逐次インクリメンタル検索)と違い、うろ覚えの単語を順不同で入れても候補が一覧表示され、上下キーで選べる。

fzf 0.48.0 未満の場合

fzf --bash フラグは使えない。代わりにインストール時に生成された設定ファイルを source する(パスは環境により異なる)。

# 例: git clone 方式でインストールした場合
[ -f ~/.fzf.bash ] && source ~/.fzf.bash

なぜ fzf の検索は速いのか?あいまい検索の構文

結論: fzf は既定でスペース区切りの全単語 AND 一致+あいまい一致。記号を足せば完全一致・前方/後方一致・否定・OR も指定でき、絞り込みの精度を細かく制御できる。

入力欄では、文字を順不同・飛び飛びで打っても一致する(例: akoawk-oneliners にヒット)。さらに記号で一致モードを切り替えられる。

| 入力例 | 意味 | | ---------- | --------------------------------------------- | --------------------------------- | | git push | gitpush の両方を含む(AND・あいまい) | | 'wild | wild完全一致で含む(あいまい無効) | | ^core | core始まる | | .md$ | .md終わる | | !test | test含まない(否定) | | ^src | ^app | src または app で始まる(OR) |

# 拡張子 .log で終わり、archive を含まないファイルだけ絞り込む
find . -type f | fzf --query "'.log$ !archive"

--query(短縮 -q)で初期クエリを与えられる。スクリプトから「ある程度絞った状態」で起動したいときに便利。

どう実務で使うのか?(実践レシピ)

結論: $(... | fzf) をコマンド置換に埋め込むのが基本形。vim で開く・プロセスを kill する・git ブランチを切り替える、といった「選んで実行」が 1 行で書ける。

ファイルを選んで vim で開く

vim "$(fzf)"

プロセスを選んで kill する

kill -9 "$(ps -ef | fzf | awk '{print $2}')"

git ブランチを選んでチェックアウト

git checkout "$(git branch --all | fzf | tr -d ' *')"

ディレクトリを選んで移動(ALT-C を使わない場合)

cd "$(find . -type d | fzf)"

複数選択したいときは -m--multi)を付け、TAB でマークする。選んだ全行が改行区切りで出力される。

# 複数ファイルをまとめて削除候補に
rm -i $(fzf -m)

プレビューウィンドウで中身を確認しながら選ぶ

結論: --preview に「選択中の行を引数に取るコマンド」を渡すと、右側に中身が表示される。プレースホルダ {} が現在の候補に置き換わる。

ファイル選択時に中身を覗けると、選び間違いが激減する。

# 選択中ファイルの中身を表示
fzf --preview 'cat {}'

# bat があれば色付きでプレビュー(行番号・シンタックスハイライト)
fzf --preview 'bat --color=always {}'

{} が「いま選択している行」に展開される。git log と組み合わせると、コミットを選びながら差分を確認できる。

git log --oneline | fzf --preview 'git show --color=always {1}'

{1} は選択行の 1 番目のフィールド(=コミットハッシュ)。プレビュー内でフィールド指定ができる。

よく使うオプションと環境変数

結論: 見た目は --height / --layout=reverse / --border で整える。既定の動作は FZF_DEFAULT_OPTSFZF_DEFAULT_COMMAND に一度書いておくと全コマンドへ反映される。

よく使うオプション

  • --height 40%: 画面全体を占有せず、下から 40% にウィンドウを表示
  • --layout=reverse: 入力欄を上、候補を下に表示(上から読める)
  • --border: 枠線を付ける
  • --multi / -m: TAB で複数選択
  • --preview 'cmd {}': プレビューウィンドウ

環境変数で既定値を固定する

# ~/.bashrc などに追記
export FZF_DEFAULT_OPTS='--height 40% --layout=reverse --border'

# 候補生成コマンドを ripgrep / fd に差し替え(.gitignore 尊重・隠しファイル除外)
export FZF_DEFAULT_COMMAND='fd --type f --hidden --exclude .git'

FZF_DEFAULT_COMMAND は、引数なしで fzf を起動したとき・CTRL-T のときの候補生成に使われる。fdrg --files を指定すると .gitignore を尊重した高速な一覧になる。

FZF_DEFAULT_COMMAND に指定したコマンド(fd / rg 等)が未インストールだと、fzf 起動時に候補が空になる。エイリアスではなく実体のあるコマンド名を指定すること。

コピペ用: 最初に入れる設定

# ~/.bashrc
eval "$(fzf --bash)"
export FZF_DEFAULT_OPTS='--height 40% --layout=reverse --border'

これだけで CTRL-R / CTRL-T / ALT-C と、見やすい既定レイアウトが揃う。

まとめと次に読む

fzf は「一覧から 1 つ選ぶ」というコマンドライン作業を丸ごと高速化する。まず CTRL-R の履歴検索から使い始め、慣れたら --preview やコマンド置換で自分のワークフローに組み込むとよい。