summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.zshrc34
1 files changed, 34 insertions, 0 deletions
diff --git a/.zshrc b/.zshrc
index ab08cc3..0e45a81 100644
--- a/.zshrc
+++ b/.zshrc
@@ -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
# }}}