#compdef w

local -a args

case $OSTYPE in
  linux*)
    args=(
      '(H -f --from)'{-f,--from}'[toggle display of remote hostname]'
      '(-c --container)'{-c,--container}'[show container uptime]'
      '(H -h)--no-header[suppress the heading]'
      '(H -i --ip-addr)'{-i,--ip-addr}'[display IP address instead of hostname]'
      '(H -o --old-style -s --short)'{-o,--old-style}'[old style output format]'
      '(H -s --short -o --old-style)'{-s,--short}'[use short output format]'
      '(H -u --no-current)'{-u,--no-current}'[ignore the username while figuring out the current process and cpu times]'
      '(H -p --pids)'{-p,--pids}'[show process IDs]'
      + H
      '(-)--help[display help information]'
      '(-)'{-V,--version}'[display version information]'
    )
  ;;
  *bsd*|darwin*|dragonfly*)
    args+=( '-i[sort output by idle time]' )
  ;|
  openbsd*)
    args+=( '-a[translate network addresses into names]' )
  ;|
  (free|net)bsd*|dragonfly*|darwin*)
    args+=( '-n[show network addresses as numbers]' )
  ;|
  *bsd*|dragonfly*)
    args+=(
      '-M+[extract values from specified core]:core file:_files'
      '-N+[extract name list from specified system]:system file:_files'
    )
  ;|
  freebsd*|dragonfly*)
    args+=( '-d[dump process list on a per controlling tty basis]' )
  ;|
  netbsd*)
    args+=(
      '-A[sort tty names alphabetically instead of utmp or utmpx order]'
    )
  ;|
  solaris*)
    args+=( '!(-s -w -l)'{-l,-w}
      '-s[short output form]'
      '(-)-u[produce only the heading line]'
    )
  ;|
esac

_arguments -S -s \
  '(--no-header)-h[suppress the heading]' \
  '*:user:_users' $args
