コマンドライン ファジーファインダー fzf を使うべき理由

by Alexey Samoshkin

Missing demo found

このチュートリアルでは、コマンドラインの習慣を次のレベルに引き上げるために fzf を紹介します。 プロ並みのファイル検索を始めましょう。 ディレクトリの変更、コマンド履歴の検索、SSH 接続するホスト名の検索、プロセスの終了、構文強調表示によるファイルのインスタント プレビューなど、あまり知られていない機能を学びます。 このツールは、あなたの技術ライフを「ビフォー」と「アフター」に変えることができます。 ファジーファインダーの略であるfzfを紹介します。 定義にあるように、これは汎用コマンドライン・ファジー・ファインダーです。 初めて聞く人には、あまり説明的で魅力的に聞こえませんね。 しかし、Githubで約21,000のスターを持つ、とても人気のあるプロジェクトなのです。 2068>

この投稿は、このトピックに関する私の最近のスクリーンキャストに付随するものです。 ですから、もしあなたが見て学ぶ人なら、それをチェックしてください。 なぜなら、fzf のようなツールは、大量のテキストよりもライブ デモで紹介するのがベストだからです。

fzf プロジェクト ページには今のところデモ ビデオがないので、この投稿を「見つからないデモ発見」と呼びました。 しかし現在、このビデオはすでに fzf レポに引き込まれ、プロジェクトの readme の一部となっています。

ファイルの検索

コマンドライン環境に慣れている人は、おそらく Unix フィルターの概念に馴染みがあるでしょう。 これは、いくつかの独立したユーティリティがパイプラインにまとめられ、必要な出力を段階的に生成するものです。 例えば、このパイプラインは文字列のリストを生成します:

$ yes | head -10 | awk '{ print NR, NR % 2 == 0 ? "even" : "odd" }'
1 odd2 even3 odd4 even5 odd6 even7 odd8 even9 odd10 even

各プログラムはフィルターとして機能します。 簡単に言うと、fzf は Unix のフィルタです。 これは stdin から行を読み、対話的な検索ダイアログを起動し、最後に選択された項目を stdout に書き込む。

“fzf” as a interactive unix filter

ここまではあまり実用的ではないかもしれませんが、fzf の主な使用例はコマンドライン上でファイルを検索することです。 ファジーマッチングと即時のフィードバックにより、ディレクトリ階層でどんなに深く迷子になっていても、数文字で正しいファイルを見つけることができます。 ファイルマネージャに戻り、ディレクトリ階層をたどり、ファイルのパスをコピーして、シェルに貼り付ける必要はありません。

fzf vs ファイル マネージャー比較

fzf ではファジー チェックをサポートしているので、いくつかの文字を連続して入力すると、その文字が文字列全体に散らばっている行にマッチします。 あるいは、検索語の前に 'string のようにシングルクォートを付けて完全一致のみを選択するか、または fzf --exact .

あいまい一致と完全一致

のように実行します。正規表現やグローバルパターンはサポートしていないので、*.sh パターンは機能しないでしょう。 しかし、シンプルであること – 生産性とスピードが今日の目標です。 正しい正規表現を作成し、入力するための時間はありません。 代わりに、いくつかの単語、あるいは単語の一部をスペースで区切って入力すれば、ユースケースの>90%はカバーできます。 残りの 10% では、use ^ and $ で文字列の最初と最後をそれぞれマッチさせ、use ! でマッチを否定します。

fzf マッチング構文

選択したファイルをコマンドラインに出力してもあまり意味はありませんので、通常は検索と何らかのアクションを組み合わせた形で実行します。 例えば、Vim で開いたり、選択したアイテムを次のプログラムにパイプしたりします。

# Open file in a Vimvim -o `fzf`
# Print info for each selected filefzf | xargs ls -l

Fuzzy completion for bash and zsh

より便利にするために、カーソル前の単語がデフォルトでは ** であるトリガーシーケンスで終わっている場合に、ファジー補完がトリガーされるようにすることができます。 例えば、vim ~/path/**と入力し、TABを押すと、その単語が補完されます。 2068>

Double star fuzzy completion

** sequence triggers fzf finder and it looks like * for native shell expansion.Voilà, fzf steps in!

Double star fuzzy completion

** sequence triggers …。

形式は以下の通りで、FUZZY_PATTERNはオプション。

COMMAND **<TAB>

もし**シーケンスが好きでなければ、キーボードショートカットを使うことができる。 CTRL+Tfzf をトリガーして選択したファイルをコマンドラインにペーストし、ALT+C は選択したディレクトリに移動します。

Changing directory

さて、ファイルの検索についてはもう十分でしょう。 他の便利なアプリケーションについて話しましょう。 作業ディレクトリを変更することは、非常に一般的な操作です。 しかし、それにもかかわらず、私はいつも正しいディレクトリのパスを呼び出して入力しようとして少し立ち往生し、途中で何度も間違えます。 テンポが悪くなる。 zshのコンプリートでも補えない。 しかし、fzfを使えば、どんなに深くて遠いところでも、ディレクトリの変更は楽勝です。 2068>

changing directory is like a breeze

fzf がディレクトリ ツリーをインデックス化している間、すぐに検索を開始できることに注意してください。 ディレクトリの変更は私のお気に入りの使用例で、ファジーマッチはここで本当に優れています。 ディレクトリの深さが 1 レベルでも 10 レベルでも、ディレクトリを変更するのに必要な労力は同じです。

ALT+C ショートカットは、ディレクトリ変更モードで fzf をトリガーする代替方法です。 しかし、ファジーファインダーでそれをさらに強化するのはどうでしょうか?

Searching through command history

Selected item on the command line, so you can tweak it further.

Search the host name to SSH into

もしあなたがバックエンド開発者で多数のリモート サーバーと仕事をしているなら、ssh+fzf コンボはありがたいかもしれませんね。 同じダブルスタートリガーシーケンスを使用して、ssh **と入力します。

“fzf + ssh” コンボ

Send a signal to a process

時にはプロセスにシグナルを送りたいことがありますが、最初にその PID を名前で取得する必要があります。 通常、pgrep <process_name> を使って PID を解決し、 by a kill <process_pid> でthat PID を参照しています。 fzf を使用すると、steps. Type kill <TAB> と fzf の両方のステップを組み合わせて、すべてのプロセスをリストアップすることができます。

プロセスを見つけてシグナルを送る

検索中にファイルをプレビューする

例えばファイルを検索しているとしましょう、しかし時にはファイル名だけでは十分にわからないことがあります。 そこで、判断するために、ファイルの内容を少し覗いてみたいと思うかもしれません。

Preview window

デフォルトではプレビュー ウィンドウはオフになっていますが、ファイルを覗きたいときはオンに切り替えています。 さらに、プレビュー コマンドとして bat を使用して、カラー出力と構文強調表示を強化しました。

カスタマイズ

純正バージョンの fzf をカスタマイズする方法は主に 2 つあります:

  • ファインダー ダイアログの動作(プレビュー ウィンドウ、キーボード ショートカット、寸法、カスタム操作など)を変更する。 環境変数 FZF_DEFAULT_OPTS を参照してください。
  • Find Backend を変更しました。 デフォルトでは GNU find ユーティリティを使用しますが、fd や ripgrep のようなより高度なツールに変更することもできます。 第一に、純正の find ユーティリティより高速です。 第二に、これらのツールは.gitignoreルールを尊重しているので、検索結果にnode_modules.gitのファイルが表示されることがない。 また、Git リポジトリにいるとき、git ls-tree を使ってファイルをリストアップすることもできます。 環境変数 FZF_DEFAULT_COMMAND を参照してください。

設定は環境変数で行います。 以下は、私の設定でのスニペットです。 コピー&ペーストでそのまま動くかどうかはわかりません。おそらく、他に足りない依存関係があるのでしょう。

Fzf と Vim

これまで、私たちはコマンドラインでの使用法だけを見てきました。 しかし fzf は Vim プラグインとしても出荷されています。 そして、もしあなたが Vimmer であるなら、vimrc に追加する価値があると信じています。 Vim の使い方はこの記事の範囲外です。そうでなければ誰も読まないでしょう? しかし、この記事の最初にリンクされている私のビデオの後半で、それについて徹底的に話しています。

もしあなたがせっかちなら、ここにあなたの注意を引くための小さな抜粋があります。 プロジェクト全体のテキスト検索に :grep コマンドを使用し、フル スクリーン モードで fzf ウィンドウにマッチを開き、さらに fzf 内でマッチをフィルターし、選択したマッチにジャンプすることができます。 また、正確な行位置でファイルを即座にプレビューできることも忘れてはいけません。 これはすごいですよね。

fzf ❤️ vim

Conclusion

fzf がいかに超すごいか、感動していただけましたでしょうか。 2068>

fzf はファイル検索が主な機能ですが、それだけにとどまらないことを覚えておいてください。 ご覧のように、「検索 + アクション」は一般的な原則ですが、ファイル、ディレクトリ、プロセス、ホスト名など、あらゆる種類のリストで動作するように抽象的で強力なものです。 この記事の冒頭で、fzfは単なるUnixフィルタであることを思い出してください。 あなたの想像力を解き放ち、どんなリストでも与えて、あなた自身のニーズに合わせてカスタマイズしてください。 豊富な例からインスピレーションを受けるかもしれません。

ところで、Unix の哲学がいかに優れているかを評価してください。 fzf はこれらの原則に従ったプログラムの素晴らしい例です。

  • プログラムにひとつのことをさせ、それをうまくやる (single responsibility principle)
  • 無関係な詳細やデータ型を無視できるほど抽象的にする
  • 標準のよく定義されたインターフェースを使って別々の個々のプログラムを構成する

ソフトウェア開発では、この原則に忠実であること。 複数のツール、言語、およびフレームワークの急速な誕生と消滅の背後にある基本原則を知ることが、プロの開発者とアマチュアの差別化につながります。 A command-line fuzzy finder – https://github.com/junegunn/fzf

Vim universe. fzf – command line fuzzy finder – YouTube – https://www.youtube.com/watch?v=qgG5Jhi_Els

My Youtube channel. スクリーンキャストの作成に最初の一歩を踏み出したので、まだ数本のビデオしかありません。 もっと多くのビデオを作ることを約束します。 Alexey Samoshkin – YouTube – https://www.youtube.com/channel/UCfju8u-YOpNMO4CbyzIsc9Q.

sharkdp/fd: シンプルで高速、かつユーザーフレンドリーな ‘find’ の代替 – https://github.com/sharkdp/fd

BurntSushi/ripgrep: 正規表現パターンに基づいてディレクトリを再帰的に検索 – https://github.com/BurntSushi/ripgrep

junegunn/fzf.vim: fzf vim – https://github.com/junegunn/fzf.vim

コメントを残す

メールアドレスが公開されることはありません。