AI

fzfの使い方完全ガイド【インストールから応用まで】

fzfの使い方完全ガイド【インストールから応用まで】

ターミナルでの作業中、必要なファイルやコマンド、Gitブランチを探すのに時間がかかっていませんか? ls -laR | grephistory | grep を何度も実行し、手動で目当ての情報を探し出す。そんな手間はもう必要ありません。

もし、数文字入力するだけで目的の候補が絞り込まれ、キーボード操作だけでサッと選択できたらどうでしょうか。まるで魔法のように、ターミナルでの操作が劇的に快適になるツールがあります。それが「fzf」です。

この記事では、fzfの導入から基本的な使い方、そして実際の開発現場で役立つ応用例まで、網羅的にご紹介します。fzfを使いこなし、あなたのターミナル作業を次のレベルへ引き上げましょう。

fzfとは

fzfは「Fuzzy Finder」の略で、ターミナルのあらゆる選択をファジー検索化する汎用的なコマンドラインツールです。数文字の曖昧な入力から、関連性の高い候補を瞬時に見つけ出し、対話的に選択できます。

このツールは、プログラマーが日常的に直面する「大量の候補の中から目的のものを素早く見つけたい」というニーズから生まれました。ファイルリスト、コマンド履歴、プロセスID、Gitブランチなど、リスト形式で表示されるあらゆる情報を対象に、直感的で高速な検索・選択体験を提供します。

fzfは以下のハイライトを持っています。

  • ポータブル:単一のバイナリファイルとして配布され、簡単にインストールできます。
  • 高速:数百万もの項目をミリ秒単位で処理できるよう最適化されています。
  • プログラマブル:イベント駆動アーキテクチャを持ち、カスタムのターミナルインターフェースやワークフローを構築できます。
  • バッテリー付属:Bash、Zsh、Fish、Nushell、Vim、Neovimとの統合機能が標準で提供されます。

これにより、シェルスクリプトをリッチなターミナルアプリケーションへと変えるビルディングブロックとなります。

インストール方法

fzfのインストールは非常に簡単です。お使いのOSに合わせて、以下のいずれかの方法を選んでください。

macOS / Linux の場合(Homebrew)

macOSまたはLinux環境でHomebrewが利用できる場合、以下のコマンドでインストールできます。

brew install fzf

インストール後、シェル連携を設定する必要があります。キーバインディングやファジー補完を有効にするためです。

$(brew --prefix)/opt/fzf/install

このコマンドは、対話形式でシェルの設定ファイル(.bashrc.zshrcなど)に設定を書き込むか尋ねます。全て「y」で答えて進めるのが一般的です。

Linux の場合(パッケージマネージャー)

多くのLinuxディストリビューションでは、パッケージマネージャーを使ってfzfをインストールできます。

例えばDebian/Ubuntu系の場合は以下の通りです。

sudo apt install fzf

CentOS/Fedora系の場合は以下のコマンドを使用します。

sudo dnf install fzf
# または sudo yum install fzf

インストール後、Homebrewの場合と同様にシェル連携スクリプトを実行してください。

/usr/share/fzf/install

Windows の場合(Scoop / Winget)

Windows環境では、ScoopやWingetといったパッケージマネージャーを利用できます。

Scoopを使用する場合、以下のコマンドを実行します。

scoop install fzf

Wingetを使用する場合、以下のコマンドを実行します。

winget install fzf

Windows Subsystem for Linux (WSL) を利用している場合は、Linux版のインストール方法が適用されます。

基本的な使い方

fzfの真価は、シェル連携によって提供されるキーバインディングにあります。しかし、まずはfzf単体の基本的な使い方から見ていきましょう。

1. 標準入力から選択する

fzfは、パイプ(|)で渡された標準入力を候補リストとして表示します。例えば、現在のディレクトリにあるファイルやディレクトリを一覧表示し、そこから一つを選択できます。

ls | fzf

このコマンドを実行すると、ターミナルにファイルリストが表示されます。数文字入力すると候補が絞り込まれ、Up/Downキーで選択し、Enterキーで確定すると、選択した項目が標準出力に出力されます。

2. コマンド履歴をファジー検索(Ctrl+R)

シェル連携を設定すると、Ctrl+Rを押すだけでコマンド履歴をファジー検索できるようになります。

ターミナルでCtrl+Rを押してみてください。過去に実行したコマンドのリストが表示されます。検索したいキーワードを入力すると、瞬時に候補が絞り込まれます。Enterキーで選択したコマンドがコマンドラインに挿入されます。

3. ファイルをファジー検索(Ctrl+T)

Ctrl+Tは、現在のディレクトリとそのサブディレクトリにあるファイルをファジー検索するショートカットです。

ターミナルでCtrl+Tを押すと、ファイルリストが表示されます。検索したいファイル名を入力し、Enterキーで選択すると、そのファイル名がコマンドラインに挿入されます。例えば、vimと入力してからCtrl+Tを押し、ファイルを選択してEnterを押すと、vim 選択したファイル名が実行されます。

4. ディレクトリをファジー検索して移動(Alt+C)

Alt+Cは、サブディレクトリを含む全てのディレクトリをファジー検索し、選択したディレクトリへ移動(cd)する機能です。

ターミナルでAlt+Cを押してみてください。深い階層のディレクトリでも、数文字入力するだけで目的地にたどり着けます。

これらのキーバインディングはfzfのシェル連携によって提供されるもので、一度体験すると手放せなくなるでしょう。

便利な使い方・応用例 3選

fzfは単なるファイル検索ツールではありません。パイプと組み合わせることで、ターミナルでのあらゆる作業を劇的に改善できます。ここでは、実際の開発シーンで役立つ応用例を3つ紹介します。

1. Gitブランチの高速切り替え

Gitリポジトリで作業していると、頻繁にブランチを切り替えることがあります。ブランチ名の一部を覚えていなくても、fzfを使えば簡単に切り替えられます。

git checkout $(git branch -a --color=never | fzf --height 40% --layout=reverse --preview 'git log --oneline --graph --date=relative --pretty="format:%C(yellow)%h%Creset -%C(red)%d%Creset %s %C(green)(%cr)%Creset %C(blue)<%an>%Creset" $(echo {} | sed "s/.* //")' --preview-window=right:60%)

このコマンドを実行すると、以下のことが実現されます。

  • git branch -a --color=never: ローカルとリモートの全てのブランチを一覧表示します。--color=neverはfzfの表示を乱さないためです。
  • fzf ...: そのブランチリストをfzfに渡し、対話的に選択できるようにします。
  • --height 40%: fzfのウィンドウをターミナルの高さの40%に設定します。
  • --layout=reverse: 候補リストを下から上に表示します。
  • --preview 'git log ...': 選択中のブランチのコミット履歴を右側のプレビューウィンドウに表示します。
  • $(...): fzfで選択されたブランチ名をgit checkoutコマンドの引数に渡します。

これにより、ブランチ名の一部を入力するだけで候補が絞り込まれ、さらに選択中のブランチの履歴をリアルタイムで確認しながら、スムーズにブランチを切り替えられます。

2. Dockerコンテナの選択と実行

Dockerコンテナへのアクセスもfzfで簡素化できます。実行中のコンテナの中から一つを選び、docker execでコマンドを実行する場面を考えてみましょう。

以下の関数を.bashrc.zshrcに追加してください。

dexec() {
    local container_id
    container_id=$(docker ps --format "{{.ID}}\t{{.Names}}\t{{.Image}}" | fzf --height 40% --layout=reverse --header "Select a container" --with-nth "2,3" --preview "docker inspect {1} | grep 'IPAddress'" --preview-window=right:60% | awk '{print $1}')

    if [ -n "$container_id" ]; then
        docker exec -it "$container_id" "$@"
    else
        echo "No container selected."
    fi
}

この関数を追加後、シェルを再読み込みしてからdexec bashのように実行すると、以下の動作をします。

  • docker ps --format ...: 実行中のコンテナのID、名前、イメージ名をタブ区切りで表示します。
  • fzf ...: その情報をfzfに渡し、選択を促します。
  • --with-nth "2,3": fzfの表示では、コンテナ名とイメージ名のみを表示します(検索対象は全て)。
  • --preview "docker inspect {1} | grep 'IPAddress'": 選択中のコンテナのIPアドレスをプレビュー表示します。{1}は選択行の最初のフィールド(コンテナID)を指します。
  • awk '{print $1}': fzfで選択された行から、最初のフィールド(コンテナID)のみを抽出します。
  • docker exec -it "$container_id" "$@": 抽出したコンテナIDを使って、指定されたコマンド(例: bash)を実行します。

これで、コンテナ名の一部を入力するだけで目的のコンテナを選び、簡単にexecで操作できます。

3. プロセスIDを知らずにプロセスを強制終了

アプリケーションが応答しなくなった際、そのプロセスを強制終了したいことがあります。通常はps aux | grep <プロセス名>でPIDを探し、kill <PID>と実行しますが、fzfを使えばこの手順を大幅に短縮できます。

kill -9 $(ps aux | fzf --height 40% --layout=reverse --header "Select a process to kill" --preview "echo {}" --preview-window=right:wrap | awk '{print $2}')

このコマンドを実行すると、以下の動作をします。

  • ps aux: 実行中の全プロセスを一覧表示します。
  • fzf ...: そのプロセスリストをfzfに渡し、対話的に選択できるようにします。
  • --preview "echo {}": プレビューウィンドウに選択中のプロセス情報をそのまま表示します。
  • awk '{print $2}': fzfで選択された行から、2番目のフィールド(PID)のみを抽出します。
  • kill -9 ...: 抽出したPIDを使ってプロセスを強制終了します。

プロセス名の一部を入力するだけで、実行中のプロセスが絞り込まれます。選択してEnterを押すだけで、該当プロセスを強制終了できます。

他ツールとの組み合わせ

fzfは単体で強力ですが、他のCLIツールと組み合わせることでその能力を最大限に発揮します。fzfは「リストを生成するツール」と「リストから選択された項目を処理するツール」の橋渡し役として機能します。

1. findfd との組み合わせ

特定の条件でファイルを検索し、その結果をfzfで絞り込むのは非常に一般的です。findコマンドは強力ですが、冗長になりがちです。より高速で使いやすいfdコマンドと組み合わせると、より快適になります。

# 現在のディレクトリ以下の.mdファイルをfzfで選択し、vimで開く
vim $(fd -e md | fzf)

この例では、fd -e mdで拡張子が.mdのファイルを検索し、その結果をfzfに渡します。fzfでファイルを選択すると、そのパスがvimに渡され、エディタで開かれます。

2. ripgrep (rg) との組み合わせ(プレビュー機能活用)

ripgreprg)は、高速なコード検索ツールです。fzfのプレビュー機能と組み合わせることで、ファイルの内容をリアルタイムで確認しながら検索できます。

以下のエイリアスを.bashrc.zshrcに追加すると便利です。

# 特定のキーワードを含むファイルを検索し、fzfで選択、プレビューで内容を確認
# 例: `rga "TODO"` でプロジェクト内のTODOを検索
rga() {
  RG_PREFIX="rg --column --line-number --no-heading --color=always --smart-case "
  local file
  file=$(
    FZF_DEFAULT_COMMAND="$RG_PREFIX '$1'" fzf --ansi \
                                              --border \
                                              --height 80% \
                                              --layout=reverse \
                                              --preview "bat --color=always {1} --highlight-line {2}" \
                                              --preview-window 'right:wrap' \
                                              --delimiter ':' \
                                              --query "$1"
  ) && [ -n "$file" ] && IFS=':' read -ra selected <<< "$file" && \
  ${EDITOR:-vim} "${selected[0]}" "+${selected[1]}"
}

このrga関数は、指定したキーワードでrgを実行し、その結果をfzfで表示します。

  • --preview "bat --color=always {1} --highlight-line {2}": 選択中のファイルの該当行をbatコマンドでハイライト表示し、プレビューします。{1}はファイルパス、{2}は行番号です。
  • 選択後、vim(またはEDITOR環境変数で指定されたエディタ)で該当ファイルを開き、行番号までジャンプします。

これにより、コードベースを探索する際の効率が飛躍的に向上します。

3. Vim / Neovim プラグイン

fzfはVim/Neovim用のプラグインも提供しています。これにより、エディタ内でfzfの強力なファジー検索機能を利用できます。例えば、プロジェクト内のファイルを検索して開いたり、バッファを切り替えたり、grep結果を検索したりできます。

Vim/Neovimユーザーであれば、プラグインマネージャー(例: vim-plug)を使って導入を検討する価値は十分にあります。

" .vimrc または init.vim に追加
Plug 'junegunn/fzf', { 'do': { -> fzf#install() } }
Plug 'junegunn/fzf.vim'

インストール後、Vim/Neovim内で:Files:Buffers:Rgなどのコマンドが利用できるようになります。

よくある設定・カスタマイズ

fzfは非常に柔軟なカスタマイズが可能です。環境変数FZF_DEFAULT_OPTSを設定することで、fzfが起動するたびに特定のオプションを適用できます。これは.bashrc.zshrcなどのシェル設定ファイルに記述します。

1. プレビューウィンドウの設定

前述の応用例でも登場した--previewオプションは、fzfの強力な機能の一つです。ファイルの選択時などに内容を確認できると非常に便利です。

export FZF_DEFAULT_OPTS="--height 40% --layout=reverse --border --preview 'bat --color=always {} || cat {}' --preview-window=right:60%"

この設定により、fzfを起動するたびに以下のオプションが適用されます。

  • --height 40%: fzfの表示領域をターミナルの高さの40%に制限します。
  • --layout=reverse: 候補リストを下から上に表示します。
  • --border: プレビューウィンドウに枠線を表示します。
  • --preview 'bat --color=always {} || cat {}': 選択中の項目をbat(シンタックスハイライト付きのcat代替)でプレビューします。batがインストールされていない場合はcatで表示します。{}は選択された行全体を表します。
  • --preview-window=right:60%: プレビューウィンドウを右側に、横幅の60%を使用して表示します。

2. カラースキームの変更

fzfの表示色は、--colorオプションで細かく設定できます。好みに合わせてターミナルのテーマに合わせることができます。

export FZF_DEFAULT_OPTS="--color=fg:#bbccdd,bg:#334455,hl:#8899aa,fg+:#ddeeff,bg+:#445566,hl+:#aabbcc,info:#ccddbb,prompt:#ddbbcc,pointer:#bbddcc,marker:#ddccbb,spinner:#ccbbdd,header:#bbccdd"

これは一例ですが、fg(前景色)、bg(背景色)、hl(ハイライト色)など、様々な要素の色をHexコードで指定できます。詳細はfzfのGitHubリポジトリにある「fzf Theme Playground」で試すのがおすすめです。

3. シェル補完のカスタマイズ

fzfはコマンドの引数補完にも利用できます。例えば、killコマンドの引数でプロセスIDを補完する際にfzfを使うように設定できます。

Zshの場合、.zshrcに以下の設定を追加すると、**(ダブルアスタリスク)でfzf補完が起動します。

# Zshの場合
# fzfをデフォルトの補完プロバイダとして設定 (例: cd **)
zstyle ':completion:*' menu select

より詳細なカスタマイズは、fzfの公式READMEの「Customizing fuzzy completion for bash and zsh」セクションを参照してください。

これらの設定は、あなたの.bashrc.zshrcに追記し、シェルを再読み込み(source ~/.bashrcなど)することで適用されます。

今日からできる実行プラン

fzfの導入は、ターミナル作業の効率を向上させるための最初の一歩です。以下の3つのステップで、今日からfzfの恩恵を受け始めましょう。

ステップ1: fzfをインストールする

まずは、あなたの環境にfzfをインストールします。macOSやLinuxであればHomebrewを使うのが最も手軽です。

# macOS / Linux の場合
brew install fzf

Windowsの場合はScoopやWinget、またはWSL経由でLinux版をインストールしてください。

ステップ2: シェル連携を設定する

fzfのインストール後、シェル連携スクリプトを実行してキーバインディングとファジー補完を有効にします。

# Homebrewでインストールした場合
$(brew --prefix)/opt/fzf/install

# Linuxパッケージでインストールした場合 (パスは環境により異なる場合があります)
/usr/share/fzf/install

このスクリプトは、あなたのシェルの設定ファイル(.bashrc.zshrcなど)にfzfの関連設定を追記します。指示に従って「y」を入力していけば問題ありません。

ステップ3: 基本的なキーバインディングを試す

設定が完了したら、新しいターミナルセッションを開き、fzfの基本的なキーバインディングを試してみてください。

  • Ctrl+R: コマンド履歴を検索
  • Ctrl+T: ファイルを検索
  • Alt+C: ディレクトリを検索して移動

これらのショートカットを日常的に使うことから始め、fzfの検索と選択の快適さを体感してください。最初は慣れないかもしれませんが、すぐに手放せないツールになるはずです。

慣れてきたら、この記事で紹介した応用例やカスタマイズに挑戦し、あなた自身のターミナル環境をさらに強化していきましょう。fzfは「ターミナルのあらゆる選択をファジー検索化」することで、あなたの開発体験を一変させるでしょう。

参考文献

広告

-AI