[go: up one dir, main page]
More Web Proxy on the site http://driver.im/

fzfでファイル名を検索し、選択されたファイルをvimで開く方法

概要

開発をしていると、あるプロジェクト上で、ある目的のファイルをファイル名により検索して、vimで開きたいことがたびたびあります。

この記事では、そのための.zshrcを共有します。

zshrcの設定

以下は、自分が普段使っている .zshrc の一部です。

解説はコメントアウトで書くようにしているので細かい説明は省きます。

FZF_TREE_IGNORE=".git|.cache|.*cache|__pycache__"

alias ff=find_file_and_vim

# ファイル名を検索してvimで開く
function find_file_and_vim() {
    INITIAL_QUERY="$1"

    # プレビューの対象は、ファイルの場合もあれば、ディレクトリの場合もあります。
    # プレビュー対象が、ディレクトリの場合はlsでファイル一覧を表示し、そうでなければheadで先頭行のみ表示しています。
    PREVIEW='
f() {
    set -- $(echo -- "$@" | grep -o "\./.*$");
    if [ -d $1 ]; then
        ls -lh $1
    else
        head -n 100 $1
    fi
}; f {}'

    # treeの実行結果からfzfによりファイルを絞れるようにします。
    # 経験上、何かファイルを探したいときに、まずはディレクトリ構造ごと知ってからファイルを検索することが多いためです。
    files=$(tree --noreport --charset=o -f -a -I ${FZF_TREE_IGNORE} | sed -e '1d')

    selected=$(echo $files |
        fzf --reverse --query "$INITIAL_QUERY" \
            --preview ${PREVIEW} |
        grep -o "\./.*$")

    # ファイルが選択されていなければなにもしません。
    # ファイルが選択されていたら、それをファイル、ディレクトリにかかわらずvimで開きます。
    if [ "$selected" = "" ]; then
        return 0
    fi
    if [ -f "$selected" ]; then
        vim "$selected"
        return 0
    fi
    if [ -d "$selected" ]; then
        vim "$selected"
        return 0
    fi
}