From 7b5d1e3d46e94262a9c0fd3a01ab4685aea9d12d Mon Sep 17 00:00:00 2001 From: Your Name Date: Sat, 1 May 2021 15:10:54 -0400 Subject: Added bash completion, amongst others --- src/dmtool.bash | 94 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 src/dmtool.bash (limited to 'src/dmtool.bash') diff --git a/src/dmtool.bash b/src/dmtool.bash new file mode 100644 index 0000000..41f70e9 --- /dev/null +++ b/src/dmtool.bash @@ -0,0 +1,94 @@ +# 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() +{ + COMPREPLY=() + local cur="${COMP_WORDS[COMP_CWORD]}" + local commands="ls cp mkdir mv rm roll damage heal reset set help" + 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) + if [[ $COMP_CWORD -le 3 ]]; then + _dmtool_complete_entries + fi + ;; + roll|damage|heal|set|add) + if [[ $COMP_CWORD -le 2 ]]; then + _dmtool_complete_entries + else + # Other various stuff + : + fi + ;; + esac + else + COMPREPLY+=($(compgen -W "${commands}" -- ${cur})) + _dmtool_complete_entries 1 + fi +} + +complete -o filenames -F _dmtool dmtool -- cgit v1.2.3