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
の主な使用例はコマンドライン上でファイルを検索することです。 ファジーマッチングと即時のフィードバックにより、ディレクトリ階層でどんなに深く迷子になっていても、数文字で正しいファイルを見つけることができます。 ファイルマネージャに戻り、ディレクトリ階層をたどり、ファイルのパスをコピーして、シェルに貼り付ける必要はありません。
fzf
ではファジー チェックをサポートしているので、いくつかの文字を連続して入力すると、その文字が文字列全体に散らばっている行にマッチします。 あるいは、検索語の前に 'string
のようにシングルクォートを付けて完全一致のみを選択するか、または fzf --exact
.
のように実行します。正規表現やグローバルパターンはサポートしていないので、*.sh
パターンは機能しないでしょう。 しかし、シンプルであること – 生産性とスピードが今日の目標です。 正しい正規表現を作成し、入力するための時間はありません。 代わりに、いくつかの単語、あるいは単語の一部をスペースで区切って入力すれば、ユースケースの>90%はカバーできます。 残りの 10% では、us
e ^ an
d $ で文字列の最初と最後をそれぞれマッチさせ、us
e ! でマッチを否定します。
選択したファイルをコマンドラインに出力してもあまり意味はありませんので、通常は検索と何らかのアクションを組み合わせた形で実行します。 例えば、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>
**
sequence triggers fzf
finder and it looks like *
for native shell expansion.Voilà, fzf steps in!
**
sequence triggers …。
形式は以下の通りで、FUZZY_PATTERN
はオプション。
COMMAND **<TAB>
もし**
シーケンスが好きでなければ、キーボードショートカットを使うことができる。 CTRL+T
は fzf
をトリガーして選択したファイルをコマンドラインにペーストし、ALT+C
は選択したディレクトリに移動します。
Changing directory
さて、ファイルの検索についてはもう十分でしょう。 他の便利なアプリケーションについて話しましょう。 作業ディレクトリを変更することは、非常に一般的な操作です。 しかし、それにもかかわらず、私はいつも正しいディレクトリのパスを呼び出して入力しようとして少し立ち往生し、途中で何度も間違えます。 テンポが悪くなる。 zshのコンプリートでも補えない。 しかし、fzf
を使えば、どんなに深くて遠いところでも、ディレクトリの変更は楽勝です。 2068>
fzf がディレクトリ ツリーをインデックス化している間、すぐに検索を開始できることに注意してください。 ディレクトリの変更は私のお気に入りの使用例で、ファジーマッチはここで本当に優れています。 ディレクトリの深さが 1 レベルでも 10 レベルでも、ディレクトリを変更するのに必要な労力は同じです。
ALT+C
ショートカットは、ディレクトリ変更モードで fzf
をトリガーする代替方法です。 しかし、ファジーファインダーでそれをさらに強化するのはどうでしょうか?
Selected item on the command line, so you can tweak it further.
Search the host name to SSH into
もしあなたがバックエンド開発者で多数のリモート サーバーと仕事をしているなら、ssh+fzf
コンボはありがたいかもしれませんね。 同じダブルスタートリガーシーケンスを使用して、ssh **
と入力します。
Send a signal to a process
時にはプロセスにシグナルを送りたいことがありますが、最初にその PID を名前で取得する必要があります。 通常、pgrep <process_na
me> を使って PID を解決し、 by a kill <pro
cess_pid> でthat P
ID を参照しています。 fzf を使用すると、steps. Typ
e kill <TAB> と fzf の両方のステップを組み合わせて、すべてのプロセスをリストアップすることができます。
検索中にファイルをプレビューする
例えばファイルを検索しているとしましょう、しかし時にはファイル名だけでは十分にわからないことがあります。 そこで、判断するために、ファイルの内容を少し覗いてみたいと思うかもしれません。
デフォルトではプレビュー ウィンドウはオフになっていますが、ファイルを覗きたいときはオンに切り替えています。 さらに、プレビュー コマンドとして 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
内でマッチをフィルターし、選択したマッチにジャンプすることができます。 また、正確な行位置でファイルを即座にプレビューできることも忘れてはいけません。 これはすごいですよね。
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