fzf でディレクトリの移動とファイルを検索したい
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