💬

fzfのインストール方法と初期設定

に公開

CLIでインクリメンタルサーチが可能になるツール。
pecoと類似しているが、fzfはデフォルトでコマンド履歴の検索やディレクトリ移動のキーバインディングなどが予め設定されており、カスタマイズしなくても便利な機能が揃っている。


インストール方法

以下のコマンドでインストール

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

上記を実行後、以下が表示されるが基本的にyでOK。

Do you want to enable fuzzy auto-completion? ([y]/n) y
Do you want to enable key bindings? ([y]/n) y
Generate /home/frey/.fzf.bash ... OKDo you want to update your shell configuration files? ([y]/n) y
Update /home/masaya/.bashrc:
  - [ -f ~/.fzf.bash ] && source ~/.fzf.bash
    + Added

Finished. Restart your shell or reload config file.
   source ~/.bashrc  # bash

Use uninstall script to remove fzf.

For more information, see: https://github.com/junegunn/fzf

Dockerfileなどに記述する際は対話形式でのインストールは避けたいので、
こちらに記載の--allオプションを使ってインストールすればよい。

~/.fzf/install --all

あるいはaptコマンドでもインストール可能

sudo apt install fzf

aptでインストールすると.fzf/installに相当するコマンドがないため、
ctrl + rでfzf起動などの初期設定ができない。
/usr/share/doc/fzf/examples/key-bindings.bashに設定ファイルが格納されているので、
これを~/.bashrcに書き込むことでショートカット起動の割り当てを有効化できる。

echo 'source /usr/share/doc/fzf/examples/key-bindings.bash' >> ~/.bashrc

dockerなどの環境構築で他のユーザーが別のユーザーに対してfzfの設定をしたい場合はこの方法を使う価値はありそう。

docker環境でaptでインストールすると何故か、/usr/share/doc/fzf/examples/key-bindings.bashがないケースが存在した。
そのような場合はgithubから直接DLして予め格納しておく。

sudo curl -s https://raw.githubusercontent.com/junegunn/fzf/master/shell/key-bindings.bash -Lo /usr/share/doc/fzf/examples/key-bindings.bash

バージョン指定したい場合は以下

FZF_VER=$(fzf --version | awk '{print $1}').0
sudo curl -s https://raw.githubusercontent.com/junegunn/fzf/v${FZF_VER}/shell/key-bindings.bash -Lo /usr/share/doc/fzf/examples/key-bindings.bash

設定の変更

export FZF_DEFAULT_OPTS="--ansi -e --prompt='QUERY> ' --layout=reverse --border=rounded --height 100%"
export FZF_CTRL_T_OPTS="--preview 'fzf-preview.sh {}' --bind 'focus:transform-header:file --brief {}'"
export FZF_ALT_C_OPTS="--preview 'exa {} -h -T -F  --no-user --no-time --no-filesize --no-permissions --long | head -200'"
  • FZF_DEFAULT_OPTSはfzfをデフォルトで起動した時のオプション
  • FZF_CTRL_T_OPTSctrl + Tでのカレントディレクトリ配下のファイル検索時のオプション
    • fzf-preview.sh については公式で提供されているので以下のコマンドなどでPATHが通っているディレクトリに配置
      sudo curl -s "https://raw.githubusercontent.com/junegunn/fzf/v${FZF_VER}/bin/fzf-preview.sh" -Lo /usr/local/bin/fzf-preview.sh
      sudo chmod +x /usr/local/bin/fzf-preview.sh
      
    • ファイルを選択した状態でEnter押下でコマンドラインにファイル名が出力される
    • 適当なエディタ、例えば、vim と入力した後にctrl + Tでファイルを選択してEnterでvimで選択したファイルを簡単に開くことができる。
  • FZF_ALT_C_OPTSalt + cカレントディレクトリ配下のディレクトリ移動を可能にするオプション
    • ezaについてはezaのインストール方法を参照
    • 選択した状態でEnterを押下すると移動できる。
    • 上記オプションを付けることで選択している検索結果のディレクトリ配下をtree表示できる。

FZF_DEFAULT_OPTS_FILEについて

FZF_DEFAULT_OPTSに必要なオプションを記述すると文字列が長くなってしまう、かつ可読性が低くなるので、FZF_DEFAULT_OPTS_FILEという環境変数が公式で提供されている。
FZF_DEFAULT_OPTSに本来記述するオプション群を.fzfrcに記述し、FZF_DEFAULT_OPTS_FILEにそのパスを設定することで、FZF_DEFAULT_OPTSを使用しなくてもデフォルトオプションを設定することができる。
ユーザーのホームディレクトリ直下に格納しておくのが無難。

~/.fzfrc
--ansi
-e
--prompt='QUERY> '
--layout=reverse
--border=rounded
--height 100%

fzf-tmux

公式で提供されているfzf-tmuxを設定するとtmux使用中に現在のペインの分割状態に依存することなくfzfの画面を表示することができる。
※デフォルトではtmuxのウィンドウの中央に表示される

sudo curl -s "https://raw.githubusercontent.com/junegunn/fzf/v${FZF_VER}/bin/fzf-tmux" -Lo /usr/local/bin/fzf-tmux
sudo chmod +x /usr/local/bin/fzf-tmux

なお、fzf-tmux使用時に起動するfzfに設定を適用したい場合はFZF_TMUX_OPTSの環境変数にオプションを記述すればよい

export FZF_TMUX_OPTS="-p 80%"

■ 追加設定

デフォルトではfzffindコマンドを使って動作するが、オプションで使用するコマンドを変更することができるのでfindより高速での検索が可能なfdコマンドに置き換える。
以下のコマンドでfdのインストール

sudo apt install -y fd-find
mkdir -p ~/.local/bin
ln -s $(which fdfind) ~/.local/bin/fd

既存の設定に追加してFZF_*_COMMANDを追記

export FZF_DEFAULT_COMMAND="fd -H -E .git --color=always"
export FZF_CTRL_T_COMMAND="fd --type f -H -E .git"
export FZF_ALT_C_COMMAND="fd --type d -H -E .git"

FZF_*_COMMANDの設定を行うことで各キーバインドでのfzf実行時に使用するコマンドを設定することができる。今回は隠しファイル・フォルダも含めて表示するように変更した。


Tips

■ 現在のディレクトリ配下を全文検索

以下を参考に実装、スクリプト名はtfzとして~/bin配下に格納
カレントディレクトリ配下をfzf+grep(rg)でインクリメンタルに全文検索したあとにvimで開く #Vim - Qiita

事前に$EDITORの環境変数を設定しておくこと。
vimを設定する場合は以下のコマンドで~/.bashrcに追記できる。

echo "export EDITOR=vim" >> ~/.bashrc

ctrl + fで検索できるように~/.bashrcに記載しておくとよい

echo bind '"\C-f":"tfz\C-m"' >> ~/.bashrc

また、依存パッケージとしてripgrepが必要なので注意。
以下のコマンドでripgrepのインストール

sudo apt install -y ripgrep

■ fzf-tab-completion

bashのTAB補完機能にfzfを結合するツール
以下の手順でスクリプトを配置

git clone https://github.com/lincheney/fzf-tab-completion.git ~/Downloads/fzf-tab-completion
mkdir -p ~/.config/bash/scripts
cp ~/Downloads/fzf-tab-completion/bash/fzf-bash-completion.sh ~/.config/bash/scripts/
rm -rf ~/Downloads/fzf-tab-completion

ただし、最新のスクリプトにはバグがあるため、以下の対応をマージする必要があるので注意。
fix(bash/fzf): fix the command with flags by agronskiy · Pull Request #120 · lincheney/fzf-tab-completion
また、内部でcatコマンドが使われているため、catにエイリアスを設定している場合は正しく動作しないことがあるので注意。
※筆者はcatのエイリアスとしてbatを設定していたので上手く動作しなかった。
エイリアスを解除したくない場合は、スクリプト内のcatの記述を\catにし、エイリアスを無視して元のcatコマンドを使用するように変更しておく。

上記対応後、~/.bashrcに以下を追記

source ~/.config/bash/scripts/fzf-bash-completion.sh
bind -x '"\t": fzf_bash_completion'

これにより、TAB入力時に候補として表示される文字列をインクリメンタルサーチして選択可能
※fzfを介する分、デフォルトのTAB補完よりはパフォーマンスが落ちてしまうので、気になる場合はTAB以外のキーにfzf_bash_completionを割り当てることを推奨
個人的にはShift+TABを推奨

source ~/.config/bash/scripts/fzf-bash-completion.sh
bind -x '"\e[Z": fzf_bash_completion'

■ color theme

fzf - ADVANCED.md#color-themesでfzfの見栄えをカスタマイズするための--colorオプションが提供されている。
適当なものをコピーしてFZF_DEFAULT_OPTSに記載するか、.fzfrcに記述すればよい。


reference

■ fd

■ ripgrep

Discussion