diff --git a/clean_files.txt b/clean_files.txt index e8cdf8beac..f4ab4b1969 100644 --- a/clean_files.txt +++ b/clean_files.txt @@ -118,6 +118,7 @@ plugins/available/osx-timemachine.plugin.bash plugins/available/osx.plugin.bash plugins/available/percol.plugin.bash plugins/available/plenv.plugin.bash +plugins/available/projects.plugin.bash plugins/available/proxy.plugin.bash plugins/available/pyenv.plugin.bash plugins/available/python.plugin.bash diff --git a/plugins/available/projects.plugin.bash b/plugins/available/projects.plugin.bash index 775ec81334..803864806a 100644 --- a/plugins/available/projects.plugin.bash +++ b/plugins/available/projects.plugin.bash @@ -1,75 +1,57 @@ -cite about-plugin -about-plugin 'quickly navigate configured paths with `pj` and `pjo`. example: "export PROJECT_PATHS=~/projects:~/work/projects"' - -function pj { -about 'navigate quickly to your various project directories' -group 'projects' - - -if [ -z "$PROJECT_PATHS" ]; then - echo "error: PROJECT_PATHS not set" - return 1 -fi - - -local cmd -local dest -local -a dests - - -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" +# shellcheck shell=bash +about-plugin 'quickly navigate configured project paths' + +: "${BASH_IT_PROJECT_PATHS:=$HOME/Projects:$HOME/src:$HOME/work}" + +function pj() { + about 'navigate quickly to your various project directories' + group 'projects' + + local proj="${1?${FUNCNAME[0]}: project name required}" + local cmd PS3 dest d + local -a dests + + if [[ "$proj" == "open" ]]; then + shift + proj="${1}" + cmd="${EDITOR?}" + fi + + # collect possible destinations to account for directories + # with the same name in project directories + IFS=':' read -ra dests <<< "${BASH_IT_PROJECT_PATHS?${FUNCNAME[0]}: project working folders must be configured}" + for d in "${!dests[@]}"; do + if [[ ! -d "${dests[d]}" ]]; then + unset 'dests[d]' + fi + done + + case ${#dests[@]} in + 0) + _log_error "BASH_IT_PROJECT_PATHS must contain at least one existing location" + return 1 + ;; + 1) + dest="${dests[*]}/${proj}" + ;; + *) + PS3="Multiple project directories found. Please select one: " + dests+=("cancel") + select d in "${dests[@]}"; do + case $d in + "cancel") + return + ;; + *) + dest="${d}/${proj}" + break + ;; + esac + done + ;; + esac + + "${cmd:-cd}" "${dest}" } alias pjo="pj open" diff --git a/template/bash_profile.template.bash b/template/bash_profile.template.bash index 378950d933..3def286612 100755 --- a/template/bash_profile.template.bash +++ b/template/bash_profile.template.bash @@ -38,6 +38,9 @@ export IRC_CLIENT='irssi' # Set this to the command you use for todo.txt-cli export TODO="t" +# Set this to the location of your work or project folders +#BASH_IT_PROJECT_PATHS="${HOME}/Projects:/Volumes/work/src" + # Set this to false to turn off version control status checking within the prompt for all themes export SCM_CHECK=true # Set to actual location of gitstatus directory if installed