added menu and error messages to projects plugin. indentation cleanup to conform to editorconfig.

pull/666/head
cornfeedhobo 2016-02-12 09:05:22 -06:00
parent 1293dbf086
commit 85e7e408aa
2 changed files with 88 additions and 43 deletions

View File

@ -1,38 +1,39 @@
_pj() {
[ -z "$PROJECT_PATHS" ] && return
shift
[ "$1" == "open" ] && shift
[ -z "$PROJECT_PATHS" ] && return
shift
[ "$1" == "open" ] && shift
local cur prev words cword
_init_completion || return
local cur prev words cword
_init_completion || return
local IFS=$'\n' i j k
local IFS=$'\n' i j k
compopt -o filenames
compopt -o filenames
local -r mark_dirs=$(_rl_enabled mark-directories && echo y)
local -r mark_symdirs=$(_rl_enabled mark-symlinked-directories && echo y)
local -r mark_dirs=$(_rl_enabled mark-directories && echo y)
local -r mark_symdirs=$(_rl_enabled mark-symlinked-directories && echo y)
for i in ${PROJECT_PATHS//:/$'\n'}; do
# create an array of matched subdirs
k="${#COMPREPLY[@]}"
for j in $( compgen -d $i/$cur ); do
if [[ ( $mark_symdirs && -h $j || $mark_dirs && ! -h $j ) && ! -d ${j#$i/} ]]; then
j+="/"
fi
COMPREPLY[k++]=${j#$i/}
done
for i in ${PROJECT_PATHS//:/$'\n'}; do
# create an array of matched subdirs
k="${#COMPREPLY[@]}"
for j in $( compgen -d $i/$cur ); do
if [[ ( $mark_symdirs && -h $j || $mark_dirs && ! -h $j ) && ! -d ${j#$i/} ]]; then
j+="/"
fi
COMPREPLY[k++]=${j#$i/}
done
done
if [[ ${#COMPREPLY[@]} -eq 1 ]]; then
i=${COMPREPLY[0]}
if [[ "$i" == "$cur" && $i != "*/" ]]; then
COMPREPLY[0]="${i}/"
fi
if [[ ${#COMPREPLY[@]} -eq 1 ]]; then
i=${COMPREPLY[0]}
if [[ "$i" == "$cur" && $i != "*/" ]]; then
COMPREPLY[0]="${i}/"
fi
fi
return 0
return 0
}
complete -F _pj -o nospace pj
complete -F _pj -o nospace pjo

View File

@ -2,30 +2,74 @@ cite about-plugin
about-plugin 'add "export PROJECT_PATHS=~/projects:~/intertrode/projects" to navigate quickly to your project directories with `pj` and `pjo`'
function pj {
about 'navigate quickly to your various project directories'
group 'projects'
about 'navigate quickly to your various project directories'
group 'projects'
if [ -n "$PROJECT_PATHS" ]; then
local cmd
if [ "$1" == "open" ]; then
shift
cmd="$EDITOR"
fi
if [ -z "$PROJECT_PATHS" ]; then
echo "error: PROJECT_PATHS not set"
return 1
fi
cmd="${cmd:-cd}"
if [ -n "$1" ]; then
for i in ${PROJECT_PATHS//:/$'\n'}; do
if [ -d "$i"/"$1" ]; then
$cmd "$i"/"$1"
return
fi
done
fi
fi
local cmd
local dest
local -a dests
echo "No such project '$1'"
if [ "$1" == "open" ]; then
shift
cmd="$EDITOR"
fi
cmd="${cmd:-cd}"
if [ -z "$1" ]; then
echo "error: no project provided"
return 1
fi
# collect possible destinations to account for directories
# with the same name in project directories
for i in ${PROJECT_PATHS//:/$'\n'}; do
if [ -d "$i"/"$1" ]; then
dests+=("$i/$1")
fi
done
# when multiple destinations are found, present a menu
if [ ${#dests[@]} -eq 0 ]; then
echo "error: no such project '$1'"
return 1
elif [ ${#dests[@]} -eq 1 ]; then
dest="${dests[0]}"
elif [ ${#dests[@]} -gt 1 ]; then
PS3="Multiple project directories found. Please select one: "
dests+=("cancel")
select d in "${dests[@]}"; do
case $d in
"cancel")
return
;;
*)
dest=$d
break
;;
esac
done
else
echo "error: please report this error"
return 1 # should never reach this
fi
$cmd "$dest"
}
alias pjo="pj open"