diff options
author | Sergey Bugaev <bugaevc@gmail.com> | 2019-09-19 16:34:07 +0300 |
---|---|---|
committer | Sergey Bugaev <bugaevc@gmail.com> | 2019-09-24 17:26:33 +0300 |
commit | cef29eac68d00e2c5e3d35c4f23804de24e15642 (patch) | |
tree | 749047c34fa07e5c8891b2b77740708565b20723 | |
parent | df48e2117d88878e0cb946fd6e73f99c34eebefe (diff) |
Refactor bash completion scripts
This fixes https://github.com/bugaevc/wl-clipboard/issues/62
The problem was that a long option such as --seat would
be considered to be a combination of short options ending
with the letter t, such as -pnt, and completed as if it
needed a type to go after that t.
This also fixes comments and empty lines from /etc/mime.types
being retained in wl-copy --type completions.
-rw-r--r-- | completions/bash/wl-copy | 52 | ||||
-rw-r--r-- | completions/bash/wl-paste | 69 |
2 files changed, 79 insertions, 42 deletions
diff --git a/completions/bash/wl-copy b/completions/bash/wl-copy index 7561d44..83ec084 100644 --- a/completions/bash/wl-copy +++ b/completions/bash/wl-copy @@ -19,24 +19,44 @@ _wl_clipboard_complete_types() { _wl_copy_completion() { compopt +o default local cur prev opts types seats + cur="${COMP_WORDS[COMP_CWORD]}" prev="${COMP_WORDS[COMP_CWORD-1]}" - opts="-o --paste-once -f --foreground -c --clear -p --primary -n --trim-newline -t --type -s --seat -v --version -h --help" - if [ "$prev" = "<" ]; then - compopt -o default - COMPREPLY=() - elif [ \( "x${prev:0:1}" = "x-" -a "x${prev:1:2}" != "x-" -a "${prev: -1}" = "t" \) -o "$prev" = "--type" ]; then - types="$(sed 's/^\(\S\+\).*/\1/' /etc/mime.types 2>/dev/null)" - _wl_clipboard_complete_types "$types" - elif [ \( "x${prev:0:1}" = "x-" -a "x${prev:1:2}" != "x-" -a "${prev: -1}" = "s" \) -o "$prev" = "--seat" ]; then - seats="$(_wl_clipboard_list_seats)" - COMPREPLY=($(compgen -W "$seats" -- "$cur")) - elif [ "${cur:0:1}" = "<" ]; then - compopt -o default - COMPREPLY=() - else - COMPREPLY=($(compgen -W "$opts" -- "$cur")) - fi + + case "$cur" in + "<"*) + compopt -o default + COMPREPLY=() + return + ;; + esac + + case "$prev" in + "<"*) + compopt -o default + COMPREPLY=() + ;; + -t | -[a-z]*t | --type) + types="$(sed -e 's/#.*$//' -e '/^$/d' -e 's/^\(\S\+\).*/\1/' /etc/mime.types 2>/dev/null)" + _wl_clipboard_complete_types "$types" + ;; + -s | -[a-z]*s | --seat) + seats="$(_wl_clipboard_list_seats)" + COMPREPLY=($(compgen -W "$seats" -- "$cur")) + ;; + *) + opts="-o --paste-once " + opts+="-f --foreground " + opts+="-c --clear " + opts+="-p --primary " + opts+="-n --trim-newline " + opts+="-t --type " + opts+="-s --seat " + opts+="-v --version " + opts+="-h --help " + COMPREPLY=($(compgen -W "$opts" -- "$cur")) + ;; + esac } complete -o default -F _wl_copy_completion wl-copy diff --git a/completions/bash/wl-paste b/completions/bash/wl-paste index 91003fe..44d9708 100644 --- a/completions/bash/wl-paste +++ b/completions/bash/wl-paste @@ -20,20 +20,19 @@ _wl_clipboard_complete_paste_types() { local i cur primary seat cmd types for (( i = 0; i < "${#COMP_WORDS[@]}"; ++i )); do cur="${COMP_WORDS[i]}" - if [ "x${cur:0:1}" = "x-" -a "x${cur:1:2}" != "x-" ]; then - case "$cur" in - *p*) + case "$cur" in + -p* | -[a-z]*p* | --primary) primary="yes" ;; - *s) + esac + case "$cur" in + -s | -[a-z]*s | --seat) seat="${COMP_WORDS[i+1]}" ;; - esac - elif [ "$cur" = "--primary" ]; then - primary="yes" - elif [ "$cur" = "--seat" ]; then - seat="${COMP_WORDS[i+1]}" - fi + -s* | -[a-z]s*) + seat=$(echo "$cur" | sed 's/-[^s]*s//') + ;; + esac done cmd="${COMP_WORDS[0]}" if [ -n "$primary" ]; then @@ -53,7 +52,7 @@ _wl_paste_completion() { for (( offset=1; offset < COMP_CWORD; offset++ )); do cur="${COMP_WORDS[offset]}" - if [ \( "x${cur:0:1}" = "x-" -a "x${cur:1:2}" != "x-" -a "${cur: -1}" = "w" \) -o "$cur" = "--watch" ]; then + if [ "$cur" = "-w" -o "$cur" = "--watch" ]; then _command_offset $(($offset+1)) return fi @@ -61,21 +60,39 @@ _wl_paste_completion() { cur="${COMP_WORDS[COMP_CWORD]}" prev="${COMP_WORDS[COMP_CWORD-1]}" - opts="-n --no-newline -l --list-types -w --watch -p --primary -t --type -s --seat -v --version -h --help" - if [ "$prev" = ">" ]; then - compopt -o default - COMPREPLY=() - elif [ \( "x${prev:0:1}" = "x-" -a "x${prev:1:2}" != "x-" -a "${prev: -1}" = "t" \) -o "$prev" = "--type" ]; then - _wl_clipboard_complete_paste_types - elif [ \( "x${prev:0:1}" = "x-" -a "x${prev:1:2}" != "x-" -a "${prev: -1}" = "s" \) -o "$prev" = "--seat" ]; then - seats="$(_wl_clipboard_list_seats)" - COMPREPLY=($(compgen -W "$seats" -- "$cur")) - elif [ "${cur:0:1}" = ">" ]; then - compopt -o default - COMPREPLY=() - else - COMPREPLY=($(compgen -W "$opts" -- "$cur")) - fi + + case "$cur" in + ">"*) + compopt -o default + COMPREPLY=() + return + ;; + esac + + case "$prev" in + ">"*) + compopt -o default + COMPREPLY=() + ;; + -t | -[a-z]*t | --type) + _wl_clipboard_complete_paste_types + ;; + -s | -[a-z]*s | --seat) + seats="$(_wl_clipboard_list_seats)" + COMPREPLY=($(compgen -W "$seats" -- "$cur")) + ;; + *) + opts="-n --no-newline " + opts+="-l --list-types " + opts+="-p --primary " + opts+="-w --watch " + opts+="-t --type " + opts+="-s --seat " + opts+="-v --version " + opts+="-h --help " + COMPREPLY=($(compgen -W "$opts" -- "$cur")) + ;; + esac } complete -o default -F _wl_paste_completion wl-paste |