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
という環境変数に指定する事が出来ます。
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番最後に詳細を記載してます!
# 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%
デフォルトは100%のため今までターミナルに表示していた内容が消えてしまいます。
(基本的な使い方に添付している動画参照)40%〜70%辺りを指定する事で現在の表示内容を残したまま検索結果を表示出来ます。
—layout
こちらもfzfを利用する際には必ず指定したいオプションの1つ!
入力した検索ワードの表示位置。
以下の3種類が指定可能。
- default
- reverse(おすすめ)
- reverse-list
$ fzf --layout=reverse
reverse
を指定すると検索ワードが先ほどまでのリストの下ではなく上に来ます。
—border
fzfの検索エリアをborderで囲ってくれます
$ fzf --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 {}"
例えば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リポジトリをサマリを表示しながら検索しつつ移動するコマンド
を記載します!
コメントに内容の詳細を記載します
### 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
については
にそれぞれ記載してますので興味を持たれた方はよければどうぞ!