mcpField
F
fzf

fzf

公式おすすめAgent-ready
github.com開発ツール83.9kfzf3 日前に更新
リポジトリ公式サイト

fzf について

fzf は汎用ファジー検索ツールで、ファイル、コマンド履歴、プロセスを高速かつインタラクティブに検索できます。find . -type f | fzf でファイル検索、history | fzf で履歴コマンド検索し、コーディングエージェントワークフローに統合します。

主な機能

  1. 01ファジーパターンマッチングでファイルリストを素早く検索・フィルタリングする
  2. 02コマンド履歴からインタラクティブに検索して以前のコマンドを再実行する
  3. 03Unix パイプと組み合わせてあらゆるデータソースを検索する

活用シーン

  1. 01コーディングエージェントがプロジェクトファイルを素早く特定・選択する
  2. 02開発者がコマンド履歴から以前のコマンドを検索・再利用する
  3. 03他のツールとの統合でインタラクティブなデータクエリワークフローを構築する

インストール

OS またはパッケージマネージャーを選び、コマンドをターミナルで実行します。

$
brew install fzf

インストール後にfzf --versionを実行して確認します。

コマンド例

よく使うコマンドを使う順に並べています。

01
find . -type f | fzf
02
history | fzf

詳細

翻訳後に原文が更新されています。最新の内容は原文をご確認ください。

fzf - コマンドライン用ファジーファインダー ビルド状況 バージョン ライセンス コントリビューター スポンサー スター


fzfグッズ

fzfへの愛を表現しましょう――Tシャツ、マグカップ、ステッカーを販売中です!

commitgoods.com/collections/fzf


fzfは、汎用のコマンドライン用ファジーファインダーであり、対話型ターミナルツールキットです。

README の画像

ファイルの選択、コマンド履歴の閲覧、データのプレビュー、ファジーマッチングによる複雑なデータセットの検索、カスタムメニューやワークフローの作成など、fzfはシェルスクリプトを高機能なターミナルアプリケーションに変えるための構成要素を提供します。

特長

  • ポータブル // インストールしやすい単一のバイナリとして配布
  • 高速 // 数百万件の項目をミリ秒単位で処理できるよう最適化
  • プログラム可能 // カスタムのターミナルインターフェースやワークフローを構築するためのイベント駆動型アーキテクチャ
  • 必要な機能を標準搭載 // Bash、Zsh、Fish、Nushell、Vim、Neovimとの統合機能を搭載

目次

インストール

Homebrew を使用する

Homebrew(macOS または Linux)を使って fzf をインストールできます。

brew install fzf

重要

シェル統合(キーバインドとファジー補完)のセットアップ方法については、 以下の手順を参照してください。

fzf は MacPorts 経由でも利用できます:sudo port install fzf

Mise を使用する

miseを使って fzf をインストールできます。

mise use -g fzf@latest
Linux パッケージ
パッケージマネージャーLinux ディストリビューションコマンド
APKAlpine Linuxsudo apk add fzf
APTDebian 9+/Ubuntu 19.10+sudo apt install fzf
Condaconda install -c conda-forge fzf
DNFFedorasudo dnf install fzf
NixNixOS などnix-env -iA nixpkgs.fzf
PacmanArch Linuxsudo pacman -S fzf
pkgFreeBSDpkg install fzf
pkginNetBSDpkgin install fzf
pkg_addOpenBSDpkg_add fzf
PortageGentooemerge --ask app-shells/fzf
Spackspack install fzf
XBPSVoid Linuxsudo xbps-install -S fzf
ZypperopenSUSEsudo zypper install fzf

重要

シェル統合(キーバインドとファジー補完)の設定方法については、 以下の手順を参照してください。

パッケージ状況

Windows パッケージ

Windows では、fzf は Chocolatey、Scoop、 Winget、MSYS2 からインストールできます。

パッケージマネージャーコマンド
Chocolateychoco install fzf
Scoopscoop install fzf
Wingetwinget install fzf
MSYS2 (pacman)pacman -S $MINGW_PACKAGE_PREFIX-fzf
git を使用する

または、このリポジトリを任意のディレクトリに「git clone」して、 install スクリプトを実行できます。

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

install スクリプトは、シェル設定ファイルに行を追加して $PATH を変更し、シェル統合を設定します。

バイナリリリース

公式の fzf バイナリは、リリースページからダウンロードできます。

シェル統合の設定

シェルの設定ファイルに次の行を追加します。

  • bash
    # Set up fzf key bindings and fuzzy completion
    eval "$(fzf --bash)"
    
  • zsh
    # Set up fzf key bindings and fuzzy completion
    source <(fzf --zsh)
    
  • fish
    # Set up fzf key bindings
    fzf --fish | source
    
  • Nushell — Nushell は source へのパイプに対応していないため、インストール スクリプトによってオートロードディレクトリにファイルが生成されます。インストールスクリプトを 使用しなかった場合は、手動で設定できます。
    # Generate the integration script
    mkdir ($nu.default-config-dir | path join "autoload")
    fzf --nushell | save -f ($nu.default-config-dir | path join "autoload" "_fzf_integration.nu")
    

メモ

--bash、--zsh、--fish、--nushell オプションは、最近のバージョンの fzf でのみ 利用できます。古いバージョンの fzf を使用している場合や、より細かく制御したい場合は、 /shell ディレクトリ内の個別のスクリプトファイルを source できます。ファイルの 場所は、使用するパッケージマネージャーによって異なる場合があります。 詳細については、パッケージのドキュメントを参照してください。 (例:apt show fzf)

ヒント

スクリプトを source する際に、対応する *_COMMAND 変数を空の文字列に設定すると、 CTRL-T、CTRL-R、または ALT-C のバインドを無効にできます。たとえば、CTRL-R と ALT-C を 無効にするには、次のようにします。

  • bash: FZF_CTRL_R_COMMAND= FZF_ALT_C_COMMAND= eval "$(fzf --bash)"
  • zsh: FZF_CTRL_R_COMMAND= FZF_ALT_C_COMMAND= source <(fzf --zsh)
  • fish: fzf --fish | FZF_CTRL_R_COMMAND= FZF_ALT_C_COMMAND= source
  • nushell: env.nu に次の行を追加します。 $env.FZF_CTRL_R_COMMAND = ""; $env.FZF_ALT_C_COMMAND = ""

スクリプトを source した後で変数を設定しても、効果はありません。

Vim/Neovim プラグイン

vim-plug を使用している場合は、Vim の設定ファイルに 次の内容を追加します。

Plug 'junegunn/fzf', { 'do': { -> fzf#install() } }
Plug 'junegunn/fzf.vim'
  • junegunn/fzf は基本的なライブラリ関数を提供します
    • fzf#install() は最新のバイナリがインストールされていることを確認します
  • junegunn/fzf.vim は、さまざまな便利なコマンドを提供する別のプロジェクトです

Vim との統合について詳しくは、README-VIM.md を参照してください。

ヒント

Neovim を使用していて、Lua ベースのプラグインをお使いの場合は、 fzf-lua をご確認ください。

fzf のアップグレード

fzf は活発に開発されているため、定期的にアップグレードすることをおすすめします。 使用したインストール方法に応じて、以下の手順に従ってください。

  • git:cd ~/.fzf && git pull && ./install
  • brew:brew update; brew upgrade fzf
  • macports:sudo port upgrade fzf
  • chocolatey:choco upgrade fzf
  • vim-plug::PlugUpdate fzf

fzf のビルド

BUILD.md を参照してください。

使い方

fzf は対話型のファインダーを起動し、STDIN からリストを読み取り、選択した項目を STDOUT に出力します。

find * -type f | fzf > selected

STDIN のパイプがない場合、fzf はカレントディレクトリ以下のファイルシステムを走査して ファイルのリストを取得します。

vim $(fzf)

メモ

デフォルトの動作は、次の方法で変更できます。

  • $FZF_DEFAULT_COMMAND に、目的のリストを生成するコマンドを設定する
  • $FZF_DEFAULT_OPTS に --walker、--walker-root、--walker-skip オプションを設定する

警告

より堅牢な方法は xargs を使用することですが、上記のほうがわかりやすいため、 こちらを紹介しています。

fzf --print0 | xargs -0 -o vim

ヒント

fzf には、別のプロセスに変化する機能もあります。

fzf --bind 'enter:become(vim {})'

詳しくは別のプロセスに変化するを参照してください。

ファインダーの使い方
  • CTRL-K / CTRL-J(または CTRL-P / CTRL-N)でカーソルを上下に移動します
  • Enter キーで項目を選択し、CTRL-C / CTRL-G / ESC で終了します
  • 複数選択モード(-m)では、TAB と Shift-TAB で複数の項目にマークを付けます
  • Emacs 形式のキーバインド
  • マウス:スクロール、クリック、ダブルクリック。複数選択モードでは、Shift キーを押しながらのクリックとスクロールにも対応しています
表示モード

fzf はデフォルトで全画面モードで実行されますが、ほかの表示モードも利用できます。

--height モード

--height HEIGHT[%] を指定すると、カーソルの下に指定した高さで fzf が起動します。

fzf --height 40%

reverse レイアウトと --border は、このオプションと相性がよいです。

fzf --height 40% --layout reverse --border

高さの先頭に ~ を付けると、最大の高さを設定できます。

# Will take as few lines as possible to display the list
seq 3 | fzf --height ~100%
seq 3000 | fzf --height ~100%

高さの値には負の数も指定できます。

# Screen height - 3
fzf --height -3
--popup モード

--popup オプションを指定すると、fzf はポップアップウィンドウで起動します (tmux 3.3+ または Zellij 0.44+ が必要です)。

# --popup [center|top|bottom|left|right][,SIZE[%]][,SIZE[%][,border-native]]

fzf --popup center         # Center, 50% width and height
fzf --popup 80%            # Center, 80% width and height
fzf --popup 100%,50%       # Center, 100% width and 50% height
fzf --popup left,40%       # Left, 40% width
fzf --popup left,40%,90%   # Left, 40% width, 90% height
fzf --popup top,40%        # Top, 40% height
fzf --popup bottom,80%,40% # Bottom, 80% width, 40% height

tmux または Zellij を使用していない場合、--popup は何も通知せずに無視されます。

メモ

ポップアップに対応していない古いバージョンの tmux を使用している場合や、 通常の tmux ペインで fzf を開きたい場合は、 fzf-tmux スクリプトを確認してください。

ヒント

これらのオプションを $FZF_DEFAULT_OPTS に追加すると、デフォルトで適用されます。 例:

# tmux または Zellij ではポップアップで開き、それ以外では --height モードを使用
export FZF_DEFAULT_OPTS='--height 40% --popup bottom,40% --layout reverse --border top'
検索構文

特に指定がない限り、fzf は「拡張検索モード」で起動します。このモードでは、スペースで区切って複数の検索語を入力できます。例:^music .mp3$ sbtrkt !fire

トークンマッチタイプ説明
sbtrktあいまい一致sbtrkt に一致する項目
'wild完全一致(引用符付き)wild を含む項目
'wild'単語境界完全一致(両端を引用符で囲む)単語境界にある wild を含む項目
^music前方完全一致music で始まる項目
.mp3$後方完全一致.mp3 で終わる項目
!fire逆完全一致fire を含まない項目
!^music逆前方完全一致music で始まらない項目
!.mp3$逆後方完全一致.mp3 で終わらない項目

あいまい一致を使わず、すべての単語を「引用符で囲む」ことも避けたい場合は、-e または --exact オプションを付けて fzf を起動してください。--exact を設定すると、' 接頭辞によって検索語の「引用符が外される」ことに注意してください。

単独のバー文字の検索語は OR 演算子として機能します。たとえば、次のクエリは core で始まり、go、rb、py のいずれかで終わる項目に一致します。

^core go$ | rb$ | py$
環境変数
  • FZF_DEFAULT_COMMAND
    • 入力が TTY のときに使用するデフォルトのコマンド
    • 例:export FZF_DEFAULT_COMMAND='fd --type f'
  • FZF_DEFAULT_OPTS
    • デフォルトのオプション
    • 例:export FZF_DEFAULT_OPTS="--layout=reverse --inline-info"
  • FZF_DEFAULT_OPTS_FILE
    • デフォルトのオプションをファイルで管理する場合は、この変数にファイルの場所を設定します
    • 例:export FZF_DEFAULT_OPTS_FILE=~/.fzfrc

警告

要件にわずかな違いがあるため、シェル統合では FZF_DEFAULT_COMMAND は使用されません。

  • CTRL-T は $FZF_CTRL_T_COMMAND を実行して、ファイルとディレクトリの一覧を取得します
  • ALT-C は $FZF_ALT_C_COMMAND を実行して、ディレクトリの一覧を取得します
  • vim ~/**<tab> は、プレフィックス(~/)を最初の引数として fzf_compgen_path() を実行します
  • cd foo**<tab> は、プレフィックス(foo)を最初の引数として fzf_compgen_dir() を実行します

使用可能なオプションについては、このドキュメントの後半で説明します。

外観のカスタマイズ

fzf のユーザーインターフェースは、多数の設定オプションで完全にカスタマイズできます。手早く設定するには、--style オプションを使って、スタイルプリセットの default、full、minimal のいずれかから始められます。

fzf --style full \
    --preview 'fzf-preview.sh {}' --bind 'focus:transform-header:file --brief {}'
プリセットスクリーンショット
defaultREADME の画像
fullREADME の画像
minimalREADME の画像

full プリセットを使った例です。

README の画像
git ls-files | fzf --style full \
    --border --padding 1,2 \
    --border-label ' Demo ' --input-label ' Input ' --header-label ' File Type ' \
    --preview 'fzf-preview.sh {}' \
    --bind 'result:transform-list-label:
        if [[ -z $FZF_QUERY ]]; then
          echo " $FZF_MATCH_COUNT items "
        else
          echo " $FZF_MATCH_COUNT matches for [$FZF_QUERY] "
        fi
        ' \
    --bind 'focus:transform-preview-label:[[ -n {} ]] && printf " Previewing [%s] " {}' \
    --bind 'focus:+transform-header:file --brief {} || echo "No file selected"' \
    --bind 'ctrl-r:change-list-label( Reloading the list )+reload(sleep 2; git ls-files)' \
    --color 'border:#aaaaaa,label:#cccccc' \
    --color 'preview-border:#9999cc,preview-label:#ccccff' \
    --color 'list-border:#669966,list-label:#99cc99' \
    --color 'input-border:#996666,input-label:#ffcccc' \
    --color 'header-border:#6699cc,header-label:#99ccff'
オプション

すべてのオプションについては、man ページ(fzf --man または man fzf)をご覧ください。

デモ

動画を見て学ぶ方は、@samoshkin によるスクリーンキャストで fzf の機能をご覧ください。

README の画像

例

コマンドラインのキーバインド

シェル連携を設定すると、bash、zsh、fish、Nushell で以下のキーバインドを使用できます。

  • CTRL-T - 選択したファイルとディレクトリをコマンドラインに貼り付けます
    • リストは --walker file,dir,follow,hidden オプションを使って生成されます
      • FZF_CTRL_T_COMMAND に必要なリストを生成するカスタムコマンドを設定すると、動作を上書きできます
      • または、FZF_CTRL_T_OPTS に --walker* オプションを設定できます
    • FZF_CTRL_T_OPTS を設定して、fzf に追加のオプションを渡せます
      # bat (https://github.com/sharkdp/bat) を使ってファイルの内容をプレビューする
      export FZF_CTRL_T_OPTS="
        --walker-skip .git,node_modules,target
        --preview 'bat -n --color=always {}'
        --bind 'ctrl-/:change-preview-window(down|hidden|)'"
      
    • スクリプトを読み込むときに FZF_CTRL_T_COMMAND を空文字列に設定すると無効にできます
  • CTRL-R - 履歴から選択したコマンドをコマンドラインに貼り付けます。
    • TAB で複数のコマンドを選択できます。
    • コマンドを時系列順に表示するには、CTRL-R をもう一度押すと、関連度による並べ替えが切り替わります
    • ALT-R を押すと「raw」モードが切り替わり、一致した項目の前後にある項目を表示できます。このモードでは、CTRL-N と CTRL-P を押すと、一致した項目の間だけを移動できます。
    • CTRL-/ または ALT-/ を押すと、行の折り返しを切り替えます
    • SHIFT-DELETE を押すと、選択したコマンドを削除します(bash および fish)
    • fish シェルのみ:
      • ALT-ENTER を押すと、選択したコマンドを整形して挿入します
      • ALT-T を押すと、コマンドの接頭辞(タイムスタンプ、日付/時刻、なし)を切り替えます
    • FZF_CTRL_R_OPTS を設定して、fzf に追加のオプションを渡せます
      # pbcopy を使って、CTRL-Y でコマンドをクリップボードにコピーする
      export FZF_CTRL_R_OPTS="
        --bind 'ctrl-y:execute-silent(echo -n {2..} | pbcopy)+abort'
        --color header:italic
        --header 'Press CTRL-Y to copy command into clipboard'"
      
      # Fish シェル:日付/時刻をデフォルトの接頭辞として設定する
      set -gx FZF_CTRL_R_OPTS "--with-nth 1,3.. --bind 'alt-t:change-with-nth(2..|3..|1,3..)'"
      # または、デフォルトでプレフィックスを表示しない
      set -gx FZF_CTRL_R_OPTS "--with-nth 3.. --bind 'alt-t:change-with-nth(2..|1,3..|3..)'"
      
    • スクリプトの読み込み時にFZF_CTRL_R_COMMANDを空文字列に設定すると無効にできます
    • 空でないFZF_CTRL_R_COMMANDによるカスタム上書きはまだサポートされておらず、警告が表示されます
  • ALT-C - 選択したディレクトリに移動します
    • リストは--walker dir,follow,hiddenオプションを使用して生成されます
    • デフォルトのコマンドを上書きするには、FZF_ALT_C_COMMANDを設定します
      • または、FZF_ALT_C_OPTSで--walker-*オプションを設定できます
    • fzfに追加のオプションを渡すには、FZF_ALT_C_OPTSを設定します
      # プレビューウィンドウにツリー構造を表示
      export FZF_ALT_C_OPTS="
        --walker-skip .git,node_modules,target
        --preview 'tree -C {}'"
      
    • スクリプトの読み込み時にFZF_ALT_C_COMMANDを空文字列に設定すると無効にできます

これらのキーバインドの表示モードは、FZF_{CTRL_T,CTRL_R,ALT_C}_OPTSで個別に設定するか、FZF_DEFAULT_OPTSで一括して設定できます。 (例:FZF_CTRL_R_OPTS='--popup bottom,60% --height 60% --border top')

詳しいヒントはWikiページをご覧ください。

あいまい検索補完

シェル統合では、bash、zsh、fish、Nushell向けのあいまい検索補完も利用できます。

ファイルとディレクトリ

カーソルの前の単語がトリガー文字列で終わっている場合、ファイルとディレクトリのあいまい検索補完を呼び出せます。デフォルトのトリガー文字列は**です。

  • COMMAND [DIRECTORY/][FUZZY_PATTERN]**<TAB>
# Files under the current directory
# - You can select multiple items with TAB key
vim **<TAB>

# Files under parent directory
vim ../**<TAB>

# Files under parent directory that match `fzf`
vim ../fzf**<TAB>

# Files under your home directory
vim ~/**<TAB>


# Directories under current directory (single-selection)
cd **<TAB>

# Directories under ~/github that match `fzf`
cd ~/github/fzf**<TAB>
プロセス ID

killコマンドでは、PIDのあいまい検索補完を利用できます。

# Can select multiple processes with <TAB> or <Shift-TAB> keys
kill -9 **<TAB>
ホスト名

sshコマンドでは、ホスト名のあいまい検索補完を利用できます。ホスト名は/etc/hostsと~/.ssh/configから取得されます。

ssh **<TAB>
環境変数/エイリアス
# bash and zsh
unset **<TAB>
export **<TAB>
unalias **<TAB>

# fish
set <SHIFT-TAB>
bashとzshでのあいまい検索補完のカスタマイズ
補完用のfzfオプションのカスタマイズ
# Use ~~ as the trigger sequence instead of the default **
export FZF_COMPLETION_TRIGGER='~~'

# Options to fzf command
export FZF_COMPLETION_OPTS='--border --info=inline'

# Options for path completion (e.g. vim **<TAB>)
export FZF_COMPLETION_PATH_OPTS='--walker file,dir,follow,hidden'

# Options for directory completion (e.g. cd **<TAB>)
export FZF_COMPLETION_DIR_OPTS='--walker dir,follow'

# Advanced customization of fzf options via _fzf_comprun function
# - The first argument to the function is the name of the command.
# - You should make sure to pass the rest of the arguments ($@) to fzf.
_fzf_comprun() {
  local command=$1
  shift

  case "$command" in
    cd)           fzf --preview 'tree -C {} | head -200'   "$@" ;;
    export|unset) fzf --preview "eval 'echo \$'{}"         "$@" ;;
    ssh)          fzf --preview 'dig {}'                   "$@" ;;
    *)            fzf --preview 'bat -n --color=always {}' "$@" ;;
  esac
}
パスとディレクトリの補完ソースのカスタマイズ
# Use fd (https://github.com/sharkdp/fd) for listing path candidates.
# - The first argument to the function ($1) is the base path to start traversal
# - See the source code (completion.{bash,zsh}) for the details.
_fzf_compgen_path() {
  fd --hidden --follow --exclude ".git" . "$1"
}

# Use fd to generate the list for directory completion
_fzf_compgen_dir() {
  fd --type d --hidden --follow --exclude ".git" . "$1"
}
サポート対象コマンド(bash)

bashでは、あいまい検索補完は事前定義されたコマンドのみに対して有効です(一覧を確認するにはcomplete | grep _fzfを実行します)。ただし、_fzf_setup_completionヘルパー関数を使用すれば、ほかのコマンドでも有効にできます。

# usage: _fzf_setup_completion path|dir|var|alias|host COMMANDS...
_fzf_setup_completion path ag git kubectl
_fzf_setup_completion dir tree
カスタムあいまい検索補完

(カスタム補完APIは試験的なものであり、変更される可能性があります)

_"COMMAND"_という名前のコマンドに対して、_fzf_completeヘルパーを使用し、_fzf_complete_COMMAND関数を定義します。

# Custom fuzzy completion for "doge" command
#   e.g. doge **<TAB>
_fzf_complete_doge() {
  _fzf_complete --multi --reverse --prompt="doge> " -- "$@" < <(
    echo very
    echo wow
    echo such
    echo doge
  )
}
  • --より前の引数は、fzfに渡すオプションです。
  • --より後には、元の補完引数("$@")をそのまま渡します。
  • 次に、補完候補を生成する一連のコマンドを記述し、プロセス置換(< <(...))を使用して、その出力を関数に渡します。

zshでは命名規則に従って関数が自動的に検出されますが、bashではcompleteコマンドを使用して、関数をコマンドに手動で関連付ける必要があります。

[ -n "$BASH" ] && complete -F _fzf_complete_doge -o default -o bashdefault doge

fzfの出力を後処理する必要がある場合は、次のように_fzf_complete_COMMAND_postを定義します。

_fzf_complete_foo() {
  _fzf_complete --multi --reverse --header-lines=3 -- "$@" < <(
    ls -al
  )
}

_fzf_complete_foo_post() {
  awk '{print $NF}'
}

[ -n "$BASH" ] && complete -F _fzf_complete_foo -o default -o bashdefault foo
fish のファジー補完

fish のファジー補完は、bash や zsh とは次の点で異なります。

  • ** のようなトリガーシーケンスは必要ありません。代わりに、Shift-TAB で有効になります(ネイティブのページャー検索モードを置き換えます)。TAB では fish のネイティブ補完の動作が維持されます。
  • 再帰的なファイルシステムの走査を行うのではなく、fish のネイティブ補完システムを利用して候補リストを生成します。再帰検索には、代わりに CTRL-T のキーバインドを使用してください。
  • 現在のコマンドラインのトークンがワイルドカードパターンの場合、ネイティブの動作のようにすべての結果をコマンドラインに挿入するのではなく、ワイルドカードを展開したパスのリストを検索します。展開にはシェルを使用するため、結果の数には上限があります。
  • サポートされている設定変数は FZF_COMPLETION_OPTS と FZF_EXPANSION_OPS のみです。
  • カスタム補完関数で使用される関数の名前は fzf_complete です。この関数は fzf のオプションのみを引数として受け付けます。また、リダイレクトされた入力なしで呼び出し、ネイティブ補完の結果を表示しながら fzf のオプションだけを変更することもできます。他のシェルとの互換性のため、fzf のオプションの後にコマンドライン引数として -- $argv を受け付ける _fzf_complete という名前の関数も用意されています。

fish の補完で対応していないコマンドについては、通常の fish 補完関数(TAB と Shift-TAB の両方で機能します)を作成し、特定のコマンドの fzf オプションを変更する場合や、Shift-TAB で異なる結果を表示したい場合にのみ、fzf 補完関数を作成するのがおすすめです。

# Customize git completion
function _fzf_complete_git
  # Show header text with active branch for all git completions
  set -lx -- FZF_COMPLETION_OPTS --header="'"(git branch --show-current 2>/dev/null)"'"

  # No other changes when less than 3 arguments, or when completing options
  if not set -q argv[3]; or string match -q -- '-*' $argv[-1]
    fzf_complete
    return
  end

  # Check subcommand
  switch $argv[2]
    case checkout diff log show
      # Set preview and display all branches and commits for subcommands: checkout, diff, log, show
      begin
        git branch --all --format='%(refname:short)'
        git log --all --oneline --color=always
      end | fzf_complete --no-multi --ansi --accept-nth=1 --query=$argv[-1] --preview='git show --color=always {1}'

    case add rm mv
      # Only set preview for subcommands: add, rm, mv
      # Special characters in fish completion lists are escaped, so the r flag must be used.
      fzf_complete --preview="git diff --color=always {r1}"

    case '*'
      # No changes for other subcommands
      fzf_complete
  end
end

bash や zsh と同様に、_fzf_complete_COMMAND_post または _fzf_post_complete_COMMAND という名前の関数を定義すると、fzf の出力をコマンドラインに挿入する前に処理できます。

function _fzf_complete_foo
  ls -sh --zero --color=always | fzf_complete --read0 --print0 --ansi --no-multi-line --header-lines=1
end

function _fzf_post_complete_foo
  while read -lz result
    string escape -n -- $result | string trim -l -c '\ ' | string split -m 1 -f 2 ' '
  end
end
Nushell のファジー補完

Nushell のファジー補完は、外部補完の仕組みを利用します。bash や zsh と比べて、次の違いがあります。

  • Nushell >= 0.103.0 では、組み込みコマンド(例:cd、ls)に対して外部補完が呼び出されなくなりました。**<TAB> によるファジー補完は、外部コマンドでのみ機能します。
  • カスタム補完は、config.nu の $env.FZF_COMPLETERS レコードで定義できます。各エントリは、プレフィックスとコマンドのスパンを受け取るクロージャーで、候補文字列のリスト、またはカスタム fzf オプション用のレコード { candidates: [...], opts: [...] } を返します。
    $env.FZF_COMPLETERS = {
        pacman: {|prefix, spans|
            let sub = $spans | skip 1 | first
            let candidates = (if ($sub =~ "-[SF]") { ^pacman -Slq | lines
            } else if ($sub =~ "-[QR]") { ^pacman -Qq | lines
            } else { [] })
            { candidates: $candidates, opts: ["--preview", "pacman -Si {}"] }
        }
    }
    
    さらに例を見るには、shell/completion-examples.nu を参照してください。
  • 次の環境変数がサポートされています。 FZF_COMPLETION_TRIGGER、FZF_COMPLETION_OPTS、 FZF_COMPLETION_PATH_OPTS、FZF_COMPLETION_DIR_OPTS、 FZF_COMPLETION_DIR_COMMANDS。

Vim プラグイン

README-VIM.md を参照してください。

高度なトピック

入力の種類に応じたカスタマイズ

fzf は汎用テキストフィルターであるため、そのアルゴリズムはあらゆる種類の入力で「概ね」うまく機能するように設計されています。しかし、万能な解決策はなく、入力の種類に応じてアルゴリズムや設定の一部を調整したい場合もあります。この作業を容易にするため、fzf では一般的な入力の種類向けに、いくつかの「スキーム」を用意しています。

Scheme説明
--scheme=defaultあらゆる種類の入力でうまく機能するよう設計された汎用スキーム
--scheme=pathファイルパスに適しています
--scheme=historyコマンド履歴や、時系列順が重要な入力に適しています

(詳細については fzf --man を参照してください)

パフォーマンス

fzf は高速です。ほとんどのユースケースで、パフォーマンスが問題になることはありません。ただし、パフォーマンスに影響するオプションについて把握しておくとよいでしょう。

  • --ansi は入力内の ANSI カラーコードを抽出して解析するため、初回のスキャンが遅くなります。そのため、$FZF_DEFAULT_OPTS に追加することはおすすめしません。
  • --nth は各行をトークン化する必要があるため、fzf の動作を遅くします。
  • 正規表現の区切り文字よりも、単純な文字列の --delimiter を使うことをおすすめします。
  • --with-nth は各行をトークン化して再構成する必要があるため、fzf の動作を遅くします。
外部プログラムの実行

fzf を終了せずに外部プロセスを起動するためのキーバインド(execute、execute-silent)を設定できます。

# Press F1 to open the file with less without leaving fzf
# Press CTRL-Y to copy the line to clipboard and aborts fzf (requires pbcopy)
fzf --bind 'f1:execute(less -f {}),ctrl-y:execute-silent(echo {} | pbcopy)+abort'

詳細については、man ページの KEY/EVENT BINDINGS セクションをご覧ください。

別のプロセスへの切り替え

become(...) は上記の execute(...)/execute-silent(...) に似ていますが、コマンドを実行して完了後に fzf に戻るのではなく、fzf がコマンドの新しいプロセスに切り替わります。

fzf --bind 'enter:become(vim {})'

一見同等のコマンド置換 vim "$(fzf)" と比べて、この方法には次のような利点があります。

  • CTRL-C で fzf を終了しても、Vim が空のファイルを開きません
  • 結果が空の状態で ENTER を押しても、Vim が空のファイルを開きません
  • 空白を含む場合でも、複数の選択項目を処理できます
    fzf --multi --bind 'enter:become(vim {+})'
    

公平を期すなら、vim "$(fzf)" の代わりに fzf --print0 | xargs -0 -o vim を実行すれば、上記の問題はすべて解決します。それでも、become(...) にはさまざまな状況でさらなる利点があります。

  • ラッパースクリプトを使わずに、結果を異なる方法で処理する複数のバインディングを設定できます
    fzf --bind 'enter:become(vim {}),ctrl-e:become(emacs {})'
    
    • 以前は、--expect=ctrl-e を使い、fzf の出力の先頭行を確認する必要がありました
  • fzf のフィールドインデックス式を使って、後続のコマンドを簡単に組み立てられます
    # Open the file in Vim and go to the line
    git grep --line-number . |
        fzf --delimiter : --nth 3.. --bind 'enter:become(vim {1} +{2})'
    
候補リストの再読み込み

reload アクションをキーまたはイベントに割り当てることで、fzf の候補リストを動的に再読み込みできます。詳細については、https://github.com/junegunn/fzf/issues/1750 をご覧ください。

1. CTRL-R を押してプロセスのリストを更新する
ps -ef |
  fzf --bind 'ctrl-r:reload(ps -ef)' \
      --header 'Press CTRL-R to reload' --header-lines=1 \
      --height=50% --layout=reverse
2. CTRL-D または CTRL-F を押してソースを切り替える
FZF_DEFAULT_COMMAND='find . -type f' \
  fzf --bind 'ctrl-d:reload(find . -type d),ctrl-f:reload(eval "$FZF_DEFAULT_COMMAND")' \
      --height=50% --layout=reverse
3. ripgrep とのインタラクティブな連携

以下の例では、ripgrep の選択インターフェイスとして fzf を使用しています。reload アクションを change イベントに割り当てているため、fzf で入力するたびに、プレースホルダー式 {q} で示される更新後のクエリ文字列を使って ripgrep プロセスが再起動します。また、fzf が二次フィルタリングを実行しないように、--disabled オプションを使用しています。

: | rg_prefix='rg --column --line-number --no-heading --color=always --smart-case' \
    fzf --bind 'start:reload:$rg_prefix ""' \
        --bind 'change:reload:$rg_prefix {q} || true' \
        --bind 'enter:become(vim {1} +{2})' \
        --ansi --disabled \
        --height=50% --layout=reverse

ripgrep で一致する項目が見つからない場合、ゼロ以外の終了ステータスで終了し、fzf が警告を表示します。警告メッセージを抑制するため、コマンドに || true を追加し、常に 0 で終了するようにしています。

より高度な例については、"fzf をインタラクティブな Ripgrep ランチャーとして使う"をご覧ください。

プレビューウィンドウ

--preview オプションを設定すると、fzf は現在の行を引数として外部プロセスを自動的に起動し、その結果を分割ウィンドウに表示します。 コマンドの実行には $SHELL が使用され、$SHELL -c COMMAND で実行されます。 ウィンドウはマウスまたはカスタムキーバインドでスクロールできます。

# {} is replaced with the single-quoted string of the focused line
fzf --preview 'cat {}'

プレビューウィンドウは ANSI カラーに対応しているため、ファイルの内容をシンタックスハイライトできるプログラム(Bat や Highlight など)を使用できます。

fzf --preview 'bat --color=always {}' --preview-window '~3'

--preview-window オプションでプレビューウィンドウのサイズ、位置、枠線を、--color オプションで前景色と背景色をカスタマイズできます。たとえば、次のように設定します。

fzf --height 40% --layout reverse --info inline --border \
    --preview 'file {}' --preview-window up,1,border-horizontal \
    --bind 'ctrl-/:change-preview-window(50%|hidden|)' \
    --color 'fg:#bbccdd,fg+:#ddeeff,bg:#334455,preview-bg:#223344,border:#778899'

オプションの全一覧については、マニュアルページ(man fzf)をご覧ください。

より高度な例はこちらで確認できます。

警告

fzf はファイル検索ツールではなく汎用テキストフィルターなので、--preview オプションを $FZF_DEFAULT_OPTS に追加するのはおすすめできません。

# *********************
# ** DO NOT DO THIS! **
# *********************
export FZF_DEFAULT_OPTS='--preview "bat --style=numbers --color=always --line-range :500 {}"'

# bat はファイル一覧以外の入力では動作しません
ps -ef | fzf
seq 100 | fzf
history | fzf
画像のプレビュー

fzf は、次のいずれかのプロトコルを使用してプレビューウィンドウに画像を表示できます。

詳しくは、bin/fzf-preview.sh スクリプトをご覧ください。

fzf --preview 'fzf-preview.sh {}'

ヒント

.gitignore の尊重

fd、 ripgrep、またはthe silver searcherを使うと、.gitignore を尊重しながらファイルシステムを検索できます。

# Feed the output of fd into fzf
fd --type f --strip-cwd-prefix | fzf

# Setting fd as the default source for fzf
export FZF_DEFAULT_COMMAND='fd --type f --strip-cwd-prefix'

# Now fzf (w/o pipe) will use the fd command to generate the list
fzf

# To apply the command to CTRL-T as well
export FZF_CTRL_T_COMMAND="$FZF_DEFAULT_COMMAND"

シンボリックリンクをたどり、隠しファイルを除外しないようにするには、次のコマンドを使用してください。

export FZF_DEFAULT_COMMAND='fd --type f --strip-cwd-prefix --hidden --follow --exclude .git'
Fish シェル

fish の CTRL-T キーバインドは、bash や zsh のものとは異なり、コマンドラインの最後のトークンを再帰検索のルートディレクトリとして使用します。たとえば、次のコマンドラインの末尾で CTRL-T を押すと、

ls /var/

/var/ 以下にあるすべてのファイルとディレクトリが一覧表示されます。

カスタムの FZF_CTRL_T_COMMAND を使用する場合は、この機能を使えるよう、展開されていない $dir 変数を使用してください。最後のトークンが有効なディレクトリでない場合、$dir のデフォルト値は . です。例:

set -g FZF_CTRL_T_COMMAND "command find -L \$dir -type f 2> /dev/null | sed '1d; s#^\./##'"
fzf テーマプレイグラウンド

Vitor Mello が作成した fzf テーマプレイグラウンドは、fzf のテーマをインタラクティブに作成できるウェブページです。

関連プロジェクト

https://github.com/junegunn/fzf/wiki/Related-projects

ライセンス

MIT ライセンス(MIT)

Copyright (c) 2013-2026 Junegunn Choi

グッズ

fzf の T シャツ、マグカップ、ステッカーはこちらからお求めください:https://commitgoods.com/collections/fzf

スポンサー :heart:

fzf の改善を続けられるよう支援してくださっている、このプロジェクトのすべてのスポンサーに感謝します。

このプロジェクトへのスポンサーをご希望の場合は、https://github.com/sponsors/junegunn をご覧ください。

コメント