From ea2002a2e4c84943385c66637ef09544060a33a6 Mon Sep 17 00:00:00 2001 From: John D Pell Date: Tue, 18 Jan 2022 11:08:51 -0800 Subject: [PATCH 1/3] plugin/projects: cleanup I'm deliberately leaving the possibility that one might `pjo` without a project name... --- clean_files.txt | 1 + plugins/available/projects.plugin.bash | 120 ++++++++++--------------- 2 files changed, 49 insertions(+), 72 deletions(-) diff --git a/clean_files.txt b/clean_files.txt index 9c4f530174..3b489e357e 100644 --- a/clean_files.txt +++ b/clean_files.txt @@ -115,6 +115,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..e243ce975b 100644 --- a/plugins/available/projects.plugin.bash +++ b/plugins/available/projects.plugin.bash @@ -1,75 +1,51 @@ -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 + local -a dests=() + + if [[ "$proj" == "open" ]]; then + shift + 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}" + + # when multiple destinations are found, present a menu + if [[ ${#dests[@]} -eq 0 ]]; then + _log_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 + _log_error "please report this error" + return 2 # should never reach this + fi + + "${cmd:-cd}" "${dest}" } alias pjo="pj open" From 1ec48c8d7179614b318f7c7a0fb5c3a11b899b86 Mon Sep 17 00:00:00 2001 From: John D Pell Date: Sat, 8 Jan 2022 14:07:37 -0800 Subject: [PATCH 2/3] plugin/projects: add to `template/bash_profile` --- template/bash_profile.template.bash | 3 +++ 1 file changed, 3 insertions(+) diff --git a/template/bash_profile.template.bash b/template/bash_profile.template.bash index 75febdabaf..1dc1cda319 100755 --- a/template/bash_profile.template.bash +++ b/template/bash_profile.template.bash @@ -34,6 +34,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 From a78d72eed1f7a2854d791ab6db26c8ddef32ea75 Mon Sep 17 00:00:00 2001 From: John D Pell Date: Tue, 18 Jan 2022 17:08:16 -0800 Subject: [PATCH 3/3] plugin/projects: refactor a bit --- plugins/available/projects.plugin.bash | 62 ++++++++++++++------------ 1 file changed, 34 insertions(+), 28 deletions(-) diff --git a/plugins/available/projects.plugin.bash b/plugins/available/projects.plugin.bash index e243ce975b..803864806a 100644 --- a/plugins/available/projects.plugin.bash +++ b/plugins/available/projects.plugin.bash @@ -8,42 +8,48 @@ function pj() { group 'projects' local proj="${1?${FUNCNAME[0]}: project name required}" - local cmd PS3 dest - local -a dests=() + 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}" - - # when multiple destinations are found, present a menu - if [[ ${#dests[@]} -eq 0 ]]; then - _log_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 - _log_error "please report this error" - return 2 # should never reach this - fi + 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}" }