Ubuntu Weekly Recipe

第504回 インタラクティブフィルター「fzf」の活用

この記事を読むのに必要な時間:およそ 5 分

fzfでシェルを便利に使う

インストール時にfzfキーバインドを有効にしているのであれば,以下の機能が使えます。

CTRL+r

CTRL+rにはシェルのコマンド履歴をインクリメンタルサーチする機能(reverse-search-history)が割り当てられていますが,これを__fzf_history__というシェル関数に置き換えています。

CTRL+rキーを押すと,historyコマンドが実行され,その結果がfzfコマンドに渡されます。ユーザーが呼び出したい履歴を選択すると,sedで不要なヒストリー番号を削除したものがコマンドラインに流し込まれます。具体的な実装は~/.fzf/shell/key-bindings.bashを参照してください。

図5 __fzf_history__を実行したところ。履歴をあいまい検索できるのは,完全に一致しなければならないインクリメンタルサーチに比べて非常に強力

画像

シェルを使い込めば使い込むほど,履歴から複雑なコマンドを頻繁に呼び出すようになるでしょう。強力なあいまい検索をシェルに組み込めるこの機能は,fzfのメリットをもっとも簡単に実感できる機能のひとつです※5)⁠

※5
通常のシェルの履歴検索の場合,ENTERキーで履歴を選択した途端にそのコマンドが実行されますが,間にfzfを挟んでいる都合上,ENTERキーを2回押さなければならないのは,慣れるまで面倒かもしれません。

CTRL+t

CTRL+tキーを押すと,カレントディレクトリ以下にあるファイルとディレクトリを検索し,その結果がfzfに渡されます。冒頭で紹介したfindコマンドの例とほぼ同じ機能がキーに割り当てられていると考えてください。

「あるコマンドの引数にファイルを渡したいのだけれど,ディレクトリの階層が深くてシェルの補完では面倒」⁠そもそもこのコマンドのオプション引数は補完できない」といった場合に活用できそうです。

ALT+c

CTRL+tによく似た機能です。カレントディレクトリ以下にあるディレクトリのみを検索し,その結果をfzfに渡します。その後,fzfで選択したディレクトリに自動的にcdします。

これも,深い階層のディレクトリに移動しなければならないのだけれど,シェルの補完では面倒という場面で便利です。

fzfの補完機能

もともとbashにはファイル名を補完する機能がありますが,TABキーを押しても候補の一覧が表示されるだけで,結局候補が一意に定まるまで,ある程度自分でキーをタイプしなければなりません。

fzfがインストールされている環境では,連続した2個のアスタリスク(**)を入力した状態でTABキーを押すと,あいまい補完機能が起動します。fzfのあいまい検索機能を使って候補を絞り込み,選択した対象をコマンドラインに挿入できます。それでは実際に使ってみましょう。

例としてcatコマンドの引数としてアスタリスクを2個入力し,TABキーを押します。するとカレントディレクトリ以下のファイルとディレクトリのあいまい補完が起動します。この際のfzfはマルチセレクトモードで起動しているため,複数のファイルをマークできます。ENTERを押せば選択したファイルがcatコマンドの引数として挿入されます。

catコマンドの引数をあいまい補完で入力する

$ cat **(TABを押す)

図5 catコマンドの引数に渡すファイルを,あいまい補完で検索しようとした例。ここでENTERを押すと,ownCloud/Write/Recipe/504/504.md(本記事の原稿ファイル)が引数として挿入される

画像

あいまい補完はzshの補完のように,文脈を読んで補完候補をリストアップしてくれます。たとえばsshコマンドの引数を補完する場合は,⁠~/.ssh/config」⁠~/.ssh/known_hosts」⁠/etc/ssh/ssh_config」⁠/etc/hosts」といったファイルから,接続設定のあるホスト名や,過去に接続したホスト名を集めてきます。

図6 sshコマンドの引数として,接続先のホストをあいまい補完した例。過去に接続したホストのIPアドレスが補完候補にあげられている

画像

あいまい補完のトリガーとなる文言は,環境変数FZF_COMPLETION_TRIGGERで変更できます。たとえば以下のように環境変数を設定すると,⁠hoge」と入力してTABキーを押すことで,あいまい補完が起動します。

あいまい補完のトリガー文字列を「hoge」に設定した例

$ export FZF_COMPLETION_TRIGGER=hoge
$ ls hoge(TABを押す)

図7 hogeという文言をトリガーとしてあいまい補完を起動した状態。ENTERを押すと,当然hogeは選択したファイル名で置き換えられる

画像

どのコマンドにどんな補完候補が用意されているか,詳しく知りたい場合は~/.fzf/shell/completion.bashを参照してください。

著者プロフィール

水野源(みずのはじめ)

Ubuntu Japanese Teamメンバー。理想のフリーデスクトップ環境を求めて東へ西へ……のはずが,気がついたら北の大地で就職していたインフラ寄りのエンジニア。最近レンズ沼にハマる。