#compdef watch

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}'[pause updating if command exits with a non-zero exit code]' \
      '(-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]' \
      '(-q --equexit)'{-q+,--equexit=}'[exit when output of command does not change for the given cycles]:cycles' \
      '(-r --no-rerun)'{-r,--no-rerun}'[do not run the program on terminal resize]' \
      '(-t --no-title)'{-t,--no-title}'[disable header]' \
      '(-w --no-wrap)'{-w,--no-wrap}'[disable line wrapping]' \
      '(-x --exec)'{-x,--exec}'[pass command to exec(2) instead of `sh -c`]' \
      '(-)*::: :->cmd' && ret=0
  ;;
  openbsd*)
    _arguments -s -A "-*" \
      '(-l -w)-c[highlight changed characters]' \
      '-e[pause updating if command exits with a non-zero exit code]' \
      '(-c -w)-l[highlight changed lines]' \
      '-s[set the interval between updates]: :_numbers -d 1 -u seconds interval' \
      '(-c -l)-w[highlight changed words]' \
      '-x[pass command to execl(3) instead of `sh -c`]' \
      '(-)*::: :->cmd' && ret=0
  ;;
  # watch(1) has completely different semantics on freebsd compared to linux, hence:
  (freebsd*|dragonfly*) _watch-snoop "$@" && ret=0 ;;
  (*) _default && ret=0 ;;
esac

[[ $state == cmd ]] &&
if
  (( CURRENT == 1 )) &&
  [[ $words[1] == (\"|\'|\$\')* ]] &&
  [[ -z $opt_args[(i)(-x|--exec)] ]]
then
  _cmdstring && ret=0
else
  _normal -p watch && ret=0
fi

return ret
