#compdef mv gmv

local args
if _pick_variant gnu=GNU unix --version; then
  args=(
    '(-b --backup -n --no-clobber)--backup=[make a backup of each existing destination file]: : _values "backup type"
      {none,off}"[never make backups]"
      {numbered,t}"[make numbered backups]"
      {existing,nil}"[numbered backups, if they already exist]"
      {simple,never}"[always make simple backups]"'
    '(-b --backup -n --no-clobber)-b[make a backup of each existing destination file]'
    '(-f --force -i --interactive -n --no-clobber)'{-f,--force}"[don't prompt before overwriting]"
    '(-f --force -i --interactive -n --no-clobber)'{-i,--interactive}'[prompt before overwriting existing file]'
    '--strip-trailing-slashes[remove any trailing slashes from each source argument]'
    '(-S --suffix)'{-S+,--suffix=}'[specify the backup suffix]:backup suffix [~]'
    '(-t --target-directory)'{-t+,--target-directory=}'[move all source arguments into specified directory]:directory:_directories'
    '(-T --no-target-directory)'{-T,--no-target-directory}'[treat final argument as a normal file]'
    '(-u --update)'{-u,--update}'[move only when destination file is older or missing]'
    '(-v --verbose)'{-v,--verbose}'[show file names after they are moved]'
    '(- *)--help[display usage information]'
    '(- *)--version[display version information]'
  )
  [[ $OSTYPE = linux* ]] && args+=(
    '(-Z --context)'{-Z,--context}'[set SELinux security context of destination file to default type]'
  )
else
  local pattern arg
  args=(
    "(-i -n)-f[don't prompt before overwriting]"
    '(-f -n)-i[prompt before overwriting existing file]'
  )
  for pattern arg in \
    '(darwin|dragonfly|freebsd)*' "(-f -i)-n[don't overwrite existing file]" \
    '(darwin|dragonfly|*bsd)*' '-v[show file names after they are moved]' \
    '(dragonfly|freebsd)*' "-h[if target is a symlink to a directory, don't follow it]"
  do
    [[ $OSTYPE = $~pattern ]] && args+=( $arg )
  done
fi

_arguments -s -S $args \
  '*:file:_files'
