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_OPTSはctrl + 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_OPTSはalt + 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を使用しなくてもデフォルトオプションを設定することができる。
ユーザーのホームディレクトリ直下に格納しておくのが無難。
--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%"
■ 追加設定
デフォルトではfzfはfindコマンドを使って動作するが、オプションで使用するコマンドを変更することができるので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
- junegunn/fzf
- fzf(fuzzy finder)の便利な使い方をREADME, Wikiを読んで学ぶ
- fzfのpreview関連のオプション調べてみた
- aptで入れたfzfで履歴の曖昧検索とかを有効にしたい (zenn.dev)
- fzfを導入してterminalでの作業効率を爆上げする
- fzfの使い方をマスターして作業効率をアップさせよう!
- カレントディレクトリ配下をfzf+grep(rg)でインクリメンタルに全文検索したあとにvimで開く
- lincheney/fzf-tab-completion: Tab completion using fzf
■ fd
- Linuxメモ : Rust製のfdコマンド(findコマンド代替)の使い方 - もた日記 (hatenablog.com)
- 高速で記述が簡単な find コマンドの代替「fd」 (zenn.dev)
Discussion