fzfをインストールしました。次に何をすればいいですか? (2023)
(andrew-quinn.me)fzfはインストール直後に Ctrl+R のコマンド履歴検索をファジー検索に改善する- Alt+C で正確なパスがなくても、以前の作業ディレクトリへすばやく移動できる
fzfコマンドは コマンド置換 と組み合わせることで、選んだファイルをvi、emacs、codeで直接開けるfindの結果をfzfに渡すと、nginx.conf のように場所が分からない設定ファイルを見つけやすくなるrg . | fzfはファイル名ではなくファイル内容の行を手がかりに、目的のファイルを開けるようにしてくれる
fzf をインストールした直後に得られる価値
- ソフトウェアエンジニアは自分の仕事を改善するツールを簡単に作れるが、複数のツールを渡り歩いて深く身につけないままだと、時間がたつほどコストが大きくなる
- 良い 80/20 のヒューリスティックとしては、まず
cat、ls、cd、grep、cutのような古い Unix ツールを身につけることであり、現代的なシステム管理の役割ではsedとawkも含まれる fzfは投資対効果が即座に現れ、その価値も独特なので、このヒューリスティックの例外と見なせる- 標準的な Ubuntu 環境で
fzfのインストールスクリプト を使って導入したあと、すぐ使える機能が核心である
基本ショートカットがもたらす即効性
-
Ctrl+R: コマンド履歴をファジー検索に変える- ほとんどの Linux と Windows のターミナルで、
Ctrl+Rはコマンドの 逆方向検索 を提供する - 標準の
Ctrl+Rでは、目的のコマンドを見つけるために 正確な一致 が必要で、一度に 1 つのプレビュー しか表示されないため、1 文字でも外すと見つけにくい fzfをインストールすると、いくつかのキーボードショートカットがより良い動作で上書きされ、Ctrl+Rも従来より大きく改善されるaptのようなパッケージマネージャーでインストールすると、このショートカット統合が提供されない場合があり、そのためfzfのインストールスクリプト を使う理由になる
- ほとんどの Linux と Windows のターミナルで、
-
Alt+C: うろ覚えのディレクトリへ素早く移動するfzfはAlt+Cを強化されたファジーcdショートカットに変えてくれる- ディレクトリの正確なパスを覚えていなくても、おおよその名前だけで素早く移動できる
- 何も入力していないターミナルで、長く訪れていないリポジトリや作業ディレクトリを探すときに便利である
fzf コマンド自体とシェルの組み合わせ
-
基本の
fzffzfコマンドをそのまま実行すると、現在のディレクトリを基準に相対ファイルパスをファジー検索する- 単体ではファイルの場所を選ぶ程度なので、活用の幅はそれほど大きくない
-
vi $(fzf)vi $(fzf)のようにコマンド置換と組み合わせれば、ファジー検索で選んだファイルをエディタでそのまま開ける- この方法は
viに特有のものではなく、emacs、nano、codeなど好みのエディタと一緒に使える
-
vi $(find . '/' | fzf)find . '/' | fzfをエディタと組み合わせると、場所の分からない設定ファイルをフルパス候補からファジー検索して開けるnginx.confのように場所を覚えていないファイルを探すとき、FHS の知識を思い出して推測したり暗記したりする代わりに、findの結果をfzfにパイプすればよいconf$のように検索すれば、confで終わる行だけをフィルタできるfindが大量のPermission deniedエラーに出会うと、fzfが一時的にもたつくことがあるが、数秒後には回復する- この数秒の遅延は、非常に単純な方法で設定ファイルを見つけられる利便性とのトレードオフになる
-
vi **<TAB>sigmonsaysの Hacker News コメントで紹介されていた機能として、ショートカットの上書きとfzfの直接実行の中間にあたる アスタリスク 2 つを使うファジーなタブ補完 があるvi **<TAB>はvi $(fzf)と似た形でファイルを選ぶのに使える- 実際のコマンドが補完されたあと、さらに
Enterを 1 回押す必要がある - bash と zsh ではうまく動くが、
fishでは動かないことがある $(fzf)を明示的に呼び出す方が覚えやすいなら、この機能はあまり使わないかもしれない
ファイル移動にも使える fzf
-
mv $(fzf) $(fzf)mv $(fzf) $(fzf)は、何を移動するかとどこへ移動するかを正確には覚えていないが、それぞれについて非常に具体的な手がかりだけは覚えているときに使える- 2 回の
fzf選択で、移動元と移動先を選ぶ方式である - GitHub README に GIF を入れる作業のように、ファイルを移動して配置するときによく役立つ
- 関連例として
finstemの interactive mode README が挙げられている
rg と組み合わせてファイル内容までファジー検索する
-
rg: 再帰検索が標準の高速なgrep- 以下の組み合わせは
grepでも可能だが、rgまたはripgrepは再帰検索が標準なので、この用途では特に強い - 例を試すなら、
rgをインストールして使うのが推奨される
- 以下の組み合わせは
-
rg . | fzfrg .はファイル内の各行を検索結果として出力し、これをfzfに渡すと、すべてのファイルのすべての行をファジー検索できる- ファイル名ではなく、ファイル内の行内容を手がかりに探す方法になる
-
rg . | fzf | cut -d ":" -f 1rg . | fzfで選んだ結果にcut -d ":" -f 1を付けると、コロン区切りの最初のフィールド、つまりファイルの場所を返せる- 行内容をファジー検索したあと、その行を含むファイルパスだけを取得する組み合わせである
-
vim $(rg . | fzf | cut -d ":" -f 1)vim $(rg . | fzf | cut -d ":" -f 1)は、すべてのファイルのすべての行をファジー検索したあと、選んだ行を含むファイルをvimで開く組み合わせである- ファイル名を覚えていなくても、内容の一部だけ覚えていればエディタをすぐ開ける
1件のコメント
Lobste.rs のコメント
この記事の 対象読者 がまさに自分のように思える。fzf をインストールして「天才的だ」と思ったあと、実際に使うのをずっと忘れていたけれど、これでもう使うようになるかもしれない
良い記事ではあるかもしれないが、「これから何をする?」に答えようという目的なら fzf シェル統合 から始めるのは、むしろさらに狭い読者層だけを相手にしている感じがする
bash で ctrl-r を使い慣れているのに、それを置き換えろと言うのは要求レベルが高すぎる。デフォルトを置き換えずに同じ動作を練習する方法から教えてほしかった
ctrl-r はたぶん自分が最もよく使うコマンドで、fzf は学習コストなしですぐにはまる改善だった。ctrl-r で起動するので fzf を使うのを忘れることもない。ただ、その後で Fish shell に移り、そこでは同じ動作がデフォルトで提供されている
納得した。近いうちに fzf と シェル統合 を追加するつもりで、今日は一つ学べた
コマンドに渡すファイルを探すときは
ctrl-tショートカット も使える。特定の変更に含めるファイルを選ぶときにgitと一緒によく使うし、grepの出力結果を絞り込んで検索範囲を狭めるのにも使ったことがあるシェル履歴検索の改善以外にも
fzfを次の 2 つの エイリアス と一緒に使ってきたalias gbd='git -c color.ui=never branch | fzf | xargs -I {} git branch -D {}'主にプルリクエストをマージしたあと、削除するローカルブランチの一覧を選ぶのに使っている。もっと良い方法があるかもしれないが、今のところ失敗したことはない
alias awp='export AWS_PROFILE="$(grep -e "\[\(.*\)\]" ~/.aws/config | sed -e "s/\[//g" | sed -e "s/\]//g" | cut -d " " -f 2 | sort -u | fzf)"'~/.aws/configにある値に応じて AWS_PROFILE をすばやく切り替えられる。今では Kubernetes のネームスペースを切り替える似たようなエイリアスも作ろうかと考えているfzf.vim プラグイン を使えば vim の中で fzf を使える。ファイルを開くだけでなく、バッファ、コマンド履歴、ファイル内容などもファジー検索できる
fzf の主な用途は、線形の Git コミット履歴 をたどって検索し、最近何が変わったのかを把握すること
自分のデフォルトの Git 設定では
git fzfをこう定義している何か見落としている気がする。何をするかも分からないのに、なぜ fzf をインストール するのか気になる
最近の関連投稿もある。あるユーザーが jj 用のファイルセレクタ として fzf を使っている
https://lobste.rs/s/exlogg/jjj