とほほのfzf入門

Linux で CLI や Vim を使用している人は是非使ってみて!
Ctrl-r でヒストリをあいまい検索して実行できるだけでもスグレもの!

目次

fzfとは

環境

本書は下記の環境で確認しています。

OS : AlmaLinux 10
Shell: Bash 5.2.26
fzf : 0.70.0

インストール

dnfapt でもインストールできますが、バージョンが古いので 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_NAMESfg(フォアグランド=テキスト)、bg(バックグランド=背景)、hl(ハイライト文字) などを指定します。他にも指定可能な項目は多いので詳細は リファレンスマニュアル を参照してください。
  • ANSI_COLORwhiteblackred などの色名や、015 の16色カラー番号、16255 の 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(入力行の右端にインライン表示) のいずれかで指定します。inlineinline-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-bAlt-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 を参照してください。
  • OPTIONSwrap(改行表示する)、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-aenter などのキーにアクションを割り当てます。
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_COMMANDfd ベースにし、.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 に揃えてください。