超便利なインクリメンタルサーチ用コマンド!fzf

超便利なインクリメンタルサーチ用コマンド!fzf

Go製のインクリメンタルサーチ用のコマンド fzf。

tmux や vim にも導入が出来て、豊富なオプションも用意されていて使いやすいコマンドです!



特にプレビューを表示しながらのインクリメンタルサーチが便利!




この手のコマンドだとよく peco と比較される印象で、

私的にはオプションが豊富な fzf の方が好みです。



この記事では fzf の基本的な使い方、オプションについて記載します!


インクリメンタルサーチとは

検索したい単語を入力する度に検索が行われる、検索方法の1つ。


一文字目:検

検索結果:索の動作検証のため査員が点を行ったところ、索に失敗した



二文字目:検索

検索結果:検索の動作検証のため検査員が点検を行ったところ、検索に失敗した。



三文字目:検索に

検索結果:検索の動作検証のため検査員が点検を行ったところ、検索に失敗した。



参考: インクリメンタルサーチ - Wikipedia より引用

検証した環境

1 fzf 0.35.1

インストール

Macを使っている人はhomebrewで簡単にインストール出来ます!

$ brew install fzf
 
# キーバインドやファジーコンプリートをインストール
$ $(brew --prefix)/opt/fzf/install

それ以外のインストール方法は公式GitHubを参考に

junegunn/fzf: A command-line fuzzy finder


私が行っている設定・使用例

「fzf の概要は何となく知ってるよ」という人向けに、私が行っている設定と使用例を先に記載します。

オプションの設定

fzfのデフォルトのオプション設定をFZF_DEFAULT_OPTSという環境変数に指定する事が出来ます。

~/.zshrc
export FZF_DEFAULT_OPTS="--height 50% --layout=reverse --border \
--preview-window 'right:50%' \
--bind 'ctrl-/:change-preview-window(80%|hidden|)' \
--bind 'ctrl-u:preview-half-page-up,ctrl-d:preview-half-page-down'"

長く難しそうに感じるかもですが、、

詳しい事は後述するので、それぞれの行の設定内容をザッと記載すると


  • ターミナルの画面に対して50%の高さで表示・reverseという表示方法・borderを表示
  • プレビューを表示する際は右側に50%の大きさで
  • ctrl + /を押下する事でプレビューウィンドウを 80% → 隠す → 50% → 80%・・ と切り替えられるように
  • ctrl + uでプレビューウィンドウを画面半分上スクロール・ctrl + dでプレビューウィンドウを画面半分下スクロール

となっています!



使用例

私が実際にfzfを用いているものの1つとして

ローカルのGitリポジトリをサマリを表示しながら検索しつつEnterを押下時にcdするコマンド をご紹介。





コマンドの内容については、本文1番最後に詳細を記載してます!

~/.zshrc
# fzfのデフォルト設定
export FZF_DEFAULT_OPTS="--height 50% --layout=reverse --border \
--preview-window 'right:50%' \
--bind 'ctrl-/:change-preview-window(80%|hidden|)' \
--bind 'ctrl-u:preview-half-page-up,ctrl-d:preview-half-page-down'"
 
 
function change-git-directory-with-incremental-search () {
  local WORKDIR=$(ghq list -p | fzf --preview "onefetch --show-logo never {}" --preview-window=right,50% --height 70%)
  [ -z "$WORKDIR" ] && return
  cd $WORKDIR
}
 
alias gr='change-git-directory-with-incremental-search'


基本の使い方

ファイルに対してインクリメンタルサーチ

fzfはデフォルトで現在のフォルダのファイル群に対してインクリメンタルサーチを行います。


例えば以下のコマンドを実行するとドキュメントフォルダ内のファイルをインクリメンタルサーチします

$ cd ~/Documents
$ fzf



パイプを使って一覧にしたものを渡す事も出来ます

# 現在のフォルダ内のファイルを一覧で取得し、fzfに渡す
$ find * -type f | fzf

fzfのリポジトリ内で検索した場合



検索したファイルに対してアクションを行う

$()を使用する事でfzfの結果に対して処理を行う事も可能。

例えば、検索したファイルの中身を確認する事も簡単です。

# 現在のフォルダ内のファイルを一覧で取得し、fzfで検索。検索したファイルをcatして中身を確認する
$ cat $(find * -type f | fzf)
 
# xargsでも同じような事が可能
# $ find * -type f | fzf | xargs cat

オプション

fzf は便利なオプションが沢山用意されています!


—height

fzfを利用する際には必ず指定したいオプションの1つ!


検索時の高さを指定します。

$ fzf --height 50%
--heightを使って高さを指定する

デフォルトは100%のため今までターミナルに表示していた内容が消えてしまいます

(基本的な使い方に添付している動画参照)

40%〜70%辺りを指定する事で現在の表示内容を残したまま検索結果を表示出来ます


—layout

こちらもfzfを利用する際には必ず指定したいオプションの1つ!



入力した検索ワードの表示位置。

以下の3種類が指定可能。

  • default
  • reverse(おすすめ)
  • reverse-list
$ fzf --layout=reverse
--layoutで表示方法を指定する

reverseを指定すると検索ワードが先ほどまでのリストの下ではなく上に来ます


—border

fzfの検索エリアをborderで囲ってくれます

$ fzf --border
--borderで検索エリアにborderを表示する

どこまでが fzf の内容か分かりやすくなる反面、

検索エリアの表示が微妙に小さくなるので好みが分かれそうですねー。


—preview

常に指定すべきオプションではないものの、fzfが便利と言わしめるオプションの1つです!



現在カーソルが合っているファイル・フォルダに対して、プレビューウィンドウで指定した処理を行う事が出来ます。


何を言ってるか分かりづらいと思うので実例で

# {}が現在されている行の内容に置き換えられる
$ find * -type f | fzf --layout=reverse --preview "cat {}"

インクリメンタルサーチしている右側に表示されているのが「プレビューウィンドウ」。


—previewの使い方は --prevew "/* プレビューウィンドウで実行する内容 */" で、

↑の場合は「cat を用いてファイルの中身を確認する」となります。




ここで良く登場するのが bat という cat を拡張したライブラリ

batを簡単に記載すると 「シンタックスハイライトが効くcat」 です。



# batは --color=always というオプションを指定する事で必ずシンタックスハイライトを実行する
$ find * -type f | fzf --layout=reverse --preview "bat --color=always {}"

シンタックスハイライトが効いて、格段に見えやすくなりましたね ☺️



—preview-window

プレビューウィンドウの表示位置・大きさを設定します



指定方法は

  • 表示位置・・up,down,left,right
  • 表示サイズ・・○○%

$ find * -type f | fzf --layout=reverse --preview-window=down,60% --preview "bat --color=always {}"
--preview-windowでdown.60%を指定した場合

例えばdownを指定すると↑のようにプレビューウィンドウが下に表示されます。



—bind

キーバインディングの設定が出来ます!

発想次第で便利に出来るかなり面白いオプションです!



例えば

  • 特定のキーを押下した際にプレビューウィンドウの大きさを変える
  • 特定のキーを押下した際にプレビューウィンドウをページ送りする

といったことが出来ます。



記載の仕方は以下のように

# 1つ指定する場合、ctrl + c でfzfの実行をキャンセル
$ fzf --bind=ctrl-c:cancel
 
# 複数指定する場合は , で繋ぐ
# ctrl + dでpage-down・ctrl + uでpage-up が実行される
$ fzf --bind=ctrl-d:page-down,ctrl-u:page-up


指定出来るキーの組み合わせ・実行出来るアクションは以下ページにまとめられています!

fzf command man page | ManKier



プレビューのサイズを変更する

ctrl + / でプレビューウィンドウのサイズを切り替えられます。

$ find * -type f | fzf --layout=reverse --bind 'ctrl-/:change-preview-window(80%|hidden|)' --preview "bat --color=always {}"

「プレビューウィンドウを大きくして詳細を見たいな」という場面に便利!



プレビューの内容をページ移動する

プレビューウィンドウに表示されている内容を

  • ctro + u で半分を上に移動
  • ctro + d で半分を下に移動
$ find * -type f | fzf --layout=reverse \
--bind 'ctrl-u:preview-half-page-up,ctrl-d:preview-half-page-down' \
--preview "bat --color=always {}"

プレビューの内容を細かく確認したい時に便利です! ☺️



Gitリポジトリをサマリを表示しながら検索する

ここまでのまとめとして

ローカルのGitリポジトリをサマリを表示しながら検索しつつ移動するコマンド

を記載します!


コメントに内容の詳細を記載します
~/.zshrc
### fzfのデフォルト設定
# ターミナルの高さ50%でfzfを表示、layoutはリバース、borderを表示
# プレビューウィンドウを使う際はデフォルトで 右側に50% で表示
# ctrl + / でプレビューウィンドウのサイズを変更
# ctrl + u, ctrl + d でプレビューウィンドウの内容をページ移動
export FZF_DEFAULT_OPTS="--height 50% --layout=reverse --border \
--preview-window 'right:50%' \
--bind 'ctrl-/:change-preview-window(80%|hidden|)' \
--bind 'ctrl-u:preview-half-page-up,ctrl-d:preview-half-page-down'"
 
 
### Gitのリポジトリをインクリメントサーチし、Enterキーを押下した際に該当フォルダに移動
function change-git-directory-with-incremental-search () {
  local WORKDIR=$(ghq list -p | fzf --preview "onefetch --show-logo never {}" --preview-window=right,50% --height 70%)
  [ -z "$WORKDIR" ] && return
  cd $WORKDIR
}
 
### gr と打つ事で↑関数を起動
alias gr='change-git-directory-with-incremental-search'

「Gitのリポジトリを検索する際にサマリ表示する必要ある?」と聞かれたら

自己満足のために感が強いですが 😂




このコマンドを実行するために

  • Gitのリポジトリ管理に ghq
  • Gitのリポジトリサマリの表示に onefetch

をそれぞれ使用しています。




ghqについてはこちら


onefetchについては

にそれぞれ記載してますので興味を持たれた方はよければどうぞ!

プロフィール画像
Yuki Takara
都内でフリーランスのエンジニアをやってます。フロントとアプリ開発メインに幅広くやってます。