Ubuntu Weekly Recipe

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

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

レイアウトを変更する

fzfのデフォルトでは,端末の画面全体を使い,下から上にボトムアップのレイアウトで候補が列挙されました。ところがあいまい補完等では,端末内の一部分だけに候補が列挙されています。こういったレイアウトの変更はオプションで可能です。

--height

候補一覧が表示される高さをパーセンテージで指定します。

端末の半分のサイズでfzfを起動する

$ fzf --height 50%

--reverse

検索ワードの入力エリアが最上部に表示し,そこから画面の下に向かって候補が並ぶトップダウンのレイアウトに変更します。一般的なCLIアプリのレイアウトとしては,こちらの方が自然かもしれません。

トップダウンレイアウトでfzfを起動する

$ fzf --reverse

--tac

tacコマンドのように,入力された候補一覧の並びを逆にして表示します。リストの昇順,降順を変更したい場合などに利用します。

リストの昇順,降順を逆にする

$ fzf --tac

--border

候補一覧のまわりにボーダーラインを描画します。見やすくなるのでおすすめです。

ボーダーラインを表示する

$ fzf --border

オプションを常に適用するには

こうしたオプションを,毎回指定するのは面倒な上,コマンドも長く,見通しが悪くなってしまいます。fzfは環境変数FZF_DEFAULT_OPTSに指定されたオプションを自動で適用するため,毎回利用するオプションはこの変数に設定しておくとよいでしょう。

常時50%のサイズでボーダーつきの領域に,上下逆に表示させる

$ export FZF_DEFAULT_OPTS='--height 50% --reverse --border'

図8 上記環境変数を指定してfzfを起動した例

画像

他にもマージンの指定や検索プロンプトの変更などが可能です。詳しくはmanのLayoutセクションを参照してください。

プレビュー機能を使う

fzfにはプレビュー機能が備わっています。端末を候補一覧とプレビュー画面に分割し,カーソルを移動して候補を選択した際に,プレビュー画面に任意のコマンドの結果を表示させることができます。

たとえば以下は,システムにインストールされているパッケージの一覧と,そのパッケージに含まれるファイルの一覧をプレビューする例です。

まずdpkgコマンドでシステムにインストールされているパッケージの一覧を取得し,fzfに渡しています。⁠--preview」オプションには,プレビューの表示に利用するコマンドを指定します。ここでは引数に指定したパッケージに含まれるファイルの一覧を表示する「dpkg -L」コマンドを指定しています。⁠{}」は,現在カーソルの下にある項目(ここではパッケージ名)に置換されます。

インストールされているパッケージの一覧と,選択したパッケージに含まれるファイル一覧をプレビューする例

$ dpkg --get-selections | awk '{print $1}' | \
  fzf --preview 'dpkg -L {}' --reverse --border

図9 上記コマンドを使ったパッケージ情報のプレビュー画面

画像

以下はシェル関数を定義し,⁠man -k」で検索したmanページ群をプレビューする例です。manページの場合はプレビュー画面が狭いと読みづらいと思い,⁠--preview-window」オプションで端末を上下分割した上で,項目一覧とプレビュー画面の比率を3:7にしています。

引数に指定されたキーワードでmanページを検索し,fzfに渡してプレビュー表示するシェル関数の例。ここではopenというキーワードでマニュアルを探している

$ function manf {
  man -k $1 | awk '{print $1}' | \
  fzf --preview 'man {}' --height 100% --reverse --preview-window down:70%;
  }
$ manf open

図10 上記シェル関数を使ったmanのプレビュー画面

画像

他にも「tarボールの中身を表示する」⁠tivを使って画像をプレビューする」など,色々な応用ができそうですね。

さて,パッケージのファイルリストやマニュアルのプレビューが表示されるのは非常に便利なのですが,ここで「プレビューページがスクロールできない」ことに気付いてしまったのではないでしょうか?

fzfにはpreview-up/down,preview-page-up/downというアクションが用意されているのですが,デフォルトではこれらのアクションにキーが割り当てられていないため,プレビューページがスクロールできないのです※6)⁠

※6
とはいえマウスカーソルをプレビューページに合わせてホイールを回せばスクロールはできます。

そこで,プレビューを使う場合はこれらのアクションにキーを割り当てましょう。それには「--bind」オプションを使います。オプション引数として,割り当てるキーとアクションをコロンで繋いだペアを指定します。なおこのペアはカンマで区切って複数列挙できます。

前述のパッケージのファイル一覧をプレビューするワンライナーに,ALT+pとALT+nでプレビューページをスクロールする設定を足した例

$ dpkg --get-selections | awk '{print $1}' | \
  fzf --preview 'dpkg -L {}' --reverse --border --bind alt-p:preview-up,alt-n:preview-down

まとめ

fzfはスクリプトや関数内に埋め込むことで,さまざまなコマンドの機能を強化できる可能性を秘めたフィルタです。公式ドキュメントのExamplesには,fzfを利用した強力な応用例が豊富に紹介されています。ぜひ一度目を通してみてください※7)⁠

※7
Git関連の関数などは,非常に有用なのではないでしょうか?

著者プロフィール

水野源(みずのはじめ)

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

コメント

コメントの記入