summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Bugaev <bugaevc@gmail.com>2019-09-19 16:34:07 +0300
committerSergey Bugaev <bugaevc@gmail.com>2019-09-24 17:26:33 +0300
commitcef29eac68d00e2c5e3d35c4f23804de24e15642 (patch)
tree749047c34fa07e5c8891b2b77740708565b20723
parentdf48e2117d88878e0cb946fd6e73f99c34eebefe (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-copy52
-rw-r--r--completions/bash/wl-paste69
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