#compdef w

local args

case $OSTYPE in
  linux*)
    args=(
      '(H -f --from)'{-f,--from}'[toggle display of remote hostname]'
      '(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 -n --no-truncat)'{-n,--no-truncat}'[non-truncated listing (large)]'
      + 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*)
    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]' )
  ;|
  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
