fzfコマンドの概要
1. 序章
このチュートリアルでは、 fzf コマンドを使用して、テキストやファイルのリストなどでファジー検索を実行する方法を学習します。 また、生産性を向上させるためのfzfユーティリティの基本的なアプリケーションと高度なアプリケーションについても説明します。
2. fzfについて
ファジー検索は、完全一致ではなく、近似文字列一致手法を適用することで機能します。 次に、結果はランキングスコア順に並べられます。
fzf は、 stdin から行を読み取り、あいまい検索を使用して行をフィルター処理し、フィルター処理された行をstdoutに転送する対話型コマンドラインフィルターです。 スクリプトモードとインタラクティブモードの両方をサポートします。 インタラクティブモードでは、fzfは検索パラメーターを読み取るためのインターフェースを提供し、外出先で入力をフィルター処理します。
fzf は、正規表現やグロブ検索ではなくファジー検索を実行するため、 grepやfind、とは異なる方法で機能します。
3. インストール
fzfはほとんどのパッケージリポジトリにあります。 Debianベースのディストリビューションでは、 apt:を使用してfzfをインストールできます。
$ sudo apt install fzf
ソースからインストールするには、GitHubのfzfを参照してください。
4. 基本的な使用法
通常、 fzfは、 ps、、 apt-cachesearchなどの別のプログラムのstdoutからパイプされます。 fzf がパイプ処理されていない場合、 find を呼び出して、現在のディレクトリの下にあるすべての非表示でないファイルを再帰的に一覧表示し、ファイル名の一覧で検索を開始します。
$ fzf
プログラムインターフェイスはデフォルトでフルスクリーンモードで開始され、検索は下部から開始されます。 引数を使用して動作を変更できます。
--reverse
Display from the top of the screen
--height N%
Use only N% height instead of full screen.
--query PARAM
Begin search with PARAM as the initial query
--multi
Enable multi-select with tab/shift-tab.
-f, --filter PARAM
Show matches for PARAM without the interactive finder
fzfファインダーを50% heightで開始し、 .md:で終わるファイルを表示するには
$ fzf --reverse --multi --height 50% --query=.md$
スクリプトモードでfzfを実行し、インタラクティブファインダーを無効にするには:
$ fzf -f .md$
利用可能なすべてのオプションは、のマニュアルページにあります。
4.1. シェルキーバインディング
インストール中に、 fzf は、シェルへの3つのキーバインディングを有効にします。
- CTRL-R : $ HISTFILE に基づいて最近の履歴を検索し、選択したエントリを端末に返します
- CTRL-T: $ PWD でファイル名を再帰的に検索し、選択したエントリを端末に返します
- ALT-C:は、 $ PWD の下のディレクトリ名を再帰的に検索し、cdを選択したエントリに挿入します
4.2. ファイル名オートコンプリート
ターミナルでは、 fzf をトリガーして、 ** と入力し、用語の後にTabキーを押して、ファイル名をオートコンプリートできます。
$ ls /etc/sorce**<TAB>
> source
64/3158
> /etc/apt/sources.list
/etc/apt/sources.list.d
/etc/apt/sources.list.save
ls の引数は最初は正しくありませんが、fzfは正しいファイルパスを返すことに注意してください。
4.3. コマンドオートコンプリートを強制終了
killとfzfを使用すると、信号を送信するプロセスを簡単に選択できます。 kill -SIGNAL の後、Tabキーを押して fzf プロセスファインダーを表示し、目的のプロセスを選択してpid値をオートコンプリートします。
$ kill -18 <TAB>
> gedit<ENTER>
55/295
> user 8841 1 0 09:03 ? 00:00:01 gedit
$ kill -18 8841
4.4. さまざまな検索モードの使用
fzfは複数の検索モードをサポートしています。 fzf が各モードでどのように動作するかを確認するために、プレーンテキストファイルを作成しましょう。
$ tee /tmp/fzf.in <<EOF
I mean to confound these bungers
I swallowed a bug
Was that the Primary Buffer Panel?
Captain Reynolds
EOF
fzf は、デフォルトでファジーモードで検索します。 「bug」という単語を検索すると、ヒアドキュメントの2行目は1行目よりも一致度が高く、3行目と4行目は一致していません。
$ cat /tmp/fzf.in | fzf -f bug
I swallowed a bug
I mean to confound these bungers
ファジーモードの代わりに、 キーワードの前にアポストロフィを付けて、完全モードで一致させることができます:
$ cat /tmp/fzf.in | fzf -f \'bug
$ #cat /tmp/fzf.in | fzf -f "'bug"
I swallowed a bug
1行目と2行目は同等です。 シェルで特別な意味を持つすべての文字は、引用符で囲まれていない場合はエスケープする必要があります。
否定モードは完全モードでキーワードと一致し、一致する行を除外します。否定のキーワードの前に!を付けることができます。
$ cat /tmp/fzf.in | fzf -f \!bug
I mean to confound these bungers
Was that the Primary Buffer Panel?
Captain Reynolds
^と$を使用して、部分文字列を最初に表示するか最後に表示するかを指定することもできます。これはアンカー一致と呼ばれます。
$ cat /tmp/fzf.in | fzf -f s$
Captain Reynolds
I mean to confound these bungers
$ cat /tmp/fzf.in | fzf -f \^c
Captain Reynolds
スペースで区切られた複数のフィルターを組み合わせることができます。 パイプセパレータはOR演算子として機能します。次のコマンドは、「I」で始まり、ファジーモードで「man」または「ban」のいずれかに一致するすべての行をフィルタリングします。
$ cat /tmp/fzf.in | fzf -f "^i ban | man"
I mean to confound these bungers
+ i フラグを使用して、大文字と小文字を区別する一致を有効にできることに注意してください。
5. アプリケーションの例
fzf はインタラクティブなインターフェースを提供することで優れているため、さまざまなシナリオでブラウザーとして使用でき、あいまい検索機能を使用して、高いエラー許容度で検索を絞り込むことができます。
プレビューオプションは、選択した行のプレビューペインに指定したコマンドの出力を表示します。
Preview フラグ内に埋め込まれたコマンドでは、式 {} は行全体に展開されますが、{1}は現在の行の1列目に展開されます、{2}は2列目に展開されます。 {n} は、行のゼロベースのインデックスを展開します。
$ cat /tmp/fzf.in | fzf --preview 'echo line# {n}. first word: {1}. total words: `wc -w <<< {}`'
–previewフラグにpsコマンドを埋め込んで、プロセスのスレッドをインタラクティブに表示してみましょう。
$ ps axo pid,rss,comm --no-headers | fzf --preview 'ps o args {1}; ps mu {1}'
同様に、たとえば、DebianベースのLinuxでは、パッケージの依存関係を参照できます。
$ apt-cache search . | fzf --preview 'apt-cache depends {1}'
また、git commit履歴を参照して、各コミットに関する最小限の情報を表示することもできます。
$ git log --oneline | fzf --preview 'git show --name-only {1}'
fzf用のvimプラグインも利用できます。 高度なアプリケーションの広範なリストは、公式のwikiページにあります。
6. 結論
このチュートリアルでは、ファジー検索とは何か、および fzfを使用してそれらを実行する方法を学習しました。また、fzfを他のコマンドラインツールと一緒に使用して改善する方法についても説明しました。それらの出力をフィルタリングして視覚化します。