Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

[PATCH] Completion: Improve _watch



Someone on IRC complained that the watch completion isn't very good

As far as i can tell it's pretty typical for people to quote the first operand
of the command only when it represents a shell command string (as in
`watch 'foo | grep bar'` — so i made it so that we choose between _cmdstring
and _normal depending on that quoting. Hopefully not too magic

dana


diff --git a/Completion/Unix/Command/_watch b/Completion/Unix/Command/_watch
index a8d29403f..fff3d56f6 100644
--- a/Completion/Unix/Command/_watch
+++ b/Completion/Unix/Command/_watch
@@ -1,9 +1,42 @@
 #compdef watch
 
-# watch(1) has completely different semantics on freebsd compared to linux, hence:
-case $OSTYPE in
-  (freebsd*|dragonfly*) _watch-snoop "$@";;
-  (*)           _default;;
+local variant ret=1
+local -a context line state state_descr
+local -A opt_args
+
+_pick_variant -r variant procps=procps $OSTYPE --version
+
+case $variant in
+  (procps)
+    _arguments -s -S -A '-*' : \
+      '(: * -)'{-h,--help}'[display help information]' \
+      '(: * -)'{-v,--version}'[display version information]' \
+      '(-b --beep)'{-b,--beep}'[beep on non-zero command exit]' \
+      '(-c --color)'{-c,--color}'[interpret ANSI color/style sequences]' \
+      '(-d --differences)'{-d-,--differences=-}'[highlight changes between updates]::how to highlight:(permanent)' \
+      '(-e --errexit)'{-e,--errexit}'[freeze updates on non-zero command exit]' \
+      '(-g --chgexit)'{-g,--chgexit}'[exit on command output change]' \
+      '(-n --interval)'{-n+,--interval=}'[specify update interval]:update interval (seconds) [2]' \
+      '(-p --precise)'{-p,--precise}'[run command at precise intervals]' \
+      '(-t --no-title)'{-t,--no-title}'[disable header]' \
+      '(-x --exec)'{-x,--exec}'[pass command to exec(2) instead of `sh -c`]' \
+      '(-)*::: :->cmd' \
+    && ret=0
+
+    [[ $state == cmd ]] &&
+    if
+      (( CURRENT == 1 )) &&
+      [[ $words[1] == (\"|\'|\$\')* ]] &&
+      [[ -z $opt_args[(i)(-x|--exec)] ]]
+    then
+      _cmdstring && ret=0
+    else
+      _normal && ret=0
+    fi
+    ;;
+  # watch(1) has completely different semantics on freebsd compared to linux, hence:
+  (freebsd*|dragonfly*) _watch-snoop "$@" && ret=0 ;;
+  (*) _default && ret=0 ;;
 esac
 
-# NOTREACHED
+return ret



Messages sorted by: Reverse Date, Date, Thread, Author