diff --git a/abra b/abra index e701597..2dd2385 100755 --- a/abra +++ b/abra @@ -842,6 +842,18 @@ sub_volume() { docker volume $@ } +####################################### +# Bash completion helpers +####################################### + +sub_command_ls() { + docopt_exit 2>&1 | \ + tail -n+2 | \ + sed -s -e 's/^\s\+//g' -e 's/(\([^)]*\)|.*)/\1/' -e 's/\[options\]//g' \ + -e 's/ <[^>]\+>//g' -e 's/\.\.\.//g' -e 's/^abra\s*//' -e '/^$/d' | \ + sort -u +} + ####################################### # Main ####################################### diff --git a/completion.bash b/completion.bash new file mode 100644 index 0000000..cd0704c --- /dev/null +++ b/completion.bash @@ -0,0 +1,37 @@ +#!/env bash + +#/usr/bin/env bash +_abra_completions() +{ + local CUR PREV COMMANDS_LIST COMMANDS + + CUR=${COMP_WORDS[COMP_CWORD]} + PREV=${COMP_WORDS[COMP_CWORD-1]} + + mapfile -t COMMANDS_LIST < <(abra command_ls) + echo "${COMMANDS_LIST[@]}" + + case ${COMP_CWORD} in + 1) + COMPREPLY=($(compgen -W "${COMMANDS_LIST[*]%% *}" -- ${CUR})) + ;; + 2) + SUB_COMMANDS=() + for COMMAND in "${COMMANDS_LIST[@]}"; do + echo $PREV + if [[ COMMAND =~ $PREV ]]; then + echo "FOUND $PREV $COMMAND" + SUB_COMMANDS+=("$COMMAND") + fi + done + + COMPREPLY=($(compgen -W "${COMMANDS[*]#* }" -- ${CUR})) + ;; + *) + echo $COMP_CWORD + COMPREPLY=() + ;; + esac +} + +complete -F _abra_completions abra