戻る

fzf解説

July 17, 2020

fzfもpecoと同様zshの検索ツールでfzfの方が世界的に有名であるが日本ではpecoも人気で役割的には同じものだが違いを味わっても面白いかも知れない. [ターミナル]fzfを使った自作インタラクティブアプリを作ってみよう!〜git addを快適に〜 がとてもいい記事でこのおかげで私はfzfの基本が理解できた. fzfは大量の選択肢の中から検索によって一行を選び出す, この説明をちゃんとしている記事は私は今まで見たことがなかった. fzf単体では何もできないが, コマンドをパイプでつなぎ合わせることで強力になるという.

 

brew install fzf

git addをプレビューでインタラクティブに処理

次のようにすることでgaddと打てばfzfでaddするものを選択することができる.


alias gadd="git status -s | fzf | awk '{print \$2}' | xargs git add"

参考サイトの次のコマンドでgit addが失敗してしまう.


function gadd() {
    local selected
    selected=$(unbuffer git status -s | fzf -m --ansi --preview="echo {} | awk '{print \$2}' | xargs git diff --color" | awk '{print $2}')
    if [[ -n "$selected" ]]; then
        selected=$(tr '\n' ' ' <<< "$selected")
        git add $selected
        echo "Completed: git add $selected"
    fi
}

macなどBSD系ではselectedの最後の空白を取り除かならないのかわからないが, sedで消してみるとうまくいった. 変数での空白の扱いがより厳密で, デフォルトでシングルクォーテーションで囲ったような展開の仕方なのだろうか.


function gadd() {
    local selected
    selected=$(unbuffer git status -s | fzf -m --ansi --preview="echo {} | awk '{print \$2}' | xargs git diff --color" | awk '{print $2}')
    if [[ -n "$selected" ]]; then
        selected=$(tr '\n' ' ' <<< "$selected" | sed -e 's/[[:space:]]*$//') 
        git add $selected
        echo "Completed: git add $selected"
    fi
}


sedで改行を出力する macの環境でsedが使いづらすぎる.

zコマンドとの連携でディレクトリ移動を高速に

zという一文字のコマンドで今までいたディレクトリの場所のリストを表示できる. まずbrewでインストールできる.


brew install z

そして, brewの指示に従って~/.zshrcに次の行を追加する. 通常はbrewでインストールすればすぐコマンドが使えるようになるが, シェル関係のプラグインはシェルにいくつか設定を反映させる必要がある.


source /usr/local/etc/profile.d/z.sh

fzfを次のように連携させることで, cddコマンドでディレクトリ移動が高速になる. function cdd() { local res=$(z | sort -rn | cut -c 12- | fzf) if [ -n "$res" ]; then cd $res else return 1 fi }

参考になる記事

おい、peco もいいけど fzf 使えよ

gitのdiff, addをfzf でインタラクティブに

fuzzy-finderでディレクトリ探しながらcd ディレクトリ移動に関してより柔軟な設定をしている. cddで足りないと思った時に読むといいかもしれない.