diff --git a/bash-completion/secret-tool b/bash-completion/secret-tool index 5e9ce69..e8aafd8 100644 --- a/bash-completion/secret-tool +++ b/bash-completion/secret-tool @@ -1,19 +1,50 @@ -# secret-tool(1) completion +# bash completion for secret-tool(1) -*- shell-script -*- -_secret-tool() +_comp_cmd_secret_tool() { - local cur prev word cword - _init_completion || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return - if [[ $cur == -* ]]; then - local opts="--help --verbose -q --quiet" - COMPREPLY=( $(compgen -W "$opts" -- "$cur") ) - return - elif [[ $cword -eq 1 ]]; then - local commands='store lookup clear search' - COMPREPLY=( $(compgen -W "$commands" -- "$cur") ) + [[ $was_split ]] && return + + local -i i + local mode="" has_mode="" word + for i in ${!words[*]}; do + if [[ $i -gt 0 && ${words[i]} != -* ]]; then + ((i != cword)) && mode=${words[i]} has_mode=set + break + fi + done + if [[ ! $has_mode ]]; then + # generate modes + _comp_compgen_split -- "$("$1" nonexistent-mode 2>&1 | + while read -r first second third rest; do + if [[ $first == "${1##*/}" ]]; then + printf "%s\n" "$second" + elif [[ $first == usage: && $second == "${1##*/}" ]]; then + printf "%s\n" "$third" + fi + done)" + return fi + + case $mode in + store) + if [[ ${words[*]} != *\ --label[\ =]* ]]; then + _comp_compgen -- -W "--label=" + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace + fi + ;; + search) + local -A opts=([--all]="" [--unlock]="") + for word in "${words[@]:2}"; do + [[ $word ]] && unset -v 'opts[$word]' + done + ((${#opts[@]})) && + _comp_compgen -- -W '"${!opts[@]}"' + ;; + esac } && -complete -F _secret-tool secret-tool + complete -F _comp_cmd_secret_tool secret-tool # ex: filetype=sh