とほほのfzf入門
- 初版:2026年3月8日
- 更新:2026年3月8日
Ctrl-r でヒストリをあいまい検索して実行できるだけでもスグレもの!
目次
fzfとは
- Linux で CLI や vim を使用するのであれば、是非、おススメのツールです。
- コマンド名は fzf で、Fuzzy Finder が名前の由来です。
- コマンドのヒストリや、編集対象ファイルなどを選択したりあいまい検索することができます。
- 選択肢が画面に表示され、[↑] や [↓] キーなどで選択し、選択結果をコマンドに引き渡すことができます。
- ファイルやディレクトリだけではなく、Git のブランチ名や Docker のコンテナ名など様々なものを選択することができます。
リンク
- https://github.com/junegunn/fzf (公式サイト)
- https://man.archlinux.org/man/fzf.1.en (マニュアル)
- https://www.mankier.com/1/fzf (マニュアル)
環境
本書は下記の環境で確認しています。
OS : AlmaLinux 10 Shell: Bash 5.2.26 fzf : 0.70.0
インストール
dnf や apt でもインストールできますが、バージョンが古いので git でインストールするのがおススメです。また、fzf と相性の良い fd (高速版 find)、rg (ripgrep : 高速版 grep)、bat (シンタックスハイライト版 cat) もインストールしておくのがおススメです。
gitでインストール
# git と curl がインストールされていることを確認 $ git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf $ ~/.fzf/install Do you want to enable fuzzy auto-completion? ([y]/n) y # **<ESC> のオートコンプリーションを有効にするか Do you want to enable key bindings? ([y]/n) y # Ctrl-r、Ctrl-t、Alt-c などのキーバインドを有効にするか Do you want to update your shell configuration files? ([y]/n) y # シェル設定ファイル(.bashrc等)に設定を追記するか $ source ~/.bashrc $ fzf --version 0.70.0 (eacef5ea)
aptでインストール(Ubuntu 24.04)
$ sudo apt install fzf $ fzf --version 0.44.1
dnfでインストール(RHEL10系)
# dnf -y install epel-release # dnf -y install fzf # fzf --version 0.58.0
fd, rg, batをインストール
# Ubuntu 24.04 $ sudo apt -y install fd-find ripgrep bat $ echo alias fd=fdfind >> ~/.bashrc $ echo alias bat=batcat >> ~/.bashrc $ source ~/.bashrc $ fd --version fdfind 9.0.0 $ rg --version ripgrep 14.1.0 $ bat --version bat 0.24.0 # RHEL10系 # dnf -y epel-release # dnf -y install fd-find ripgrep bat # fd --version fd 10.3.0 # rg --version ripgrep 14.1.1 # bat --version bat 0.24.0
便利機能
ヒストリー検索(Ctrl-r)
Ctrl-r をタイプするとヒストリー検索モードになります。
% <Ctrl>-r 1 cd 2 dnf -y install git 3 git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf 4 ~/.fzf/install 5 source ~/.bashrc 6 fzf --version 6/6 +S-------------------------------------------------------- >
↑↓矢印キーや、Emacs 風の Ctrl-p / Ctrl-n や、Vim 風の Ctrl-k / Ctrl-j で選択が上下に移動します。Enter で決定。ESC で選択をキャンセルします。なにか検索文字を入力すると一覧の中からあいまい検索で候補を絞ることができます。
ファイル検索(Ctrl-t)
cat などのコマンド名を入力し、スペースの後で Ctrl-t をタイプすると、カレントディレクトリ配下のファイル検索モードになります。
% cat <Ctrl>-t > 163/163 (0)--------------------------------------------------- .bash_logout .bash_profile .bashrc .cshrc .fzf.bash .tcshrc :
ヒストリと同様、あいまい検索や選択移動して Enter を押すと cat などの対象とするファイルが選択されます。
% cat .bashrc
ディレクトリ検索(Alt-c)
Alt-c でディレクトリ移動対象の一覧を表示し、Enter 選択によりそのディレクトリに移動します。
% <Alt>-c > 8/8 (0)------------------------------------------------------- dirA/ dirB/ dirC/ :
オートコンプリーション(**<TAB>)
** の後に TAB キーを押すと、コマンドに応じた対象の一覧を選択することができます。例えば、cat コマンドの対象はファイルなので、下記のようにファイルの一覧が表示されます。
cat /etc/**<TAB> > /etc/ 1394/1394 (0)------------------------------------------------- /etc /etc/.pwd.lock /etc/BUILDTIME :
kill コマンドはプロセスが対象なので、プロセスの一覧が表示されます。
% kill -9 **<TAB> > 6/6 (0)------------------------------------------------------- USER PID PPID STARTED TIME COMMAND root 1 0 18:05:41 00:00:00 /bin/bash root 47 0 18:06:02 00:00:00 /bin/bash root 444 47 18:14:41 00:00:00 /bin/bash :
unset コマンドは環境変数が対象なので、環境変数の一覧が表示されます。
% unset **<TAB> > 10/10 (0)----------------------------------------------------- HOME HOSTNAME LANG :
ssh コマンドはサーバーが対象なので、/etc/hosts に記載したサーバー名一覧が表示されます。
% ssh server**<TAB> > server 3/3 (0)------------------------------------------------------- server001 server002 server003 :
画面構成
画面はいくつかのパネルから構成されます。下記のコマンドを実行すると フッター、選択欄、ヘッダー、情報欄、入力欄、プレビューウィンドウ がすべて表示されます。
fzf \
--border=double \
--footer="Footer" --footer-border=double \
--list-border=double \
--header="Header" --header-border=double \
--input-border=double \
--preview="cat {}" --preview-border=double \
--separator='-' - \
-prompt='Input: '
|
よく使うオプション
プレビュー表示(--preview)
--preview を付けると、候補にカーソルを合わせた時の内容をプレビューウィンドウに表示します。
% fd --type f | fzf --preview='head -120 {}'
複数選択(--multi)
--multi(-m) を指定すると複数選択ができます。TAB で選択/解除、Enter で確定します。
% fd --type f | fzf --multi % fd --type f | fzf -m
ボーダー(--border)
--border を指定すると全体を枠線(ボーダー)で囲むことができます。
% fd --type f | fzf --border=rounded
実用レシピ
ここでは、日常作業でそのまま使える短いレシピをまとめます。
Git ブランチ切り替え
~/.bashrc などに下記を設定しておくと、fbr コマンドで git checkout の対象ブランチを選択することができます。
fbr() {
git branch --all | sed 's#^..##; s#^remotes/[^/]*/##' | awk 'NF' \
| sort -u | fzf --bind='enter:become(git checkout {})'
}
Git 履歴からコミット選択
~/.bashrc などに下記を設定しておくと、fshow コマンドで git show の対象ログを選択することができます。
fshow() {
git log --oneline --decorate --color=always \
| fzf --ansi --no-sort --reverse --accept-nth=1 --bind='enter:become(git show {})'
}
ripgrep 結果からファイルを開く
~/.bashrc などに下記を設定しておくと、rgvim コマンドでキーワードを検索し、該当箇所を vim で開くことができます。
rgvim() {
rg --line-number --no-heading --color=always "$*" | fzf --ansi -d : \
--preview='bat -n --color=always {1}' --bind='enter:become(vim +{2} {1})'
}
プロセスを選んで終了
~/.bashrc などに下記を設定しておくと、fkill コマンドで kill の対象プロセスを選択することができます。強制終了が必要な場合は kill -9 とします。
fkill() {
ps -ef | sed 1d | fzf -m --bind='enter:become(kill -HUP {2})'
}
キーバインド
選択モードでは基本的に下記のキーを使用することができます。
↑ 上に移動 ↓ 下に移動 Ctrl-P 上に移動(Emacs風) Ctrl-N 下に移動(Emacs風) Ctrl-K 上に移動(Vi風) Ctrl-J 下に移動(Vi風) Enter 選択決定 ESC キャンセル Ctrl-C キャンセル Ctrl-G キャンセル TAB 複数選択時の選択/選択解除
検索モード
あいまい検索
ABC を検索すると、ABC にも AxxBxxC にもマッチするモードです。デフォルトはあいまい検索モードです。--exact オプションをつけると無効化されます。また、マッチングの優先度に従いスコアリングも行われます。スコアリング方式は --scheme や --algo オプションで変更できます。
ABC # AxxBxxCにマッチする
メタ文字検索
下記の様に ' ^ $ のメタ文字が意味を持つ検索モードです。デフォルトはメタ文字検索モードです。--literal オプションをつけると無効化されます。
foo # あいまい単語検索(fuooにもマッチする) 'foo # fooを含む(foobarにもマッチする) 'foo' # fooという単語を含む(foobarにはマッチしない) ^foo # fooではじまる foo$ # fooで終わる !foo # fooを含まない !^foo # fooで始まらない !foo$ # fooで終わらない
オプション
ここでは mankier の fzf(1) のカテゴリ順に、各オプションを説明します(各項目に 1 行実例付き)。
検索
大文字・小文字
- --smart-case
- スマートケース(デフォルト)。検索文字列に1文字でも大文字があると大文字・小文字を区別し、すべて小文字であれば大文字・小文字を無視します。
printf "%s\n" Foo foo | fzf --smart-case
- -i, --ignore-case
- 常に大文字小文字を無視します。
printf "%s\n" Foo foo | fzf -i
- +i, --no-ignore-case
- 常に大文字小文字を区別します。 対応する有効化側のオプションと対で使い分けます。
printf "%s\n" Foo foo | fzf +i
あいまい・メタ文字検索
- -x, --extended
- 拡張検索モード(デフォルト)。あいまい検索 も メタ文字検索 も行います。
fzf --extended
- -e, --exact
- 厳格検索モード。あいまい検索 を行いません。メタ文字検索 は行います。
fzf --exact
- --literal
- リテラル検索モード。あいまい検索 は行います。メタ文字検索 は行いません。
fzf --literal
- --scheme=default | path | history
- あいまい検索 におけるスコアリング方式を
default(デフォルト)、path(パス名マッチング向け)、history(履歴マッチング向け) のいずれかで指定します。fzf --scheme=path
- +s, --no-sort
- デフォルトではスコア順にソートしますが、このオプションを指定するとスコア順ソートを無効化します。 対応する有効化側のオプションと対で使い分けます。
tail -f app.log | fzf +s --tac
- --tiebreak=point1,point2,...
- スコアリングのソートで、同点時の並び替え条件を
length(マッチした文字数)、chunk(最長連続マッチ文字数)、pathname(パス名)、begin(行頭マッチ優先)、end(行末マッチ優先)、index(元の順序を維持) のカンマ区切りで指定します。fzf --tiebreak=length,index
- --algo=v1 | v2
- あいまい検索 におけるスコアリング方式のアルゴリズムを
v1(旧アルゴリズム。軽量で高速)、v2(やや重いが高精度)(デフォルト)のいずれかで指定します。fzf --algo=v1
フィールド検索
- -n, --nth=N[,..]
- 検索の検索対象フィールドを制限します。
ps -ef | fzf -n 8 # 8フィールド目のみを対象とする ps -ef | fzf -n 1,8 # 1フィールドと8フィールド ps -ef | fzf -n 8.. # 8フィールド以降 ps -ef | fzf -n 8..10 # 8~10フィールド ps -ef | fzf -n 1,8.. # 1フィールドと8フィールド以降
- --with-nth=N[,..] | TEMPLATE
- 表示対象フィールドを制限します。
ps -ef | fzf --with-nth=1,8.. # 1フィールドと8フィールド以降を表示 ps -ef | fzf --with-nth='{1} : {8..}' # root : /bin/bash のようにフォーマット付きで表示
- --accept-nth=N[,..] | TEMPLATE
- 確定時に出力するフィールドを制限します。
ps -ef | fzf --accept-nth=2 # 確定時は第2フィールドのみを出力する ps -ef | fzf --accept-nth='kill -HUP {2}' # kill -HUP 632 のように出力 docker ps | fzf --accept-nth='docker stop {-1}' # 最後のフィールド(コンテナ名)を停止する
- -d, --delimiter=STR
- フィールドの区切り文字を指定します。
cat /etc/passwd | fzf -d : --with-nth=1
その他検索
- --tail=NUM
- 保持候補数の上限を指定します。
cat app.log | fzf --tail=100000
- --disabled
- 検索機能を無効化し選択のみを行います。
ps -ef | fzf --disabled
入出力
- --ansi
- ANSI 色を色付きで表示します。
rg --color=always foo | fzf --ansi
- --sync
- 入力をすべて読み取ってから描画します。
seq 1000000 | fzf --sync
- --read0
- 改行を含む選択肢を扱えるように、NUL 文字を区切り文字として読み込みます。
fd --type f --print0 | fzf --read0
- --print0
- 改行を含む選択肢を扱えるように、NUL 文字を区切り文字として出力します。
fd --type f --print0 | fzf --read0 --print0
- --no-tty-default
- TTY が無い環境などで、キー入力を
/dev/ttyではなく標準エラー経由で検索します。詳細はよくわかりませんが emacsclient から起動する際に発生する問題などを回避することができるそうです。fzf --no-tty-default
全体スタイル
- --style=default | minimal | full[:BORDER_STYLE]
- 選択欄のスタイルを
default(デフォルト)、minimal(最小限)、full(フル画面) のいずれかで指定します。fullの時はBORDER_STYLEを指定することができます。fzf --style=full:rounded
- --color=[BASE_SCHEME][,COLOR_NAME[:ANSI_COLOR][:ANSI_ATTRIBUTES]]...
- 配色を指定します。
BASE_SCHEME:ベースとなるスキーマをdark(ダークモード)、light(ライドモード)、base16(16色モード)、bw(白黒モード) のいずれかを指定します。COLOR_NAMES:fg(フォアグランド=テキスト)、bg(バックグランド=背景)、hl(ハイライト文字) などを指定します。他にも指定可能な項目は多いので詳細は リファレンスマニュアル を参照してください。ANSI_COLOR:white、black、redなどの色名や、0~15の16色カラー番号、16~255の 256色カラー番号、#f59e0bなどの RGB 値を指定します。詳細は リファレンスマニュアル を参照してください。ANSI_ATTRIBUTES: 文字属性をregular(通常)、bold(太字)、italic(斜体)、underline(下線)、strikethrough(打消線)、reverse(反転)、dim(薄文字)、strip(色無し) で指定します。
fzf --color=fg:#e5e7eb,bg:#111827,hl:#f59e0b
- --no-color
- 色付けを無効にします。
fzf --no-color
- --no-bold
- 太字装飾を無効にします。
fzf --no-bold
- --black
- 黒色背景向けの表示にします。
fzf --black
高さと横幅
- --height=HEIGHT
- 表示の高さを指定します。
fzf --height=40% # 画面の高さの40% fzf --height=~40% # 最大でも画面の高さの40% fzf --height=10 # 10行分の高さ fzf --height=-10 # 10行分除いた高さ
- --min-height=HEIGHT
- 最小の高さを指定します。
fzf --height=40% --min-height=12 # 40%とするが最低でも12行分 - --tmux=...
- tmux セッション内で利用する際の表示位置と大きさを指定します。
fzf --tmux=center # Center, width:50%, height:50% fzf --tmux=80% # Center, width:80%, height:80% fzf --tmux=100%,50% # Center, width:100%, height:50% fzf --tmux=left,40% # Left, width:40%, height:100% fzf --tmux=left,40%,90% # Left, width:40%, height:90% fzf --tmux=top,40% # Top, width:100%, height:40% fzf --tmux=bottom,80%,40% # Bottom, width:80%, height:40%
レイアウト
- --layout=default | reverse | reverse-list
- 配置方向を
default(選択肢が上/入力欄が下:デフォルト)、reverse(入力欄が上/選択肢が下)、reverse-list(選択肢のみを逆転表示) のいずれかで指定します。fzf --layout=reverse-list
- --reverse
--layout=reverseの短縮形です。fzf --reverse
- --border[=BORDER_STYLE]
- 枠線を表示します。枠線のスタイルを
rounded(角丸:デフォルト)、sharp(鋭角)、bold(太線)、double(二重線)、block(ブロック)、thinblock(薄ブロック)、horizontal(水平線のみ)、vertical(縦線のみ)、line(境界線のみ)、top(上部のみ)、bottom(下部のみ)、left(左側のみ)、right(右側のみ)、none(ボーダー無し) で指定します。fzf --border=rounded
- --border-label=LABEL
- 枠線ラベルを指定します。
fzf --border --border-label=' Files '
- --border-label-pos=N[:top|bottom]
- 枠線ラベルの位置を指定します。
fzf --border --border-label=' Files ' --border-label-pos=0 # 中央に表示 fzf --border --border-label=' Files ' --border-label-pos=3 # 左から3カラム目に表示 fzf --border --border-label=' Files ' --border-label-pos=3:bottom # 下部の左から3カラム目に表示
- --margin=MARGIN
- 外側の余白を指定します。
fzf --margin=5% # 上下左右5%分 fzf --margin=1 # 上下左右=1文字分 fzf --margin=1,2 # 上下=1, 左右=2 fzf --margin=1,2,3 # 上=1, 左右=2, 下=3 fzf --margin=1,2,3,4 # 上=1, 右=2, 下=3, 左=4
- --padding=PADDING
- 内側の余白を指定します。
fzf --padding=5% # 上下左右5%分 fzf --padding=1 # 上下左右=1文字分 fzf --padding=1,2 # 上下=1, 左右=2 fzf --padding=1,2,3 # 上=1, 左右=2, 下=3 fzf --padding=1,2,3,4 # 上=1, 右=2, 下=3, 左=4
選択欄
現在行
- --highlight-line
- 現在行をハイライト表示します。
fzf --highlight-line
- --pointer=STR
- 現在行を示すポインタ文字を指定します。
fzf --pointer='▶'
複数選択
- -m, --multi
- 複数選択を有効化します。
TABキーで選択/選択解除します。fd --type f | fzf -m
- +m, --no-multi
- 複数選択を無効化します(デフォルト)。
fzf +m
- --marker=STR
- 複数選択時の選択済みを示すマーカー文字を指定します。
fzf -m --marker='✓'
- --marker-multi-line=STR
- 複数選択時の選択済みを示すマーカー文字を、先頭の選択、中央の選択、最後の選択肢の3文字で指定します。環境によっては無視されるようです。
fzf -m --marker-multi-line='╻┃╹'
折り返し
- --wrap
- 1行が長い選択肢を折り返して表示します。デフォルトは省略表示します。
printf 'A%.0s' {1..300} | fzf --wrap - --wrap-sign=STR
- 1行が長い選択肢を折り返して表示する際の折り返しを示す文字を指定します。
fzf --wrap --wrap-sign='↳ '
- --ellipsis=STR
- 1行が長い選択肢を省略する際の省略を示す文字を指定します。
printf 'A%.0s' {1..300} | fzf --ellipsis='...' - --keep-right
- 1行が長い選択肢を省略して表示する際、右側表示を優先して左側を省略します。
printf 'A%.0s' {1..300} | fzf --keep-right - --no-multi-line
--read0と組み合わせた際、改行を含む選択肢を単一行で表示します。perl -e 'print("AAA\nAAA\0BBB\nBBB")' | fzf --read0 --no-multi-line
枠線
- --list-border[=BORDER_STYLE]
- 選択欄の枠線を表示します。
--borderがプレビューウィンドウやフッターを含めた全体の枠線を表示するのに対し、--list-borderはプレビューウィンドウやフッターを含めない枠線を指定します。fzf --list-border
- --list-label=LABEL
- 選択欄に表示するラベルを指定します。
fzf --list-border --list-label=' Files '
- --list-label-pos=POS
- 選択欄のラベルの位置を指定します。
POSの詳細は --border-label-pos を参照してください。fzf --list-border --list-label-pos=3
- --gutter=CHAR
- 左ガターに表示する文字を指定します。
fzf --gutter='#'
- --gutter-raw=CHAR
- RAWモード(
--raw)でガターを表示する際に表示する文字を指定します。fzf --gutter-raw='#'
スクロール
- --no-scrollbar
- スクロールバーを表示しません。
fzf --no-scrollbar
- --scrollbar=CHARS
- スクロールバーを示す文字を指定します。1文字目は選択欄のスクロールに、2文字目はプレビューウィンドウのスクロールに使用されます。
fzf --scrollbar='██'
- --scroll-off=N
- 上下スクロールのオフセット行数を指定します。ここで指定した行数分の項目が現在行の上下に表示されなくなればスクロールを開始します。
fzf --scroll-off=10
- --no-hscroll
- 水平スクロールを無効化します。環境によっては水平スクロールは機能しないようです。
fzf --no-hscroll
- --hscroll-off=N
- 水平スクロールの余白を指定します。
fzf --hscroll-off=20
- --freeze-left=COLS
- 水平スクロールする際、左側に残しておくカラム数を指定します。
ps -ef | fzf --freeze-left=16
- --freeze-right=COLS
- 水平スクロールする際、右側に残しておくカラム数を指定します。
ps -ef | fzf --freeze-right=20
その他
- --tabstop=N
- タブ幅を指定します。
fzf --tabstop=4
- --gap=LINES
- 選択候補間の隙間行数を指定します。
fzf --gap=1
- --gap-line=STR
- 選択候補間の隙間行を示す文字を指定します。
fzf --gap=1 --gap-line='-'
- --tac
- 選択肢を逆順に表示します。
seq 10 | fzf --tac
- --cycle
- 選択時の上下移動を循環させます。
fzf --cycle
- --raw
- RAWモードにします。入力欄に検索文字列を入力した際、マッチしなかった行も表示し続けます。
seq 20 | fzf --raw
- --jump-labels=CHARS
- ジャンプモードを使用する際、ジャンプ対象の行に表示されるラベルの文字集合を指定します。下記の例では
SPACEキーを押すとジャンプモードとなり、ラベル文字を押すとその行が選択決定されます。fzf --bind=space:jump,jump:accept --jump-labels=0123456789abcdefg
- --track
- 選択肢が動的に変更される場合、可能な限り現在選択している行が選択されたままの状態となるよう制御します。
(while true; do date; sleep 1; done) | fzf --track
入力欄
情報欄
- --info=STYLE
124/124など、選択肢の全体数と選択数を表示する情報欄の表示スタイルをdefault(デフォルト)、right(右側に表示)、hidden(表示しない)、inline(入力行にインライン表示)、inline-right(入力行の右端にインライン表示) のいずれかで指定します。inlineとinline-rightの場合は:PREFIXを指定することができます。fzf --info=right # 右端に表示 fzf --info=inline # インライン表示 fzf --info=inline:' / ' # ' / ' のプレフィックス付きでインライン表示
- --no-info
- 情報欄を表示しません。
fzf --no-info
- --info-command=COMMAND
- 情報欄をコマンドで生成します。
fzf --info-command='echo -e "\x1b[33;1m$FZF_POS\x1b[m/$FZF_INFO 💛"'
セパレーター
- --separator=STR
- 選択欄と入力欄を分離するセパレーターとして表示する文字列を指定します。
fzf --separator='─'
- --no-separator
- セパレーターを表示しません(デフォルト)。
fzf --no-separator
入力欄
- --prompt=STR
- 入力欄のプロンプト文字列を指定します。
fzf --prompt='検索> '
- --ghost=STR
- 入力欄のゴーストテキスト(プレースホルダー)として表示する文字列を指定します。
fzf --ghost='type to search'
- --no-input
- 入力欄を表示しません。
fzf --no-input
- --input-border[=BORDER_STYLE]
- 入力欄の枠線のスタイルを指定します。
BORDER_STYLEの詳細は --border を参照してください。fzf --input-border=rounded
- --input-label=LABEL
- 入力欄の枠線に表示するラベル。
fzf --input-border --input-label=' Query '
- --input-label-pos=POS
- 入力欄のラベルの位置を指定します。
POSの詳細は --border-rabel-pos を参照してください。fzf --input-border --input-label=' Query ' --input-label-pos=3
- --filepath-word
Alt-bやAlt-fによる単語単位の移動をパス単位で移動させます。例えばindex.htmlの末尾にカーソルがある時、通常だとAlt-bは拡張子htmlの先頭に移動しますが、--filepath-wordモードだとindex.htmlの先頭に移動します。fzf --filepath-word
プレビューウィンドウ
- --preview=COMMAND
- 選択欄の右側にプレビューウィンドウを表示します。プレビューウィンドウには
COMMANDで指定したコマンドの実行結果を表示します。下記の例では、プレビューウィンドウにファイルの中身の先頭120行を表示します。{}は対象ファイルを示します。fd --type f | fzf --preview='head -120 {}' - --preview-window=[POSITION][,SIZE][,border-STYLE][,OPTIONS][,+SCROLL][,~HEADER_LINES][,default][,<THRESHOLD(ALTERNATIVE)]
- プレビューウィンドウの見栄えを指定します。
POSITION:プレビューウィンドウの位置をright(右側:デフォルト)、top(上部)、bottom(下部)、left(左側) のいずれかで指定します。SIZE:プレビューウィンドウのサイズを行数またはパーセンテージで指定します。border-STYLE:枠線のスタイルをborder-roundedの様に指定します。STYLEは--borderを参照してください。OPTIONS:wrap(改行表示する)、nowrap(改行表示しない:デフォルト)、follow(ログファイルなどの更新にスクロールを追従させる)、nofollow(追従させない:デフォルト)、cycle(スクロールを循環させる)、nocycle(循環させない:デフォルト)、info(行数情報を表示する:デフォルト)、noinfo(表示しない)、hidden(プレビューウィンドウを隠す)、nohidden(隠さない) を指定します。+SCROLL:スクロール開始位置を指定します。+10は10行目を先頭に表示します。+{2}は選択欄の第2フィールドの値を行番号とみなし、その行を先頭に表示します。+{2}-3は第2フィールドの行番号の3行上を先頭に表示します。+{2}/4は第2フィールドの行を上から 1/4 の箇所に表示します。~HEADER_LINES:ヘッダ行数を指定します。例えば~3はプレビューウィンドウをスクロールしても先頭の3行を常に表示します。default:先行するオプションをすべて無効化し、デフォルト値で動作します。<THRESHOLD(ALTERNATIVE):プレビューウィンドウの大きさがTHRESHOLDを下回ると、ALTERNATIVEで指定したスタイルを適用します。例えば、<40(bottom)はプレビューウィンドウの大きさが40文字分を下回ったら、プレビューウィンドウを下部に表示します。
fzf --preview='head -120 {}' --preview-window='right,60%,border-rounded'rg -n foo | fzf -d : --preview='cat -n {1}' --preview-window='+{2},<40(top)' --bind='enter:become(vim +{2} {1})' - --preview-border[=BORDER_STYLE]
- プレビューウィンドウの枠線のスタイルを指定します。
BORDER_STYLEの詳細は--borderを参照してください。fzf --preview='head -120 {}' --preview-border=double - --preview-label=LABEL
- プレビューウィンドウのラベルを指定します。
fzf --preview='head -120 {}' --preview-label=' Preview ' - --preview-label-pos=POS
- プレビューラベルの位置を指定します。
--border-label-posを参照してください。fzf --preview='head -120 {}' --preview-label-pos=3
ヘッダー
固定行ヘッダー
- --header-lines=N
- 選択肢の先頭
N行を固定行ヘッダーとして常に表示します。ps -ef | fzf --header-lines=1
- --header-lines-border[=BORDER_STYLE]
- 固定ヘッダー行の枠線のスタイルを指定します。
BORDER_STYLEの詳細は--borderを参照してください。ps -ef | fzf --header-lines=1 --header-lines-border
情報ヘッダー
- --header=STR
- 情報ヘッダーに表示する文字列を指定します。
fzf --header='C-p:Up, C-n:Down, Enter:Select'
- --header-first
- 情報ヘッダーを先頭側に表示します。
fzf --header='C-p:Up, C-n:Down, Enter:Select' --header-first
- --header-border[=BORDER_STYLE]
- 情報ヘッダーの枠線のスタイルを指定します。
BORDER_STYLEの詳細は--borderを参照してください。fzf --header='C-p/C-n/Enter' --header-border
- --header-label=LABEL
- 情報ヘッダーのラベルを指定します。
fzf --header='C-p/C-n/Enter' --header-border --header-label='Help'
- --header-label-pos=POS
- 情報ヘッダーラベルの位置を指定します。
fzf --header='C-p/C-n/Enter' --header-border --header-label='Help' --header-label-pos=3
フッター
- --footer=STR
- フッターに表示する文字列を指定します。
fzf --footer='ESC: quit'
- --footer-border[=BORDER_STYLE]
- フッターの枠線のスタイルを指定します。
BORDER_STYLEの詳細は--borderを参照してください。fzf --footer='ESC: quit' --footer-border=rounded
- --footer-label=LABEL
- フッターのラベルを指定します。
fzf --footer='ESC: quit' --footer-label=' tip '
- --footer-label-pos=POS
- フッターラベルの位置を指定します。
fzf --footer='ESC: quit' --footer-label-pos=3
スクリプト
- -q, --query=STR
- 検索文字列の初期値を指定します。
fzf --query="README"
- -1, --select-1
- 候補が1件であれば自動的に確定します。
printf "one\n" | fzf -1
- -0, --exit-0
- 候補が0件であれば即時終了します。
printf "" | fzf -0
- -f, --filter=STR
- マッチするものを自動選択します。マッチするものが複数あれば複数選択します。
printf "%s\n" foo bar | fzf -f foo
- --print-query
- ユーザーが入力した検索文字列を選択結果の前に出力します。
printf "%s\n" foo bar | fzf --print-query
- --expect=KEYS
- ユーザーが確定に使用したキーを選択結果の前に出力します。
fzf --expect=ctrl-y,enter
- --no-clear
- 終了時に一覧画面や入力欄を消去しません。
fzf --no-clear
キー/イベントバインド
- --bind=KEY:ACTION[,..]
ctrl-aやenterなどのキーにアクションを割り当てます。fzf --bind='ctrl-a:select-all,ctrl-d:deselect-all'
下記の例では選択したファイルを
Enterでそのまま開きます。{}は選択行全体を、{1}は選択行の第1カラムを意味します。fd --type f | fzf --bind='enter:become(vim {})'下記の例では
Ctrl-Yで選択行をコピーします。git branch --all | fzf --bind='ctrl-y:execute-silent(echo {} | tr -d " " | xclip -selection clipboard)'下記の例では検索入力欄が変更される度に rg コマンドを再実行して選択候補を更新します。
fzf --disabled --bind='change:reload:rg --line-number --no-heading --color=always {q} || true' --ansiアクションの一覧は マニュアル を参照してください。
高度な機能
- --listen[=ADDR:PORT]
- 外部のプログラムから fzf を使用する際の待ち受けアドレスとポート番号を指定します。外部から指定できるアクションの一覧は マニュアル を参照してください。
# サーバー側 fzf --listen=127.0.0.1:6266 # クライアント側 curl -X POST localhost:6266 -d 'change-query:foo'
- --listen-unsafe
- listen の安全制約を緩和します。
fzf --listen-unsafe
- --with-shell=COMMAND
- execute 系で使うコマンドを指定します。
fzf --with-shell='bash -c'
ディレクトリ探索
標準入力なしで起動したときの探索対象を制御します。探索開始点(--walker-root)と除外(--walker-skip)を先に決めると、速度とノイズ低減の効果が大きくなります。
- --walker=SPEC
- fzf を標準入力無しで起動した時に探索するファイルの種類を
file(ファイル)、dir(ディレクトリ)、hidden(.で始まる隠しディレクトリ)、follow(シンボリックリンク先のファイル) で指定します。fzf --walker=file,dir
- --walker-root=DIR
- fzf を標準入力無しで起動した時に探索を開始するディレクトリを指定します。
fzf --walker-root=/work/myapp/src
- --walker-skip=PATTERN
- fzf を標準入力無しで起動した時に検索から除外するパターンを指定します。
fzf --walker-skip=.git,node_modules
履歴
- --history=FILE
- 入力欄に入力した文字列を履歴ファイルに保存し、次回選択時に
Ctrl-pで呼び出せるようにします。fzf --history=$HOME/.fzf-history
- --history-size=NUM
- 履歴ファイルの上限件数を指定します。
fzf --history=$HOME/.fzf-history --history-size=2000
シェル連携
- --bash
- Bash 用の設定スクリプトを出力します。例えば
~/.bashrcに下記の様に記述します。eval "$(fzf --bash)"
- --zsh
- Zsh 用の設定スクリプトを出力します。例えば
~/.zshrcに下記の様に記述します。eval "$(fzf --zsh)"
- --fish
- Fish 用の設定スクリプトを出力します。例えば
~/.config/fish/config.fishに下記の様に記述します。fzf --fish | source
その他
- --no-unicode
- Unicode 記号を使わないモードで表示します。
fzf --no-unicode
- --ambidouble
- 日本語の「○」や「●」など、Unicode で文字幅が曖昧とされている文字を全角扱いします。
fzf --ambidouble
- --no-mouse
- マウス操作を無効化します。
fzf --no-mouse
ヘルプ
現在バージョンで使えるオプションを確認するカテゴリです。環境差異があるため、挙動確認時はまず --version と --help を確認してください。
- --version
- バージョンを表示します。
fzf --version
- --help
- ヘルプを表示します。
fzf --help
- --man
- man 形式のヘルプを表示します。
fzf --man | man -l -
環境変数
- FZF_DEFAULT_COMMAND
- fzf を標準入力無しで実行した場合の選択肢を出力するコマンドを指定します。
export FZF_DEFAULT_COMMAND='fd --type f'
- FZF_DEFAULT_OPTS
- fzf コマンドのデフォルトオプションを指定します。
export FZF_DEFAULT_OPTS="--border --layout=reverse"
- FZF_DEFAULT_OPTS_FILE
- fzf コマンドのデフォルトオプションファイルを指定します。
export FZF_DEFAULT_OPTS_FILE=$HOME/.fzfrc
- FZF_CTRL_T_COMMAND
Ctrl-Tで表示するファイル候補の生成コマンドを指定します。export FZF_CTRL_T_COMMAND='fd --type f --hidden --exclude .git'
- FZF_CTRL_T_OPTS
Ctrl-Tの見た目やプレビューを指定します。export FZF_CTRL_T_OPTS='--preview="bat -n --color=always --line-range :120 {}"'- FZF_ALT_C_COMMAND
Alt-Cで表示するディレクトリ候補の生成コマンドを指定します。export FZF_ALT_C_COMMAND='fd --type d --hidden --exclude .git'
- FZF_ALT_C_OPTS
Alt-Cのオプションを指定します。export FZF_ALT_C_OPTS='--preview="tree -C {} | head -120"'
終了コード
fzf の実行結果は終了コードで判定できます。
0 # 選択確定(Enter) 1 # マッチ無し 2 # 実行時エラー 126 # becomeコマンドの権限エラー 127 # becomeコマンドの実行不正 130 # キャンセル(ESC)/中断(Ctrl-C)
Vim連携
fzf を Vim の中から呼び出すことができる Vim-Plugin が公開されています。例えば、Vim の中で、次に開くファイルを選択したり(:Files)、今開いているファイルの一覧から選択したり(:Buffers)、過去に開いたファイルの履歴を選択したり(:History) することができます。
インストール
Vim をインストールしてください。rg コマンドを使用するために ripgrep もインストールしてください。
# Ubuntu 24.04 $ sudo apt -y install vim ripgrep # RHEL / AlmaLinux / Rocky Linux # dnf -y install epel-release # dnf -y install vim ripgrep
Vim-Plus をダウンロードして ~/.vim/autoload/plug.vim という名前で保存してください。
curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
~/.vimrc に下記を追記してください。<Leader> キーは通常はバックスラッシュ(\) ですが Space キーに変更しています。
call plug#begin()
Plug 'junegunn/fzf', { 'do': { -> fzf#install() } }
Plug 'junegunn/fzf.vim'
call plug#end()
let mapleader = "\<Space>"
nnoremap <C-p> :Files<CR>
nnoremap <Leader>b :Buffers<CR>
nnoremap <Leader>h :History<CR>
nnoremap <Leader>r :Rg<Space>
let g:fzf_layout = { 'down': '40%' }
let g:fzf_preview_window = ['right:60%', 'ctrl-/']
Vim を起動してください。
vim
Vim から下記を実行してください。
:PlugInstall
Vim-Plug の使い方
:Files または Ctrl-p はカレントフォルダ配下のファイルを選択する fzf を起動します。
:Files
:Buffers または Space b は現在開いているファイルを選択する fzf を起動します。
:Buffers
:History または Space h は過去に開いたファイルの一覧から選択する fzf を起動します。
:History
:Rg または Space r は rg コマンドによる検索一覧を表示し、選択したファイルの選択行にジャンプします。
:Rg KEYWORD
よくあるハマりどころ
- Alt-C が効かない
- 端末や OS 側のキー割り当てで
Altが別用途になっていることがあります。端末設定で Meta キーを有効にしてください。 - Ctrl-R / Ctrl-T が効かない
~/.bashrcで fzf のキーバインド定義が読み込まれていない可能性があります。~/.fzf.bashの source を確認してください。- 候補表示が遅い
FZF_DEFAULT_COMMANDをfdベースにし、.gitや巨大ディレクトリを除外すると高速化できます。- 巨大ディレクトリ配下で極端に遅い
- 候補数が多すぎる可能性があります。
fd --hidden --exclude .git --exclude node_modules --exclude .cacheのように除外を増やすか、探索起点を絞ってください。--walker-skipでも除外できます。 - プレビュー表示が遅い / ちらつく
- プレビューコマンドが重い可能性があります。
batの代わりにsed -n "1,120p" {}など軽量なコマンドへ変更し、表示行数を減らしてください。必要なら--preview-window=right,50%,border-leftなどでサイズも小さくします。 - プレビューでバイナリが崩れて表示される
- 対象ファイルがテキストでない可能性があります。
file --mime {}で判定して、テキスト時のみ内容を表示するようにします。 - 端末によって枠線や記号が崩れる
- 端末フォントや Unicode 幅の差異が原因です。
--no-unicodeや--ambidoubleを試し、必要に応じて--style=minimalで装飾を減らしてください。 - tmux 内で表示が崩れる / 小さすぎる
--tmux bottom,80%,40%を使うか、通常端末向け設定(--height)と tmux 用設定を分けてください。- 色が出ない / ハイライトされない
- 入力側が色を出していないか、
fzf側で解釈していない可能性があります。入力コマンドを--color=alwaysにし、fzf --ansiを付けてください。 - 文字化けする
- 端末の文字コードとロケール(
LANG)を UTF-8 に揃えてください。