1 ポイント 投稿者 GN⁺ 4 시간 전 | 1件のコメント | WhatsAppで共有
  • fzf はインストール直後に Ctrl+R のコマンド履歴検索をファジー検索に改善する
  • Alt+C で正確なパスがなくても、以前の作業ディレクトリへすばやく移動できる
  • fzf コマンドは コマンド置換 と組み合わせることで、選んだファイルを viemacscode で直接開ける
  • find の結果を fzf に渡すと、nginx.conf のように場所が分からない設定ファイルを見つけやすくなる
  • rg . | fzf はファイル名ではなくファイル内容の行を手がかりに、目的のファイルを開けるようにしてくれる

fzf をインストールした直後に得られる価値

  • ソフトウェアエンジニアは自分の仕事を改善するツールを簡単に作れるが、複数のツールを渡り歩いて深く身につけないままだと、時間がたつほどコストが大きくなる
  • 良い 80/20 のヒューリスティックとしては、まず catlscdgrepcut のような古い Unix ツールを身につけることであり、現代的なシステム管理の役割では sedawk も含まれる
  • fzf は投資対効果が即座に現れ、その価値も独特なので、このヒューリスティックの例外と見なせる
  • 標準的な Ubuntu 環境で fzf のインストールスクリプト を使って導入したあと、すぐ使える機能が核心である

基本ショートカットがもたらす即効性

  • Ctrl+R: コマンド履歴をファジー検索に変える

    • ほとんどの Linux と Windows のターミナルで、Ctrl+R はコマンドの 逆方向検索 を提供する
    • 標準の Ctrl+R では、目的のコマンドを見つけるために 正確な一致 が必要で、一度に 1 つのプレビュー しか表示されないため、1 文字でも外すと見つけにくい
    • fzf をインストールすると、いくつかのキーボードショートカットがより良い動作で上書きされ、Ctrl+R も従来より大きく改善される
    • apt のようなパッケージマネージャーでインストールすると、このショートカット統合が提供されない場合があり、そのため fzf のインストールスクリプト を使う理由になる
  • Alt+C: うろ覚えのディレクトリへ素早く移動する

    • fzfAlt+C を強化されたファジー cd ショートカットに変えてくれる
    • ディレクトリの正確なパスを覚えていなくても、おおよその名前だけで素早く移動できる
    • 何も入力していないターミナルで、長く訪れていないリポジトリや作業ディレクトリを探すときに便利である

fzf コマンド自体とシェルの組み合わせ

  • 基本の fzf

    • fzf コマンドをそのまま実行すると、現在のディレクトリを基準に相対ファイルパスをファジー検索する
    • 単体ではファイルの場所を選ぶ程度なので、活用の幅はそれほど大きくない
  • vi $(fzf)

    • vi $(fzf) のようにコマンド置換と組み合わせれば、ファジー検索で選んだファイルをエディタでそのまま開ける
    • この方法は vi に特有のものではなく、emacsnanocode など好みのエディタと一緒に使える
  • 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 . | fzf

    • rg . はファイル内の各行を検索結果として出力し、これを fzf に渡すと、すべてのファイルのすべての行をファジー検索できる
    • ファイル名ではなく、ファイル内の行内容を手がかりに探す方法になる
  • rg . | fzf | cut -d ":" -f 1

    • rg . | fzf で選んだ結果に cut -d ":" -f 1 を付けると、コロン区切りの最初のフィールド、つまりファイルの場所を返せる
    • 行内容をファジー検索したあと、その行を含むファイルパスだけを取得する組み合わせである
  • vim $(rg . | fzf | cut -d ":" -f 1)

    • vim $(rg . | fzf | cut -d ":" -f 1) は、すべてのファイルのすべての行をファジー検索したあと、選んだ行を含むファイルを vim で開く組み合わせである
    • ファイル名を覚えていなくても、内容の一部だけ覚えていればエディタをすぐ開ける

1件のコメント

 
GN⁺ 4 시간 전
Lobste.rs のコメント
  • この記事の 対象読者 がまさに自分のように思える。fzf をインストールして「天才的だ」と思ったあと、実際に使うのをずっと忘れていたけれど、これでもう使うようになるかもしれない

    • 要点は既存の シェル設定、個人スクリプト、エイリアスに統合すること。fzf はいつも使っているが、直接実行することはほとんどない
  • 良い記事ではあるかもしれないが、「これから何をする?」に答えようという目的なら fzf シェル統合 から始めるのは、むしろさらに狭い読者層だけを相手にしている感じがする
    bash で ctrl-r を使い慣れているのに、それを置き換えろと言うのは要求レベルが高すぎる。デフォルトを置き換えずに同じ動作を練習する方法から教えてほしかった

    • 実際には 強化されたデフォルト に近い。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 をこう定義している

    [alias]  
      # Browse commit history with fzf  
      # Inspired by: https://chrismanbrown.gitlab.io/67.html  
      fzf = "!git log --oneline --color=always --decorate=short $@ | \  
          fzf --ansi --reverse --no-sort \  
            --preview 'git show --color=always {1}' \  
            --preview-window '<50(down)' \  
            --bind 'enter:become(git show {1})' #"  
    
  • 何か見落としている気がする。何をするかも分からないのに、なぜ fzf をインストール するのか気になる

  • 最近の関連投稿もある。あるユーザーが jj 用のファイルセレクタ として fzf を使っている
    https://lobste.rs/s/exlogg/jjj