diff options
Diffstat (limited to '.zshrc')
-rw-r--r-- | .zshrc | 34 |
1 files changed, 34 insertions, 0 deletions
@@ -281,6 +281,38 @@ fzf-hosts-widget() { return $ret } +__fproject() { + local startdir="$PWD" + if git rev-parse --show-toplevel &>/dev/null; then + startdir=$(git rev-parse --show-toplevel) + elif [[ $PWD == $HOME ]]; then + startdir="$HOME/projects" + fi + + find "$startdir" -type d -not \( \( -path '*/vendor' -or -path '*/.git' \) -prune \) | FZF_DEFAULT_OPTS="--height ${FZF_TMUX_HEIGHT:-40%} --reverse $FZF_DEFAULT_OPTS" $(__fzfcmd) -m "$@" | while read item; do + echo -n "${(q)item}" + done + local ret=$? + echo + return $ret +} + +fzf-projects-widget() { + local _dir=$(__fproject) + local ret=$? + if [[ "$_dir" == *"'"* ]] || [[ "$_dir" == "" ]]; then + printf "%s\n" "ERROR: Invalid dir name for widget: '$_dir'" >&2 + zle reset-prompt + return 1 + fi + + zle push-line + LBUFFER="cd '${_dir}'" + zle accept-line + zle reset-prompt + return $ret +} + if type fzf &>/dev/null; then zle -N fzf-history-widget bindkey '^R' fzf-history-widget @@ -288,6 +320,8 @@ if type fzf &>/dev/null; then bindkey '^T' fzf-file-widget zle -N fzf-hosts-widget bindkey '^H' fzf-hosts-widget + zle -N fzf-projects-widget + bindkey '^P' fzf-projects-widget fi # }}} |