fzf について
fzf は汎用ファジー検索ツールで、ファイル、コマンド履歴、プロセスを高速かつインタラクティブに検索できます。find . -type f | fzf でファイル検索、history | fzf で履歴コマンド検索し、コーディングエージェントワークフローに統合します。
主な機能
- 01ファジーパターンマッチングでファイルリストを素早く検索・フィルタリングする
- 02コマンド履歴からインタラクティブに検索して以前のコマンドを再実行する
- 03Unix パイプと組み合わせてあらゆるデータソースを検索する
活用シーン
- 01コーディングエージェントがプロジェクトファイルを素早く特定・選択する
- 02開発者がコマンド履歴から以前のコマンドを検索・再利用する
- 03他のツールとの統合でインタラクティブなデータクエリワークフローを構築する
インストール
OS またはパッケージマネージャーを選び、コマンドをターミナルで実行します。
インストール後にfzf --versionを実行して確認します。
コマンド例
よく使うコマンドを使う順に並べています。
詳細
翻訳後に原文が更新されています。最新の内容は原文をご確認ください。
fzfへの愛を表現しましょう――Tシャツ、マグカップ、ステッカーを販売中です!
commitgoods.com/collections/fzf
fzfは、汎用のコマンドライン用ファジーファインダーであり、対話型ターミナルツールキットです。
ファイルの選択、コマンド履歴の閲覧、データのプレビュー、ファジーマッチングによる複雑なデータセットの検索、カスタムメニューやワークフローの作成など、fzfはシェルスクリプトを高機能なターミナルアプリケーションに変えるための構成要素を提供します。
特長
- ポータブル // インストールしやすい単一のバイナリとして配布
- 高速 // 数百万件の項目をミリ秒単位で処理できるよう最適化
- プログラム可能 // カスタムのターミナルインターフェースやワークフローを構築するためのイベント駆動型アーキテクチャ
- 必要な機能を標準搭載 // Bash、Zsh、Fish、Nushell、Vim、Neovimとの統合機能を搭載
目次
- インストール
- fzf のアップグレード
- fzf のビルド
- 使い方
- 使用例
- コマンドラインのキーバインド
- ファジー補完
- Vim プラグイン
- 高度なトピック
- ヒント
- 関連プロジェクト
- ライセンス
- グッズ
- スポンサー :heart:
インストール
Homebrew を使用する
Homebrew(macOS または Linux)を使って fzf をインストールできます。
brew install fzf
重要
シェル統合(キーバインドとファジー補完)のセットアップ方法については、 以下の手順を参照してください。
fzf は MacPorts 経由でも利用できます:sudo port install fzf
Mise を使用する
miseを使って fzf をインストールできます。
mise use -g fzf@latest
Linux パッケージ
| パッケージマネージャー | Linux ディストリビューション | コマンド |
|---|---|---|
| APK | Alpine Linux | sudo apk add fzf |
| APT | Debian 9+/Ubuntu 19.10+ | sudo apt install fzf |
| Conda | conda install -c conda-forge fzf | |
| DNF | Fedora | sudo dnf install fzf |
| Nix | NixOS など | nix-env -iA nixpkgs.fzf |
| Pacman | Arch Linux | sudo pacman -S fzf |
| pkg | FreeBSD | pkg install fzf |
| pkgin | NetBSD | pkgin install fzf |
| pkg_add | OpenBSD | pkg_add fzf |
| Portage | Gentoo | emerge --ask app-shells/fzf |
| Spack | spack install fzf | |
| XBPS | Void Linux | sudo xbps-install -S fzf |
| Zypper | openSUSE | sudo zypper install fzf |
重要
シェル統合(キーバインドとファジー補完)の設定方法については、 以下の手順を参照してください。
Windows パッケージ
Windows では、fzf は Chocolatey、Scoop、 Winget、MSYS2 からインストールできます。
| パッケージマネージャー | コマンド |
|---|---|
| Chocolatey | choco install fzf |
| Scoop | scoop install fzf |
| Winget | winget 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 {}'
| プリセット | スクリーンショット |
|---|---|
default | ![]() |
full | ![]() |
minimal | ![]() |
full プリセットを使った例です。
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 の機能をご覧ください。
例
- 例の Wiki ページ
- 免責事項:このページの例はコミュニティによって管理されており、十分なテストは行われていません
- fzf の高度な使用例
コマンドラインのキーバインド
シェル連携を設定すると、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: [...] }を返します。
さらに例を見るには、shell/completion-examples.nu を参照してください。$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 {}"] } } } - 次の環境変数がサポートされています。
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 をご覧ください。


