🧿

fzf(fuzzy finder)について学んだ事。

2022/03/11に公開

ターミナルでファイルなどを検索するとき、皆さんはどんな風に検索しているでしょうか?
lsコマンドを地味に叩く?
それとも何か他の方法で??

今回はターミナルで検索を行う際に便利なツールを知る事ができたので、その紹介と振り返りです。

その名もfzf(fuzzy finder)

前方一致検索のような感覚で、ファイルやコマンド履歴を検索できる便利なツールです。

心に余裕がある方は少しだけ見ていただけると嬉しいです。

この記事でわかる事

  • 検索機能が便利なfzfのインストール方法
  • 便利な使い方のご紹介

今回学習した環境

今回学習に使用した環境は、オンラインで環境構築が不要、それでいてLinuxが学べるオンライン学習サービス Envaderを利用しました。
その中に今回のfzfについてのコースがあり、そちらを実際にハンズオン形式で進めた内容をまとめています。

OS Linux
ディストリビューション Debian

何か一つでも、皆さんの気づきになる事ができたら幸いです。

Envaderへのリンクはこちらから

Envader

コース一覧

fzfを設定しよう

fzf(fuzzy finder)とは

ファイル、コマンド履歴、プロセス、ホスト名、ブックマーク、git コミットなど、あらゆるリストに対して使用できるコマンドライン用の対話型 Unix フィルタです。
GitHubfzf READMEより引用

ファイル、コマンド履歴を検索する機能かと思っていたら、プロセス、ホスト名など色々なものを検索できるみたいですね。
私は正直、control + rでコマンド履歴くらいしかまだ使いこなせていません。

プロセスなんかを検索するのはどう言った時に使うんでしょうか?

ただ、control + rでの検索だけでも便利なので、私は頻繁に利用させていただいています。

ちなみにGO言語で書かれているみたいです。

fzfをインストールする。

まず初めに、GitHubよりファイルをクローンしてきます。

git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf

#--depth 1 のオプションをつける事で、最新の履歴だけをクローンする、という意味になる。

これでローカルの環境にファイルを持ってこれました。
ただ、これだけではあくまでファイルをローカルへ持ってきただけなので、インストールできていません。
つまり、まだ利用することはできないということ。
なので、今度はインストール作業です。

~/.fzf/install

これでインストールが始まるはずです。
何回か質問されると思いますが、基本的には全部yesを選択して問題ないかと思います。

.bashrcの再読み込み

インストールが完了したら、一度bashrcを読み込みするのを忘れないようにしないといけません。
インストール時にいくつか聞かれる質問の中で、

Do you want to update your shell configuration files? ([y]/n)

となり、これにyと入力して進むと、bashrcに設定が書き込まれるため、bashrcを再読み込みする必要があるんです。

忘れずに.bashrcを再読み込みしたら、もうfzfが使えるはず。。。

ctrl + rで検索開始です。。。。

便利な関数の設定方法

こちらのリンクにfzfのExamplesとして、様々な関数が書かれています。
本当にたくさんあるので、ご参考までにどうぞ。

https://github.com/junegunn/fzf/wiki/Examples#changing-directory

この中で、自分がつまづいた点としては、まず何を意味しているのかが全く分からず。
結局、どのキーを操作する事でこの関数が走るようになるのかが分かりませんでした。。

でも色々調べて、結果そんなに難しいことではありませんでした。

以下一部紹介

function cd() {
    if [[ "$#" != 0 ]]; then
        builtin cd "$@";
        return
    fi
    while true; do
        local lsd=$(echo ".." && ls -p | grep '/$' | sed 's;/$;;')
        local dir="$(printf '%s\n' "${lsd[@]}" |
            fzf --reverse --preview '
                __cd_nxt="$(echo {})";
                __cd_path="$(echo $(pwd)/${__cd_nxt} | sed "s;//;/;")";
                echo $__cd_path;
                echo;
                ls -p --color=always "${__cd_path}";
        ')"
        [[ ${#dir} != 0 ]] || return 0
        builtin cd "$dir" &> /dev/null
    done
}

これが最初は全く何を意味しているのか分からなかったですが、今は関数の発火のさせ方までは分かるようになりました。

function cd() {
}

このcdの部分がキーバインドみたいな感じで、cdを叩いてエンターを押すと非常にグラフィカルなcdを実行する事ができるようになります。

このように、function cd()の部分がキーが割り当てられているという意味になるので、他の関数に関しても同じように、cdf()だったりした場合にはこのキーを叩く事で関数が発火する。と言った意味になります。

まとめ

今回学んだ事の振り返り

  • fzfをインストールしてctrl + rを叩くと、コマンド履歴やディレクトリの検索ができるようになる。
  • インストールした際にはsource .bashrcを忘れずに。
  • 関数の見方としては、cd()とされていた場合にはキーがcdで関数が発火するようになっている。

最後まで読んでいただきありがとうございました。

参考にさせていただいた記事一覧

Gitコマンドリファレンス

Gitコマンド虎の巻

fzfによるCUI生活の改善

fzfを活用してTerminalの作業効率を高める

fzfを使おう

fzf(fuzzy finder)の便利な使い方をREADME, Wikiを読んで学ぶ

Discussion