golangの日記

Go言語を中心にプログラミングについてのブログ

fzf でディレクトリの移動とファイルを検索したい

shellscript.png


fzf を使ったディレクトリの移動と特定のディレクトリ以下をファイル検索するシェルスクリプト





fzf のインストール


fzf にも書いてあるけど一応

  • clone する

      git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf
    
  • ファイルを叩く(確認は全部 y しておけばよい)

      ~/.fzf/install
    



ディレクトリの移動


検索するディレクトリの階層指定ができて . から始まる非表示ディレクトリを検索対象に含めるオプションがある。以下を .bashrc にでも書く。

fcd() {
    local -a MAXDEPTH=()
    local -a HIDDEN=(-and ! -path '*\/\.*')
    local -a A=()
    while (($# > 0)); do
        case "$1" in
        -*)
            [[ "$1" =~ ^-(.*[^a0-9]+.*|)$ ]] && echo "Error: invalid option -- ‘$1" && return 1
            [[ "$1" =~ ^-[^0-9]*([0-9]|[1-9][0-9]+) ]] && MAXDEPTH=(-maxdepth "${BASH_REMATCH[1]}")
            [[ "$1" =~ ^-[^-]*a ]] && HIDDEN=()
            shift
            continue
            ;;
        esac
        A+=("$1")
        shift
    done
    local v
    v=$(find "${A[0]:-.}" "${MAXDEPTH[@]}" -type d "${HIDDEN[@]}" -and ! -regex '.*/node_modules/.*' -print 2>/dev/null | fzf --no-multi)
    [ -d "$v" ] && cd "$v" || return
}


  • リロードして反映

      $ source ~/.bashrc
    
  • 検索対象にするディレクトリを指定できる(指定しなければ . 現在のディレクトリ)

      $ fcd ~/.config
    
  • 階層指定できる

      $ fcd -1
    
  • 非表示ディレクトリも検索対象にできる

      $ fcd -a
    
  • オプションとルートディレクトリの指定を混在できる

      $ fcd -a3 ~/dev
    



ファイルの検索


特定のディレクトリ以下を検索してファイルをデフォルトで less コマンドで開く -x するとデフォルトで vim で開く -x=code としたら vscode で開く。以下を .bashrc にでも書く。

ff() {
    # ~/memo ディレクトリ以下を検索対象にする
    local ROOT=~/memo/
    # デフォルトのコマンド
    local CMD='less'
    local QUERY=''
    while (($# > 0)); do
        case "$1" in
        -*)
            local OPTION VALUE
            # -x=code とか = で値を渡した場合の分割
            IFS='=' read -ra ARRAY <<<"$1"
            OPTION="${ARRAY[0]}"
            [ -n "${ARRAY[1]}" ] && VALUE="${ARRAY[1]}"

            [[ "$OPTION" =~ ^-(.*[^x]+.*|)$ ]] && echo "Error: invalid option -- ‘$1" && return 1
            if [[ "$OPTION" =~ ^-[^-]*x ]]; then
                # -x が指定されていれば vim をコマンドとしてセットする
                CMD='vim'
                # -x=code みたいな場合にファイルを開くコマンドをセットする
                [ -n "$VALUE" ] && CMD="$VALUE"
            fi
            shift
            continue
            ;;
        esac
        QUERY="$QUERY $1"
        shift
    done
    local v
    # 検索対処のディレクトリに ignore とか bin とか node_modules があれば除外
    v=$(find "$ROOT" -type f \
        -and ! -regex '.*/ignore/.*' \
        -and ! -regex '.*/bin/.*' \
        -and ! -regex '.*/node_modules/.*' \
        -print 2>/dev/null | fzf --query="$QUERY" --no-multi)
    [ -z "$CMD" ] || ! type "$CMD" > /dev/null 2>&1 && echo "Error: $CMD command not found" && return 1
    [ -f "$v" ] && $CMD "$v" || return
}


  • リロードして反映

      $ source ~/.bashrc
    
  • 引数を --query に渡せる

      $ ff example
    
  • vim でファイルを編集する

      $ ff -x
    
  • code でファイルを編集する

      $ ff -x=code