# bash completion file for dmtool # Modified from bash completion for password-store _dmtool_complete_entries () { local prefix1="${HOME}/.dmtool/" prefix1="${prefix1%/}/" local prefix2="/usr/share/dmtool/" prefix2="${prefix2%/}/" local suffix=".json" local autoexpand=${1:-0} local IFS=$'\n' local items=($(compgen -f $prefix1$cur)) items+=($(compgen -f $prefix2$cur)) # Remember the value of the first item, to see if it is a directory. If # it is a directory, then don't add a space to the completion local firstitem="" # Use counter, can't use ${#items[@]} as we skip hidden directories local i=0 item for item in ${items[@]}; do [[ $item =~ /\.[^/]*$ ]] && continue # if there is a unique match, and it is a directory with one entry # autocomplete the subentry as well (recursively) if [[ ${#items[@]} -eq 1 && $autoexpand -eq 1 ]]; then while [[ -d $item ]]; do local subitems=($(compgen -f "$item/")) local filtereditems=( ) item2 for item2 in "${subitems[@]}"; do [[ $item2 =~ /\.[^/]*$ ]] && continue filtereditems+=( "$item2" ) done if [[ ${#filtereditems[@]} -eq 1 ]]; then item="${filtereditems[0]}" else break fi done fi # append / to directories [[ -d $item ]] && item="$item/" item="${item%$suffix}" local prefix1ed="${item#$prefix1}" COMPREPLY+=("${prefix1ed#$prefix2}") if [[ $i -eq 0 ]]; then firstitem=$item fi let i+=1 done # The only time we want to add a space to the end is if there is only # one match, and it is not a directory if [[ $i -gt 1 || ( $i -eq 1 && -d $firstitem ) ]]; then compopt -o nospace fi } _dmtool_skills() { echo -e "athletics\nacrobatics\nstealth\narcana\nhistory\ninvestigation\nnature\nreligion\ninsight\nmedicine\nperception\nsurvival\ndeception\nintimidation\nperformance\npersuasion\nsleight of hand\nanimal handling" } _dmtool_abilities() { echo -e "str\ndex\ncon\nint\nwis\ncha" } _dmtool_dmgtypes() { echo -e "slashing\npiercing\nbludgeoning\npoison\nacid\nfire\ncold\nradiant\nnecrotic\nlightning\nthunder\nforce\npsychic" } _dmtool_complete_skills_abilities() { local IFS=$'\n' COMPREPLY+=($(compgen -W "$(_dmtool_skills)" -- ${cur})) COMPREPLY+=($(compgen -W "$(_dmtool_abilities)" -- ${cur})) } _dmtool() { COMPREPLY=() local cur="${COMP_WORDS[COMP_CWORD]}" local commands="ls cp mkdir mv rm attacks roll attack damage heal save reset set edit add del spellcasting help git" if [[ $COMP_CWORD -gt 1 ]]; then local lastarg="${COMP_WORDS[$COMP_CWORD-1]}" case "${COMP_WORDS[1]}" in ls|mkdir|rm|reset) _dmtool_complete_entries ;; cp|mv|add) if [[ $COMP_CWORD -le 3 ]]; then _dmtool_complete_entries fi ;; save) if [[ $COMP_CWORD -eq 2 ]]; then local IFS=$'\n' COMPREPLY+=($(compgen -W "$(_dmtool_abilities)" -- ${cur})) elif [[ "$lastarg" == "--type" ]]; then local IFS=$'\n' COMPREPLY+=($(compgen -W "$(_dmtool_dmgtypes)" -- ${cur})) elif [[ "$lastarg" == "--damage" ]]; then : elif [[ $COMP_CWORD -eq 4 ]]; then _dmtool_complete_entries elif [[ $COMP_CWORD -ge 5 ]]; then COMPREPLY+=($(compgen -W "--magical -m --silvered -s --adamantine -a --damage --type --halves" -- ${cur})) _dmtool_complete_entries fi ;; attacks|roll|attack|damage|heal|save|set|edit|del|spellcasting) if [[ $COMP_CWORD -le 2 ]]; then _dmtool_complete_entries else case "${COMP_WORDS[1]}" in roll) _dmtool_complete_skills_abilities # Add in attacks local IFS=$'\n' opts="$(${COMP_WORDS[0]} attacks ${COMP_WORDS[2]})" COMPREPLY+=($(compgen -W "$opts" -- ${cur})) ;; attack) COMPREPLY+=($(compgen -W "-1 -2" -- ${cur})) if [[ $COMP_CWORD -eq 3 ]]; then local IFS=$'\n' opts="$(${COMP_WORDS[0]} attacks ${COMP_WORDS[2]})" COMPREPLY+=($(compgen -W "$opts" -- ${cur})) elif [[ $COMP_CWORD -eq 4 ]]; then _dmtool_complete_entries fi ;; damage) COMPREPLY+=($(compgen -W "--magical -m --silvered -s --adamantine -a" -- ${cur})) if [[ $COMP_CWORD -eq 4 ]]; then local IFS=$'\n' COMPREPLY+=($(compgen -W "$(_dmtool_dmgtypes)" -- ${cur})) fi ;; set) if [[ $COMP_CWORD -eq 3 ]]; then _dmtool_complete_skills_abilities COMPREPLY+=($(compgen -W "proficiency name" -- ${cur})) elif [[ $COMP_CWORD -eq 4 ]]; then local skills="$(_dmtool_skills)" if [[ "$skills" =~ "$lastarg" ]]; then COMPREPLY+=($(compgen -W "none proficient expert" -- ${cur})) fi fi ;; del) #TODO: Add items and spells _dmtool_complete_skills_abilities ;; spellcasting) if [[ $COMP_CWORD -eq 3 ]]; then COMPREPLY+=($(compgen -W "init ability level" -- ${cur})) elif [[ "$lastarg" == "ability" ]]; then local IFS=$'\n' COMPREPLY+=($(compgen -W "$(_dmtool_abilities)" -- ${cur})) fi ;; esac fi ;; esac else COMPREPLY+=($(compgen -W "${commands}" -- ${cur})) _dmtool_complete_entries 1 fi } complete -o filenames -F _dmtool dmtool