From cd05e5f4cd6d8a06486543cee97b8b4517ee82a8 Mon Sep 17 00:00:00 2001 From: Tom Ryder Date: Fri, 30 Sep 2016 14:21:12 +1300 Subject: Add -d completion for keep() --- bash/bash_completion.d/keep.bash | 56 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 54 insertions(+), 2 deletions(-) (limited to 'bash') diff --git a/bash/bash_completion.d/keep.bash b/bash/bash_completion.d/keep.bash index 3a418bb8..41423af0 100644 --- a/bash/bash_completion.d/keep.bash +++ b/bash/bash_completion.d/keep.bash @@ -1,2 +1,54 @@ -# Complete calls to keep() with existing function names and variable names -complete -A function -A variable keep +# Complete calls to keep() with variables and functions, or if -d is given with +# stuff that's already kept +_keep() { + + # Default is to complete with function and variable names + local mode + mode=names + + # Iterate through the words up to the previous word to figure out how to + # complete this one + local i + for ((i = 0; i < COMP_CWORD; i++)) ; do + case ${COMP_WORDS[i]} in + --) + mode=names + break + ;; + -d) + mode=kept + break + ;; + esac + done + + # Complete with appropriate mode + case $mode in + names) + while IFS= read -r word ; do + [[ -n $word ]] || continue + COMPREPLY[${#COMPREPLY[@]}]=$word + done < <(compgen -A function -A variable \ + -- "${COMP_WORDS[COMP_CWORD]}") + ;; + kept) + while IFS= read -r word ; do + [[ -n $word ]] || continue + COMPREPLY[${#COMPREPLY[@]}]=$word + done < <( + shopt -s dotglob nullglob + keep=${BASHKEEP:-"$HOME"/.bashkeep.d} + declare -a keeps + keeps=("$keep"/"${COMP_WORDS[COMP_CWORD]}"*.bash) + keeps=("${keeps[@]##*/}") + keeps=("${keeps[@]%.bash}") + if ((${#keeps[@]})) ; then + printf '%s\n' "${keeps[@]}" + else + printf '\n' + fi + ) + ;; + esac +} +complete -F _keep keep -- cgit v1.2.3