about summary refs log tree commit diff
diff options
context:
space:
mode:
authorOliver Kiddle <opk@zsh.org>2015-05-03 16:53:47 +0200
committerOliver Kiddle <opk@zsh.org>2015-05-03 16:53:57 +0200
commitab7ec8d9851fea8230e1ccfba284c5bfaf457d88 (patch)
tree837b14c838b96728ebdb530eb20d35737ef8419b
parentb29278c69a67089ba225a98478069eb3f32ab4e6 (diff)
downloadzsh-ab7ec8d9851fea8230e1ccfba284c5bfaf457d88.tar.gz
zsh-ab7ec8d9851fea8230e1ccfba284c5bfaf457d88.tar.xz
zsh-ab7ec8d9851fea8230e1ccfba284c5bfaf457d88.zip
35011: update completions for some common Unix commands,
in particular improving FreeBSD support
-rw-r--r--ChangeLog25
-rw-r--r--Completion/BSD/Type/_jails5
-rw-r--r--Completion/Solaris/Command/_beadm135
-rw-r--r--Completion/Solaris/Command/_gcore31
-rw-r--r--Completion/Solaris/Command/_ps77
-rw-r--r--Completion/Solaris/Type/_be_name17
-rw-r--r--Completion/Solaris/Type/_zones8
-rw-r--r--Completion/Unix/Command/_chmod46
-rw-r--r--Completion/Unix/Command/_chown19
-rw-r--r--Completion/Unix/Command/_cmp33
-rw-r--r--Completion/Unix/Command/_comm17
-rw-r--r--Completion/Unix/Command/_cp73
-rw-r--r--Completion/Unix/Command/_cut78
-rw-r--r--Completion/Unix/Command/_date23
-rw-r--r--Completion/Unix/Command/_du75
-rw-r--r--Completion/Unix/Command/_elfdump47
-rw-r--r--Completion/Unix/Command/_find201
-rw-r--r--Completion/Unix/Command/_fuser94
-rw-r--r--Completion/Unix/Command/_gcore50
-rw-r--r--Completion/Unix/Command/_grep2
-rw-r--r--Completion/Unix/Command/_iconv29
-rw-r--r--Completion/Unix/Command/_id60
-rw-r--r--Completion/Unix/Command/_join46
-rw-r--r--Completion/Unix/Command/_last66
-rw-r--r--Completion/Unix/Command/_ldd41
-rw-r--r--Completion/Unix/Command/_ls44
-rw-r--r--Completion/Unix/Command/_md5sum5
-rw-r--r--Completion/Unix/Command/_mkdir66
-rw-r--r--Completion/Unix/Command/_nl40
-rw-r--r--Completion/Unix/Command/_nm49
-rw-r--r--Completion/Unix/Command/_od23
-rw-r--r--Completion/Unix/Command/_patch4
-rw-r--r--Completion/Unix/Command/_ping34
-rw-r--r--Completion/Unix/Command/_ps188
-rw-r--r--Completion/Unix/Command/_readelf62
-rw-r--r--Completion/Unix/Command/_rm15
-rw-r--r--Completion/Unix/Command/_sed42
-rw-r--r--Completion/Unix/Command/_sort107
-rw-r--r--Completion/Unix/Command/_uname116
-rw-r--r--Completion/Unix/Command/_uniq4
-rw-r--r--Completion/Unix/Command/_wc26
-rw-r--r--Completion/Unix/Command/_xargs74
-rw-r--r--Completion/Unix/Type/_diff_options13
-rw-r--r--Completion/Unix/Type/_file_systems15
44 files changed, 1493 insertions, 732 deletions
diff --git a/ChangeLog b/ChangeLog
index 2f1642f62..c6f3d810a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,28 @@
+2015-05-03  Oliver Kiddle  <opk@zsh.org>
+
+	35011: Completion/BSD/Type/_jails, Completion/Solaris/Command/_beadm,
+	Completion/Solaris/Type/_be_name, Completion/Solaris/Type/_zones,
+	Completion/Unix/Command/_chmod, Completion/Unix/Command/_chown,
+	Completion/Unix/Command/_cmp, Completion/Unix/Command/_comm,
+	Completion/Unix/Command/_cp, Completion/Unix/Command/_cut,
+	Completion/Unix/Command/_date, Completion/Unix/Command/_du,
+	Completion/Unix/Command/_elfdump, Completion/Unix/Command/_find,
+	Completion/Unix/Command/_fuser, Completion/Unix/Command/_gcore,
+	Completion/Unix/Command/_grep, Completion/Unix/Command/_iconv,
+	Completion/Unix/Command/_id, Completion/Unix/Command/_join,
+	Completion/Unix/Command/_last, Completion/Unix/Command/_ldd,
+	Completion/Unix/Command/_ls, Completion/Unix/Command/_md5sum,
+	Completion/Unix/Command/_mkdir, Completion/Unix/Command/_nl,
+	Completion/Unix/Command/_nm, Completion/Unix/Command/_od,
+	Completion/Unix/Command/_patch, Completion/Unix/Command/_ping,
+	Completion/Unix/Command/_ps, Completion/Unix/Command/_readelf,
+	Completion/Unix/Command/_rm, Completion/Unix/Command/_sed,
+	Completion/Unix/Command/_sort, Completion/Unix/Command/_uname,
+	Completion/Unix/Command/_uniq, Completion/Unix/Command/_wc,
+	Completion/Unix/Command/_xargs, Completion/Unix/Type/_diff_options,
+	Completion/Unix/Type/_file_systems: update completions for some
+	common Unix commands, in particular improving FreeBSD support
+
 2015-05-01  Peter Stephenson  <p.w.stephenson@ntlworld.com>
 
 	* 35009: README, Etc/FAQ.yo: updates for 5.0.8.
diff --git a/Completion/BSD/Type/_jails b/Completion/BSD/Type/_jails
new file mode 100644
index 000000000..36bffeceb
--- /dev/null
+++ b/Completion/BSD/Type/_jails
@@ -0,0 +1,5 @@
+#autoload
+
+jails=( ${${${${(f)"$(_call_program jails jls -n)"}##*jid=}/ name=/:}%% *} )
+
+_describe -t jails jail jails "$@"
diff --git a/Completion/Solaris/Command/_beadm b/Completion/Solaris/Command/_beadm
index 6e498bee3..8422653d8 100644
--- a/Completion/Solaris/Command/_beadm
+++ b/Completion/Solaris/Command/_beadm
@@ -1,76 +1,69 @@
 #compdef beadm
 
-_beadm() {
-	local context state line subcmds
-	typeset -A opt_args
+local cmd expl args
 
-	subcmds=( activate create destroy list mount rename unmount )
+if (( CURRENT == 2 )); then
+  _wanted subcommands expl 'subcommand' compadd \
+      activate create destroy list mount rename unmount
+  return
+fi
 
-	if [[ $service == "beadm" ]]; then
-		_arguments -C -A "-*" \
-			'*::command:->subcmd' && return 0
+cmd="$words[2]"
+curcontext="${curcontext%:*}-$cmd:"
+shift words
+(( CURRENT-- ))
 
-		if (( CURRENT == 1 )); then
-			_wanted commands expl 'beadm subcommand' compadd -a subcmds
-			return
-		fi
-		service="$words[1]"
-		curcontext="${curcontext%:*}=$service:"
-	fi
-
-	case $service in
-	(activate)
-		_arguments -A "-*" \
-			':BE name:_be_name'
-		;;
-
-	(create)
-		# TODO: Add support for -o, and for creating snapshots
-		_arguments -A "-*" \
-			'-a[Activate new BE]' \
-			'-d[Description]:' \
-			'-e[Base BE]:BE name or snapshot:_be_name -t all' \
-			'-p[Create new BE in specified ZFS pool]:ZFS pool:_zfs_pool' \
-			':new BE name:'
-		;;
-
-	(destroy)
-		_arguments -A "-*" \
-			'-f[Unmount BE if necessary]' \
-			"-F[Don't prompt for verification]" \
-			':BE or BE snapshot:_be_name'
-		;;
-
-	(list)
-		_arguments -A "-*" \
-			'-a[List subordinate filesystems and snapshots]' \
-			'-d[List subordinate filesystems]' \
-			'-s[List snapshots]' \
-			'-H[Parseable format]' \
-			':BE name:_be_name'
-		;;
-
-	(mount)
-		_arguments -A "-*" \
-			':BE name:_be_name' \
-			':mountpoint:_path_files -/'
-		;;
-
-	(rename)
-		_arguments -A "-*" \
-			':existing BE name:_be_name' \
-			':new BE name:'
-		;;
-
-	(unmount)
-		_arguments -A "-*" \
-			'-f[Force unmount]' \
-			':BE name:_be_name'
-		;;
-
-	(*)
-		_message "unknown beadm subcommand: $service"
-	esac
-}
-
-_beadm "$@"
+case $cmd in
+  activate)
+    _wanted boot-environs expl 'boot environment' _be_name
+  ;;
+  create)
+    [[ $OSTYPE = solaris* ]] && args=(
+      '-a[activate new BE]'
+      '-d[description]:description'
+      '*-o[property]:zfs property'
+      '-p[create new BE in specified zfs pool]:zfs pool:_zfs_pool'
+    )
+    _arguments -A "-*" $args \
+      '-e[base BE]:BE name or snapshot:_be_name -t all' \
+      ':new BE name:'
+  ;;
+  destroy)
+    [[ $OSTYPE = solaris* ]] && args=(
+      '-f[unmount BE if necessary]'
+    )
+    _arguments -A "-*" \
+      "-F[don't prompt for verification]" \
+      ':BE or BE snapshot:_be_name'
+  ;;
+  list)
+    if [[ $OSTYPE = solaris* ]]; then
+      args=( '-d[list subordinate filesystems]' )
+    elif [[ $OSTYPE = freebsd* ]]; then
+      args=( '-D[display space usage of boot environment]' )
+    fi
+    _arguments -A "-*" \
+      '-a[list subordinate filesystems and snapshots]' \
+      '-s[list snapshots]' \
+      '-H[parseable format]' \
+      ':boot environment:_be_name'
+  ;;
+  mount)
+    _arguments -A "-*" \
+      ':BE name:_be_name' \
+      ':mountpoint:_path_files -/'
+  ;;
+  rename)
+    _arguments -A "-*" \
+      ':existing boot environment name:_be_name' \
+      ':new boot environment:'
+  ;;
+  u(n|)mount)
+    _arguments -A "-*" \
+      '-f[force unmount]' \
+      ':boot environment:_be_name'
+  ;;
+  *)
+    _message "unknown beadm subcommand: $service"
+  ;;
+esac
diff --git a/Completion/Solaris/Command/_gcore b/Completion/Solaris/Command/_gcore
deleted file mode 100644
index d4ac9a03a..000000000
--- a/Completion/Solaris/Command/_gcore
+++ /dev/null
@@ -1,31 +0,0 @@
-#compdef gcore
-
-_gcore() {
-	local -a content
-
-	content=(
-		"anon[anonymous private mappings]"
-		"ctf[CTF type information]"
-		"data[writable private file mappings]"
-		"dism[DISM mappings]"
-		"heap[process heap]"
-		"ism[ISM mappings]"
-		"rodata[read-only private file mappings]"
-		"shanon[anonymous shared mappings]"
-		"shfile[file-backed shared mappings]"
-		"shm[System V shared memory]"
-		"stack[process stack]"
-		"symtab[symbol table sections for loaded files]"
-		"text[readable and executable private file mappings]"
-	)
-
-	_arguments -s \
-		'-p[use per-process core file repository]' \
-		'-g[use global core file repository]' \
-		'-F[force grabbing the target process]' \
-		'-c[set core file content]:_values -s + "content" $content' \
-		'-o[set core file base name]:' \
-		'*:pids:_pids'
-}
-
-_gcore "$@"
diff --git a/Completion/Solaris/Command/_ps b/Completion/Solaris/Command/_ps
deleted file mode 100644
index 5ae61832a..000000000
--- a/Completion/Solaris/Command/_ps
+++ /dev/null
@@ -1,77 +0,0 @@
-#compdef ps
-
-_ps()
-{
-	local -a o_opt
-
-o_opt=(
-	"user[user ID]"
-	"ruser[real user ID]"
-	"group[group ID]"
-	"rgroup[real group ID]"
-	"pid[process ID]"
-	"ppid[parent process ID]"
-	"pgid[process group ID]"
-	"pcpu[ratio of CPU time used recently to CPU time available]"
-	"vsz[total size of the process in virtual memory, in kilobytes]"
-	"nice[decimal value of the system scheduling priority of the process]"
-	"etime[elapsed time since the process was started]"
-	"time[cumulative CPU time of the process]"
-	"tty[name of the controlling terminal of the process]"
-	"comm[name of the command being executed]"
-	"args[command with all its arguments as a string]"
-	"f[flags associated with the process]"
-	"s[state of the process]"
-	"c[processor utilization for scheduling]"
-	"uid[effective user ID number]"
-	"ruid[real user ID number]"
-	"gid[effective group ID number]"
-	"rgid[real group ID numberu]"
-	"projid[project ID number]"
-	"project[project name]"
-	"zoneid[zone ID number]"
-	"zone[zone name]"
-	"sid[process ID of the session leader]"
-	"taskid[task ID of the process]"
-	"class[scheduling class]"
-	"pri[priority, higher number - higher priority]"
-	"opri[obsolete priority, lower number - higher priority]"
-	"lwp[lwd ID number]"
-	"nlwp[number of lwps in the process]"
-	"psr[number of the processor to which the process or lwp is bound]"
-	"pset[ID of the processor set to which the process or lwp is bound]"
-	"addr[memory address of the process]"
-	"osz[total size of the process in virtual memory, in pages]"
-	"wchan[address of an event for which the process is sleeping]"
-	"stime[starting time or date of the process]"
-	"rss[resident set size of the process, in kilobytes]"
-	"pmem[ratio of resident set size to physical memory on the machine, in %]"
-	"fname[first 8 bytes of base name of process's executable file]"
-	"ctid[contract ID number]"
-	"lgrp[home lgroup]"
-)
-_arguments \
-	'-a[information about all processes most frequently requested]' \
-	'-c[information in a format that reflects scheduler properties]' \
-	'-d[information about all processes except session leaders]' \
-	'-e[information about every process]' \
-	'-f[full listing]' \
-	'-g[only process data whose group leaders ID number(s) appears in grplist]:group leader ID list' \
-	'-G[information for processes whose real group ID numbers are in gidlist]:real group ID list' \
-	'-H[prints the home lgroup of the process]' \
-	'-j[prints session ID and process group ID]' \
-	'-l[long listing]' \
-	'-L[information about each light weight process]' \
-	'-o[specify output format]:property:_values -s , "property" $o_opt' \
-	'-p[only process data whose process ID numbers are given in proclist]:process ID list' \
-	'-P[Prints the number of the processor to which the process or lwp is bound]' \
-	'-s[information on all session leaders whose IDs appear in sidlist]:session leader ID list' \
-	'-t[lists only process data associated with term]:term' \
-	'-u[only process data whose effective user ID number or login name is given in uidlist]:UID:_users' \
-	'-U[information for processes whose real user ID numbers or login names are in uidlist]:UID:_users' \
-	'-y[both RSS and SZ is reported in kilobytes, instead pages (used with -l)]' \
-	'-z[lists only processes in the specified zones]:zone list' \
-	'-Z[prints the name of the zone with which the process is associated]'
-}
-
-_ps "$@"
diff --git a/Completion/Solaris/Type/_be_name b/Completion/Solaris/Type/_be_name
index b25a8ff22..4b80c65f2 100644
--- a/Completion/Solaris/Type/_be_name
+++ b/Completion/Solaris/Type/_be_name
@@ -1,18 +1,13 @@
 #autoload
 
-local -a type be_names
-local name uuid activate mtpt space policy created snap
+local -a type be_names expl
 
 zparseopts -D -E -a type t+:
 
-beadm list -H | while IFS=\; read name uuid active mtpt space policy created; do
-	be_names=( $be_names $name )
-done
+be_names=( ${${(f)"$(_call_program boot-environs beadm list -H)"}%%;*} )
 
-if [[ -n $type[(r)all] ]]; then
-	beadm list -sH | while IFS=\; read name snap space policy created; do
-		be_names=( $be_names $snap )
-	done
-fi
+[[ -n $type[(r)all] ]] &&
+  be_names+=( ${${${(f)"$(_call_program boot-environs beadm list -sH)"}#*;}%%;*} )
 
-compadd "$@" - $be_names
+_description boot-environs expl 'boot environment'
+compadd "$@" "$expl[@]" -a be_names
diff --git a/Completion/Solaris/Type/_zones b/Completion/Solaris/Type/_zones
index 0c2d273a2..92064d2b8 100644
--- a/Completion/Solaris/Type/_zones
+++ b/Completion/Solaris/Type/_zones
@@ -1,13 +1,11 @@
 #autoload
 
-local -a type typearg
-local zonelist
+local -a type typearg expl
 
 zparseopts -D -E -a type t+:
 
 [[ -n $type[(r)c] ]] && typearg=-c
 [[ -n $type[(r)i] ]] && typearg=-i
 
-zonelist=( ${="$(zoneadm list $typearg)"} )
-
-compadd "$@" - $zonelist
+_description zones expl zone
+compadd "$@" "$expl[@]" - ${="$(_call_program zones /usr/sbin/zoneadm list $typearg)"}
diff --git a/Completion/Unix/Command/_chmod b/Completion/Unix/Command/_chmod
index 48ce050e4..85e6df1ae 100644
--- a/Completion/Unix/Command/_chmod
+++ b/Completion/Unix/Command/_chmod
@@ -1,34 +1,52 @@
-#compdef chmod
+#compdef chmod gchmod
 
 local curcontext="$curcontext" state line expl ret=1
 local -a args privs
 
-args=( '*:file:->files' )
-(( $+words[(r)--reference*] )) || args+=( '1:mode:->mode' )
+args=( '*:file:->files' '1:mode:->mode' )
 
 if _pick_variant gnu=Free\ Soft unix --version; then
   args+=(
     '(-v --verbose -c --changes)'{-c,--changes}'[report changes made]'
     '(-v --verbose -c --changes)'{-v,--verbose}'[output a diagnostic for every file processed]'
     '(-f --silent --quiet)'{-f,--silent,--quiet}'[suppress most error messages]'
-    '--reference=[copy permissions of specified file]:file:_files'
+    '(--no-preserve-root)--preserve-root[fail to operate recursively on /]'
+    "(--preserve-root)--no-preserve-root[don't treat / specially (default)]"
+    '(1)--reference=[copy permissions of specified file]:file:_files'
     '(-R --recursive)'{-R,--recursive}'[change files and directories recursively]'
     '(- : *)--help[display help information]'
     '(- : *)--version[display version information]'
   )
-  privs=(
-    'X[execute only if executable to another]'
-    "u[owner's current permissions]"
-    "g[group's current permissions]"
-    "o[other's current permissions]"
-  )
 else
-  # based on $OSTYPE = solaris2.8
   args+=(
     '-f[suppress most error messages]'
     '-R[change files and directories recursively]'
   )
-  privs=( 'l[mandatory locking]' )
+  case $OSTYPE in
+    freebsd*|dragonfly*|darwin*)
+      args+=( '-v[output a diagnostic for every file processed]')
+    ;|
+    freebsd*|netbsd*|darwin*|dragonfly*)
+      args+=( "-h[operate on symlinks them self]" )
+    ;|
+    freebsd*|openbsd*|netbsd*|darwin*|dragonfly*)
+      args+=(
+	'(-H -L -P)-L[follow all symlinks]'
+	'(-H -L -P)-H[follow symlinks on the command line]'
+	'(-H -L -P)-P[do not follow symlinks (default)]'
+      )
+    ;|
+    darwin*)
+      args+=(
+        '(1)-C[returns false if any of the named files have ACLs]'
+	'(1)-N[remove ACLs from specified files]'
+	'(1)-E[read ACL info from stdin as a sequential list of ACEs]'
+	'(1)-i[removes inherited bit from all entries in named files ACLs]'
+        '(1)-I[removes all inherited entries from named files ACLs]'
+      )
+    ;;
+    solaris*) privs=( 'l[mandatory locking]' ) ;;
+  esac
 fi
 
 _arguments -C -s "$args[@]" && ret=0
@@ -43,6 +61,10 @@ case "$state" in
       _values -S '' privilege \
 	'r[read]' 'w[write]' 'x[execute]' \
 	's[set uid/gid]' 't[sticky]' \
+	'X[execute only if directory or executable to another]' \
+	"u[owner's current permissions]" \
+	"g[group's current permissions]" \
+	"o[other's current permissions]" \
 	"$privs[@]" && ret=0
     else
       suf=( -S '' )
diff --git a/Completion/Unix/Command/_chown b/Completion/Unix/Command/_chown
index 71c21da32..641b5a773 100644
--- a/Completion/Unix/Command/_chown
+++ b/Completion/Unix/Command/_chown
@@ -1,29 +1,42 @@
 #compdef chown chgrp zf_chown=chown zf_chgrp=chgrp
 
 local curcontext="$curcontext" state line expl ret=1
-local suf usr grp req deref args
+local suf usr grp req deref pattern arg args
 
 if _pick_variant gnu=Free\ Soft unix --version; then
   args=(
     '(-c --changes -v --verbose)'{-c,--changes}'[report each change made]'
     '(-c --changes -v --verbose)'{-v,--verbose}'[output info for every file processed]'
     '(-h --no-dereference)--dereference[dereference symlinks]'
-    '(-h --no-dereference --dereference)'{-h,--no-dereference}'[operate on symlinks them self]'
+    '(-h --no-dereference --dereference)'{-h,--no-dereference}'[operate on symlinks themselves]'
     '(-f --silent --quiet)'{-f,--silent,--quiet}"[don't report errors]"
+    '--preserve-root[fail to operate recursively on /]'
     '--reference=[copy ownership of specified file]:file:_files'
     '(-R --recursive)'{-R,--recursive}'[change files and directories recursively]'
+    '(-H -L -P)-L[follow all symlinks]'
+    '(-H -L -P)-H[follow symlinks on the command line]'
+    '(-H -L -P)-P[do not follow symlinks (default)]'
     '(- : *)--help[display help information]'
     '(- : *)--version[display version information]'
   )    
   [[ $service = chown ]] &&
       args+=( '--from=[restrict changes to files by current ownership]: :->owner' )
 else
-  # based on $OSTYPE = solaris2.8
   args=(
     "-f[don't report errors]"
     "-h[operate on symlinks them self]"
     '-R[change files and directories recursively]'
+    '(-H -L -P)-L[follow all symlinks]'
+    '(-H -L -P)-H[follow symlinks on the command line]'
+    '(-H -L -P)-P[do not follow symlinks (default)]'
   )
+  for pattern arg in \
+    'freebsd*' "-x[don't traverse file systems]" \
+    '(darwin|dragonfly|(free|net)bsd)*' '-v[output info for every file processed]' \
+    'solaris2.<11->' '-s[owner and/or group are Windows SID strings]'
+  do
+    [[ $OSTYPE = $~pattern ]] && args+=( $arg )
+  done
 fi
 
 (( $+words[(r)--reference*] )) || args+=( '(--reference)1: :->owner' )
diff --git a/Completion/Unix/Command/_cmp b/Completion/Unix/Command/_cmp
new file mode 100644
index 000000000..bcede8b0b
--- /dev/null
+++ b/Completion/Unix/Command/_cmp
@@ -0,0 +1,33 @@
+#compdef cmp gcmp
+
+local args variant
+_pick_variant -r variant gnu=GNU $OSTYPE --version
+
+case $variant in
+  gnu)
+    args=(
+      '(-b --print-bytes)'{-b,--print-bytes}'[print differing bytes]'
+      '(-i --ignore-initial)'{-i+,--ignore-initial}'[skip specified number of bytes]:bytes'
+      '(-l --verbose -s --silent --quiet)'{-l,--verbose}'[output all differences]'
+      '(-n --bytes)'{-n+,--bytes=}'[specify maximum bytes to compare]:bytes'
+      '(-s --quiet --silent -l --verbose)'{-s,--quiet,--silent}'[return status alone signifies differences]'
+      '(- *)'{-v,--version}'[display version information]'
+      '(- *)--help[display help information]'
+    )
+  ;;
+  freebsd*|openbsd*)
+    args=(
+      "-h[don't follow symbolic links]"
+      '-x[hexadecimal output and zero based offset index]'
+      '-z[compare file sizes first]'
+    )
+  ;&
+  *)
+    args+=(
+      '(-s)-l[output all differences]'
+      '(-l)-s[silent: return status alone signifies differences]'
+    )
+  ;;
+esac
+
+_arguments -s $args '1:file 1:_files' '2:file 2:_files' '::byte offset' '::byte offset'
diff --git a/Completion/Unix/Command/_comm b/Completion/Unix/Command/_comm
index e90c317f6..d1d835f6a 100644
--- a/Completion/Unix/Command/_comm
+++ b/Completion/Unix/Command/_comm
@@ -1,20 +1,27 @@
-#compdef comm
+#compdef comm gcomm
 
 local -a args
 
 args=(
-  '-1[suppress lines unique to FILE1]'
-  '-2[suppress lines unique to FILE2]'
+  '-1[suppress lines unique to first file]'
+  '-2[suppress lines unique to second file]'
   '-3[suppress lines that appear in both files]'
-  '1:file1 to compare:_files'
-  '2:file2 to compare:_files'
+  '1:file to compare:_files'
+  '2:file to compare:_files'
 )
 
 if _pick_variant gnu=GNU unix --version; then
   args+=(
+    '(--nocheck-order)--check-order[check input is correctly sorted]'
+    "(--check-order)--nocheck-order[don't check input is correctly sorted]"
+    '--output-delimiter=:delimiter'
     '(- : *)--version[display version information]'
     '(- : *)--help[display help information]'
   )
+elif [[ $OSTYPE = (freebsd|dragonfly|darwin)* ]]; then
+  args+=( '-i[case insensitive comparison of lines]' )
+elif [[ $OSTYPE = (openbsd|netbsd)* ]]; then
+  args+=( '-f[case insensitive comparison of lines]' )
 fi
 
 _arguments -s $args
diff --git a/Completion/Unix/Command/_cp b/Completion/Unix/Command/_cp
index 70ab0858e..4c4dea2e9 100644
--- a/Completion/Unix/Command/_cp
+++ b/Completion/Unix/Command/_cp
@@ -1,22 +1,23 @@
-#compdef cp
+#compdef cp gcp
 
 if _pick_variant gnu=GNU unix --version; then
   _arguments -s -S \
-    '(-a --archive)'{-a,--archive}'[same as -dR --preserve=all]' \
+    '(-a --archive)'{-a,--archive}'[archive mode, same as -dR --preserve=all]' \
+    "--attributes-only[don't copy file data, just attributes]" \
     '(-b --backup)-b[backup]' \
-    '(-b --backup)--backup=[backup]:method:(none off numbered t existing nil simple never)' \
+    '(-b --backup)--backup=-[backup each destination file]::method:(none off numbered t existing nil simple never)' \
     '--copy-contents[copy contents of special files when recursive]' \
     '-d[same as --no-dereference --preserve=links]' \
     '(-f --force)'{-f,--force}'[remove and retry for destinations that cannot be opened]' \
-    '(-i --interactive)'{-i,--interactive}'[prompt before overwrite]' \
+    '(-i --interactive -n --no-clobber)'{-i,--interactive}'[prompt before overwrite]' \
     '-H[follow command-line symbolic links]' \
     '(-l --link)'{-l,--link}'[link files instead of copying]' \
     '(-L --dereference)'{-L,--dereference}'[always follow symbolic links]' \
-    '(-n --no-clobber)'{-n,--no-clobber}'[do not overwrite an existing file]' \
+    (-n --no-clobber -i --interactive){-n,--no-clobber}"[don't overwrite an existing file]" \
     '(-P --no-dereference)'{-P,--no-dereference}'[never follow symbolic links]' \
     '-p[same as --preserve=mode,ownership,timestamps]' \
-    '--preserve=[preserve specified attributes]:attributes to preserve:_values -s , mode timestamps ownership links context xattr all' \
-    '--no-preserve=[don'\''t preserve specified attributes]:attributes not to preserve:_values -s , mode timestamps ownership links context xattr all' \
+    '--preserve=-[preserve specified attributes]:: :_values -s , attribute mode timestamps ownership links context xattr all' \
+    "--no-preserve=[don't preserve specified attributes]: :_values -s , attribute mode timestamps ownership links context xattr all" \
     '--parents[append source path to target directory]' \
     '(-R -r --recursive)'{-R,-r,--recursive}'[copy directories recursively]' \
     '--reflink=-[control clone/CoW copies]::when to perform a lightweight copy:(always auto)' \
@@ -24,39 +25,41 @@ if _pick_variant gnu=GNU unix --version; then
     '--sparse=[control creation of sparse files]:when to create sparse files:(auto always never)' \
     '--strip-trailing-slashes[remove any trailing slashes from each source argument]' \
     '(-s --symbolic-link)'{-s,--symbolic-link}'[make symbolic links instead of copies of non-directories]' \
-    '(-S --suffix)'{-S,--suffix=}'[override the usual backup suffix]:backup suffix:' \
-    '(-t --target-directory)'{-t,--target-directory=}'[copy all source arguments into target directory]:target directory:_files -/' \
+    '(-S --suffix)'{-S+,--suffix=}'[override the usual backup suffix]:backup suffix' \
+    '(-t --target-directory)'{-t+,--target-directory=}'[copy all source arguments into target directory]:target directory:_files -/' \
     '(-T --no-target-directory)'{-T,--no-target-directory}'[treat DEST as a normal file]' \
     '(-u --update)'{-u,--update}'[copy only when source is newer than destination or destination is missing]' \
     '(-v --verbose)'{-v,--verbose}'[explain what is being done]' \
     '(-x --one-file-system)'{-x,--one-file-system}'[stay on this file system]' \
-    '--help' \
-    '--version' \
+    '(--context)-Z[set destination SELinux security context]' \
+    '(-Z)--context=-[set destination SELinux security context]::context' \
+    '(- *)--help' '(- *)--version' \
     '*:file or directory:_files'
-
-elif [[ "$OSTYPE" == darwin* ]]; then
-  _arguments -s -S \
-    '-R[copy directories recursively]' \
-    '(-L -P)-H[with -R, follow symlinks on the command line]' \
-    '(-H -P)-L[with -R, follow all symlinks]' \
-    '(-H -L)-P[with -R, do not follow symlinks (default)]' \
-    '(-i -n)-f[force overwriting existing file]' \
-    '(-f -n)-i[confirm before overwriting existing file]' \
-    '(-f -i)-n[do not overwrite existing file]' \
-    '-a[same as -pRP]' \
-    '-p[preserve timestamps, mode, owner, flags, ACLs, and Extended Attributes]' \
-    '-v[show file names as they are copied]' \
-    '-X[do not copy Extended Attributes or resource forks]' \
-    '(-)*:file or directory:_files'
-
-else    # assume POSIX
-  _arguments -s -S \
+else
+  local pattern arg args
+  args=(
+    '(-L -P)-H[follow symlinks on the command line in recursive mode]'
+    '(-H -P)-L[follow all symlinks in recursive mode]'
+    '(-H -L)-P[do not follow symlinks in recursive mode (default)]'
+    '(-i -n)-f[force overwriting existing file]'
+    '(-f -n)-i[confirm before overwriting existing file]'
+    '-p[preserve timestamps, mode, owner, flags, ACLs, and extended attributes]'
     '-R[copy directories recursively]' \
-    '(-L -P)-H[with -R, follow symlinks on the command line]' \
-    '(-H -P)-L[with -R, follow all symlinks]' \
-    '(-H -L)-P[do not follow symlinks]' \
-    '(-i)-f[force overwriting existing file]' \
-    '(-f)-i[confirm before overwriting existing file]' \
-    '-p[preserve timestamps, mode, and owner]' \
     '(-)*:file or directory:_files'
+  )
+  for pattern arg in \
+    '(aix|hpux|irix|solaris)*' '-r[copy directories recursively]' \
+    'solaris2.<9->*' '-@[preserve extended attributes]' \
+    'solaris2.<11->*' '-/[preserve extended attributes and extended system attributes]' \
+    '(darwin|dragonfly|freebsd)*' "(-f -i)-n[don't overwrite existing file]" \
+    'netbsd*' "-N[don't copy file flags]" \
+    '(darwin|dragonfly|freebsd|netbsd)*' '-a[archive mode, same as -RpP]' \
+    '(dragonfly|freebsd)*' '-l[link files instead of copying]' \
+    '(darwin|dragonfly|freebsd|netbsd)*' '-v[show file names as they are copied]' \
+    'darwin*' "-X[don't copy extended attributes or resource forks]" \
+    '(dragonfly|freebsd)*' "-x[don't traverse file systems]"
+  do
+    [[ $OSTYPE = $~pattern ]] && args+=( $arg )
+  done
+  _arguments -s -S $args
 fi
diff --git a/Completion/Unix/Command/_cut b/Completion/Unix/Command/_cut
index 1024c20a7..caf8f32b7 100644
--- a/Completion/Unix/Command/_cut
+++ b/Completion/Unix/Command/_cut
@@ -2,44 +2,41 @@
 
 typeset -A _cut_args
 
-if _pick_variant gnu="Free Soft" unix --version; then
-  case $LANG in
-    (de_DE.UTF-8)
-      _cut_args=(
-	bytes           "nur diese Bytes ausgeben"
-	characters      "nur diese Zeichen ausgeben"
-	delimiter       "Delimiter anstelle von Tabulator als Trenner benutzen"
-	fields          "nur diese Felder und alle Zeilen OHNE Trennzeichen ausgeben"
-	n               "(ignoriert)"
-	complement      $'das Komplement der Menge der gew\u00e4hlten Bytes, Zeichen oder Felder bilden'
-	only-delimited  "keine Zeilen ausgeben, die keinen Trenner enthalten"
-	output-delimiter "Zeichenkette als Ausgabetrennzeichen benutzen"
-	help            "diese Hilfe anzeigen und beenden"
-	version         "Versionsinformation anzeigen und beenden"
-      )
-    ;;
-    (*)
-      _cut_args=(
-	bytes           "select only these bytes"
-	characters      "select only these characters"
-	delimiter       "use DELIM instead of TAB for field delimiter"
-	fields          "select only these fields and lines without the delimiter character"
-	n               "(ignored)"
-	complement      "complement the set of selected bytes, characters or fields"
-	only-delimited  "do not print lines not containing delimiters"
-	output-delimiter "use STRING as the output delimiter"
-	help            "display this help and exit"
-	version         "output version information and exit"
-      )
-    ;;
-  esac
+case $LANG in
+  (de_DE.UTF-8)
+    _cut_args=(
+      bytes           "nur diese Bytes ausgeben"
+      characters      "nur diese Zeichen ausgeben"
+      delimiter       "Delimiter anstelle von Tabulator als Trenner benutzen"
+      fields          "nur diese Felder und alle Zeilen OHNE Trennzeichen ausgeben"
+      complement      $'das Komplement der Menge der gew\u00e4hlten Bytes, Zeichen oder Felder bilden'
+      only-delimited  "keine Zeilen ausgeben, die keinen Trenner enthalten"
+      output-delimiter "Zeichenkette als Ausgabetrennzeichen benutzen"
+      help            "diese Hilfe anzeigen und beenden"
+      version         "Versionsinformation anzeigen und beenden"
+    )
+  ;;
+  (*)
+    _cut_args=(
+      bytes           "select only specified bytes"
+      characters      "select only specified characters"
+      delimiter       "use alternate field delimiter"
+      fields          "select only specified fields"
+      complement      "negate the set of selected bytes, characters or fields"
+      only-delimited  "suppress lines with no delimiters"
+      output-delimiter "use specified string as the output delimiter"
+      help            "display help information"
+      version         "output version information"
+    )
+  ;;
+esac
 
+if _pick_variant gnu="Free Soft" unix --version; then
   _arguments \
     '(--bytes -b)'{--bytes=,-b+}'['$_cut_args[bytes]']:list' \
     '(--characters -c)'{--characters=,-c+}'['$_cut_args[characters]']:list' \
     '(--delimiter -d)'{--delimiter=,-d+}'['$_cut_args[delimiter]']:delimiter' \
     '(--fields -f)'{--fields=,-f+}'['$_cut_args[fields]']:list' \
-    '-n['$_cut_args[n]']' \
     '--complement['$_cut_args[complement]']' \
     '(--only-delimited -s)'{--only-delimited,-s}'['$_cut_args[only-delimited]']' \
     '--output-delimiter=['$_cut_args[output-delimiter]']:delimiter' \
@@ -47,12 +44,15 @@ if _pick_variant gnu="Free Soft" unix --version; then
     '(- *)--version['$_cut_args[version]']' \
     '*:file:_files'
 else
-  _arguments \
-    '-b[list specifies byte positions]:list:' \
-    '-c[list specifies character positions]:list:' \
-    '-d[use alternate delimiter]:delimiter' \
-    '-f[list specifies fields]:list:' \
-    '-n[do not split multi-byte characters]' \
-    '-s[suppress lines with no delimiters]' \
+  case $OSTYPE in
+    freebsd*|dragonfly*) args+=( '(-d)-w[use whitespace as the delimiter]' ) ;;
+  esac
+  _arguments $args \
+    "-b[${_cut_args[bytes]}]:list" \
+    "-c[${_cut_args[characters]}]:list" \
+    "(-w)-d[${_cut_args[delimiter]}]:delimiter" \
+    "-f[${_cut_args[fields]}]:list" \
+    "-n[do not split multi-byte characters]" \
+    "-s[${_cut_args[only-delimited]}]" \
     '*:file:_files'
 fi
diff --git a/Completion/Unix/Command/_date b/Completion/Unix/Command/_date
index 7b1d3a7ab..e596ac038 100644
--- a/Completion/Unix/Command/_date
+++ b/Completion/Unix/Command/_date
@@ -1,4 +1,4 @@
-#compdef date
+#compdef date gdate
 
 local -a args
 
@@ -8,7 +8,7 @@ if _pick_variant gnu="Free Software Foundation" unix --version; then
     '-f[output dates specified in file]:file:_files'
     '-I-[iso-8601]:precision:(date hours minutes seconds)'
     '-r[reference]:file:_files'
-    '-R[rfc-2822]'
+    '-R[RFC2822 format]'
     '-s[set]:time string'
     '--rfc-3339=-[output date and time in RFC 3339 format]:output type:(date seconds ns)'
     --
@@ -20,26 +20,23 @@ else
     solaris*)
       args=( '-a:adjustment' )
     ;;
-    freebsd*|darwin*)
+    freebsd*|darwin*|dragonfly*|netbsd*|openbsd*)
       args=(
 	'-n[only set time on current machine]'
 	'-d:daylight saving time value'
 	'-j[do not try to set date]'
-	'-f:parsing format'
 	'-r:seconds since epoch'
 	'-t:minutes west of GMT'
-	'-v:adjustment value'
       )
+    ;|
+    freebsd*) args+=( '-R[RFC2822 format]' ) ;|
+    freebsd*|dragonfly*|darwin*)
+      args+=( '-f:parsing format' '-v:adjustment value' )
     ;;
     openbsd*)
-      args=(
-	'-n[only set time on current machine]'
-	'-d:daylight saving time value'
-	'-a[gradually skew]'
-	'-r:seconds since epoch'
-	'-t:minutes west of GMT'
-      )
-    ;;
+      args+=( '-z[specify timezone for output]:time zone:_time_zone')
+    ;|
+    openbsd*|netbsd*) args=( '-a[gradually skew]' ) ;;
   esac
 fi
 
diff --git a/Completion/Unix/Command/_du b/Completion/Unix/Command/_du
index 8b053ba4d..d8871cd8d 100644
--- a/Completion/Unix/Command/_du
+++ b/Completion/Unix/Command/_du
@@ -1,4 +1,4 @@
-#compdef du
+#compdef du gdu
 
 if _pick_variant gnu=Free\ Soft unix --version /dummy/no-such-file; then
   local context state line expl ret=1
@@ -18,7 +18,7 @@ if _pick_variant gnu=Free\ Soft unix --version /dummy/no-such-file; then
     '(-l --count-links)'{-l,--count-links}'[count sizes many times if hard linked]' \
     '(-L --dereference -H -D --dereference-args -P --no-dereference)'{-L,--dereference}'[dereference all symlinks]' \
     '(-S --separate-dirs)'{-S,--separate-dirs}'[do not include size of subdirectories]' \
-    '(-s --summarize --max-depth -a --all)'{-s,--summarize}'[only display total for each argument]' \
+    '(-s --summarize --max-depth -a --all)'{-s,--summarize}'[only report total for each argument]' \
     '(-x --one-file-system)'{-x,--one-file-system}'[skip directories on different filesystems]' \
     '(-0 --null)'{-0,--null}'[end each output line with NUL instead of newline]' \
     \*{-X+,--exclude-from=}'[exclude files matching any pattern in file]:file:_files' \
@@ -26,17 +26,13 @@ if _pick_variant gnu=Free\ Soft unix --version /dummy/no-such-file; then
     '(-s --summarize)--max-depth=[maximum levels to recurse]:levels' \
     '--files0-from=[use NUL-terminated list of files from file]:file:_files' \
     '--time-style=[show times using given style, +FORMAT for strftime formatted args]:style:->timestyle' \
-    '--time=-[show time of last modification of any file in the directory]:property:->time' \
+    '--time=-[show time of last modification of any file in the directory]:property:(atime access use ctime status)' \
+    '(-t --threshold)'{-t+,--threshold=}'[report only entries for which size exceeds threshold]:threshold' \
     '(* -)--help[display help information]' \
     '(* -)--version[display version information]' \
     '*:file:_files' && ret=0
 
   case $state in
-    (time)
-      local -a property
-      property=(atime access use ctime status)
-      _wanted -C $context property expl property compadd -a property && ret=0
-    ;;
     (timestyle)
       local -a style desc
       style=(full-iso long-iso iso +)
@@ -47,39 +43,36 @@ if _pick_variant gnu=Free\ Soft unix --version /dummy/no-such-file; then
 
   return ret
 
-elif [[ "$OSTYPE" == darwin* ]]; then
-  _arguments -s -A "-*" \
-    '(-H -L -P)-H[follow symlinks on the command line]' \
-    '(-H -L -P)-L[follow all symlinks]' \
-    '(-H -L -P)-P[do not follow symlinks (default)]' \
-    '*-I+[ignore files/directories matching specified mask]:mask' \
-    '(-a -s -d)-a[display entry also for files (not just directories) in file hierarchy]' \
-    '(-a -s -d)-d+[display entry for directories up to specified depth]:depth' \
-    '(-a -s -d)-s[display entry only for files/directories specified on the command line]' \
-    '(-h -k -m -g)-h[human readable output]' \
-    '(-h -k -m -g)-k[use block size of 1K-byte]' \
-    '(-h -k -m -g)-m[use block size of 1M-byte]' \
-    '(-h -k -m -g)-g[use block size of 1G-byte]' \
-    '-c[display grand total]' \
-    '-r[notify about unreadable files/directories]' \
-    '-x[exclude directories on different file systems]' \
-    '*:file:_files'
-
 else
-  # based on $OSTYPE = solaris2.8
+  local pattern arg args
+  args=(
+    '(-a -s -d)-a[report sizes for all files, not just directories]'
+    '(-H -L -P)-L[follow all symlinks]'
+    '(-a -s -d)-s[only report total for each argument]'
+    '(-h -m -g -B)-k[use block size of 1K-byte]'
+    '-r[notify about unreadable files/directories]'
+  )
   local xdev='[skip directories on different filesystems]'
-  if [[ ${commands[$words[1]]:-$words[1]} = *xpg4* ]]; then
-    args=( -x$xdev )
-  else
-    args=( -d$xdev
-      '-L[dereference symlinks]'
-      "(-a)-o[do not add child directories' usage to parent's total]"
-    )
-  fi
-  _arguments -s "$args[@]" \
-    '(-s -o)-a[write counts for all files]' \
-    '-k[use block size of 1k]' \
-    '-r[notify about unreadable files/directories]' \
-    '(-a)-s[only display total for each argument]' \
-    '*:file:_files'
+  for pattern arg in \
+    'freebsd*' '-A[apparent size instead of usage]' \
+    '(darwin*|*bsd*|dragonfly*|solaris2.<10->)' '(-H -L -P)-H[follow symlinks on the command line]' \
+    '(darwin|*bsd|dragonfly)*' '(-H -L -P)-P[do not follow symlinks (default)]' \
+    '(darwin|dragonfly|freebsd)*' '*-I+[ignore files/directories matching specified mask]:mask' \
+    '(darwin|*bsd|dragonfly)*' '(-a -s -d)-d+[display entry for directories up to specified depth]:depth' \
+    '(darwin*|*bsd*|dragonfly*|solaris2.<10->)' '(-k -m -g -B)-h[human readable output]' \
+    'netbsd*' '-i[output inode usage instead of blocks]' \
+    '(darwin*|freebsd*|netbsd*|solaris2.<11->)' '(-h -k -g -B)-m[use block size of 1M-byte]' \
+    '(darwin|freebsd<8->.|netbsd)*' '(-h -k -m -B)-g[use block size of 1G-byte]' \
+    'freebsd*' '(-h -k -m -g)-B[block size]:block size (bytes)' \
+    '(darwin|*bsd|dragonfly)*' '-c[display grand total]' \
+    'freebsd*' '-l[count sizes many times if hard linked]' \
+    '(freebsd|netbsd)*' '-n[ignore files and directories with nodump flag set]' \
+    'solaris*' "(-a)-o[don't add child directories' usage to parent's total]" \
+    'freebsd<8->.*' '-t+[report only entries for which size exceeds threshold]:threshold' \
+    'solaris*' "-d$xdev" \
+    '(darwin|*bsd|dragonfly|solaris)*' "-x$xdev"
+  do
+    [[ $OSTYPE = $~pattern ]] && args+=( $arg )
+  done
+  _arguments -s -A "-*" $args
 fi
diff --git a/Completion/Unix/Command/_elfdump b/Completion/Unix/Command/_elfdump
new file mode 100644
index 000000000..ee92402d2
--- /dev/null
+++ b/Completion/Unix/Command/_elfdump
@@ -0,0 +1,47 @@
+#compdef elfdump
+
+local -a args
+
+_elf_file() {
+  [[ -x $REPLY || $REPLY = (core*|*.([ao]|so|elf)) ]]
+}
+
+args=(
+  '-c[dump section header information]'
+  '-d[dump .dynamic section]'
+  '-e[dump file header]'
+  '-G[dump .got (global offset table) section]'
+  '-h[dump .hash section]'
+  '-i[dump .interp (interpreter) section]'
+  '-n[dump .note sections]'
+  '(-w)-p[dump program headers]'
+  '-r[dump relocation sections]'
+  '-s[dump symbol table sections]'
+  '(-p)-w[write contents of matched sections to file]:file:_files'
+)
+
+case $OSTYPE in
+  solaris*)
+    args+=(
+      '-g[dump .group section]'
+      '-H[dump .SUNW_cap (capabilities) section]'
+      '-m[dump .SUNW_move section]'
+      '-S[dump symbol table sections sorted according to symbol sort sections]'
+      '-u[dump stack unwind/exceptions sections]'
+      '-v[dump .SUNW_version (versioning) sections]'
+      '-y[dump .SUNW_syminfo (symbol bindings) section]'
+      '-I[match sections by index]:index or range'
+      "-N[match sections by name]:section"
+      '-T[match sections by type]:type'
+      '-C[demangle C++ symbol names]'
+      '-k[calculate ELF checksum]'
+      '-l[show long section names without truncation]'
+      '-O[specify osabi to apply]:osabi'
+      '-P[use alternative section header]'
+      "*:elf file:_files -g '*(-.e:_elf_file:)'"
+    )
+  ;;
+  freebsd*) args+=( '-a[dump all information]' ) ;;
+esac
+
+_arguments -s $args
diff --git a/Completion/Unix/Command/_find b/Completion/Unix/Command/_find
index 33767c080..8f80e36cf 100644
--- a/Completion/Unix/Command/_find
+++ b/Completion/Unix/Command/_find
@@ -1,82 +1,145 @@
-#compdef find
+#compdef find gfind
 
-_arguments \
-  '(- *)-help' '(-)--help' \
-  '(- *)-version' '(-)--version' \
+local variant args
+
+_pick_variant -r variant gnu=GNU $OSTYPE -version
+
+case $variant in
+  solaris*)
+    args+=(
+      '*-'{n,}'cpio:device:_files'
+      '*-local'
+    )
+  ;|
+  solaris*|darwin*)
+    args+=( '*-xattr' )
+  ;|
+  solaris2.<10->|freebsd*|darwin*)
+    args+=( '*-acl' )
+  ;|
+  solaris2.<11->|freebsd*|dragonfly*|darwin*|openbsd*|gnu)
+    args+=(
+      '*-amin:access time (minutes)'
+      '*-cmin:inode change time (minutes)'
+      '*-mmin:modification time (minutes)'
+      '*-iname:name pattern to match (case insensitive)'
+      '*-print0'
+    )
+  ;|
+  netbsd*|freebsd*|dragonfly*|darwin*|gnu)
+    args+=( '(-H -L)-P[never follow symlinks]' )
+  ;|
+  netbsd*|freebsd*|dragonfly*|openbsd*|darwin*|gnu)
+    args+=( '-d[depth first traversal]' )
+  ;|
+  darwin*|freebsd*|gnu)
+    args+=(
+      '*-Bmin:birth time (minutes)'
+      '*-Bnewer:file to compare (birth time):_files'
+      '*-Btime:birth time (hours)'
+    )
+  ;|
+  freebsd*|dragonfly*|darwin*|openbsd*|gnu)
+    args+=(
+      '*-anewer:file to compare (access time):_files'
+      '*-cnewer:file to compare (inode change time):_files'
+      '*-mnewer:file to compare (modification time):_files'
+      '*-maxdepth:maximum search depth'
+      '*-mindepth:minimum search depth'
+      '*-path:path pattern to search:'
+    )
+  ;|
+  freebsd*|dragonfly*|darwin*|gnu)
+    args+=(
+      '*-delete'
+      '*-empty'
+      '*-execdir:program: _command_names -e:*\;::program arguments: _normal'
+      '*-gid:numeric group ID'
+      '*-uid:numeric user ID'
+      '*-noleaf'
+      '*-lname:link pattern to search'
+      '*-ilname:link pattern to search (case insensitive)'
+      '*-ipath:path pattern to search (case insensitive)'
+      '*-regex:regular expression to search'
+      '*-iregex:regular expression to search (case insensitive)'
+      '*-wholename:full path pattern to search' \
+      '*-iwholename:full path pattern to search (case insensitive)'
+      '*-ignore_readdir_race'
+      '*-noignore_readdir_race'
+      '*-okdir:program: _command_names -e:*\;::program arguments: _normal'
+      '*-samefile:file to compare inode:_files' \
+      '*-true'
+      '*-false'
+      '*-and'
+      '*-or'
+      '*-not'
+    )
+  ;|
+  freebsd*|dragonfly*|gnu) args+=( '*-quit' ) ;|
+  netbsd*|freebsd*|dragonfly*|darwin*)
+    args+=(
+      '-E[use extended regular expressions with -regex/-iregex]'
+      '-X[warn if filename contains characters special to xargs]'
+      '-f[specify file hierarchy to traverse]:path:_directories'
+      '-s[traverse directories in sorted order]'
+      "-x[don't span filesystems]"
+      '*-flags:flags:_chflags'
+    )
+  ;|
+  freebsd*|dragonfly*) args+=( '*-sparse' ) ;|
+  darwin*) args+=( '*-xattrname:name' ) ;|
+  gnu)
+    args+=(
+      '(- *)-help' '(-)--help'
+      '(- *)-version' '(-)--version'
+      '-D[print diagnostics]:debug option:(help tree search stat rates opt exec)'
+      '-O+[enable query optimisation]:level:(1 2 3)'
+      '*-daystart'
+      '-regextype:regexp syntax:(emacs posix-awk posix-basic posix-egrep posix-extended)'
+      '*-warn'
+      '*-nowarn'
+      '*-xautofs'
+      '*-used:access after inode change (days)'
+      '*-executable'
+      '*-readable'
+      '*-writable'
+      '*-xtype:file type:((b\:block\ special\ file c\:character\ special\ file d\:directory p\:named\ pipe f\:normal\ file l\:symbolic\ link s\:socket))'
+      '*-fls:output file:_files'
+      '*-fprint:output file:_files'
+      '*-fprint0:output file:_files'
+      '*-fprintf:output file:_files:output format'
+      '*-printf:output format'
+    )
+    [[ $OSTYPE = linux-gnu ]] && args+=( '*-context:SELinux context' )
+  ;;
+esac
+
+_arguments $args \
   '(-L -P)-H[only follow symlinks when resolving command-line arguments]' \
   '(-H -P)-L[follow symlinks]' \
-  '(-H -L)-P[never follow symlinks]' \
-  '-D[print diagnostics]:deb option:(help tree search stat rates opt exec)' \
-  '-O+[enable query optimisation]:level:(1 2 3)' \
-  '*-daystart' \
-  '*-d' '*-depth' \
+  '*-atime:access time (days)' \
+  '*-ctime:inode change time (days)' \
+  '*-depth' \
+  '*-exec:program: _command_names -e:*\;::program arguments: _normal' \
   '*-follow' \
-  '(-noignore_readdir_race)-ignore_readdir_race' \
-  '*-maxdepth:maximum search depth' \
-  '*-mindepth:minimum search depth' \
-  '*-mount' \
-  '(-ignore_readdir_race)-noignore_readdir_race' \
-  '*-noleaf' \
-  '-regextype:regexp syntax:(emacs posix-awk posix-basic posix-egrep posix-extended)' \
-  '*-warn' \
-  '*-nowarn' \
-  '*-xdev' \
-  '*-amin:access time (minutes):' \
-  '*-cmin:inode change time (minutes):' \
-  '*-mmin:modification time (minutes):' \
-  '*-atime:access time (days):' \
-  '*-ctime:inode change time (days):' \
-  '*-mtime:modification time (days):' \
-  '*-anewer:file to compare (access time):_files' \
-  '*-cnewer:file to compare (inode change time):_files' \
-  '*-newer:file to compare (modification time):_files' \
-  '*-used:access after inode change (days):' \
-  '*-empty' \
-  '*-executable' \
-  '*-false' \
   '*-fstype:file system type:_file_systems' \
-  '*-gid:numeric group ID:' \
   '*-group:group:_groups' \
-  '*-uid:numeric user ID:' \
-  '*-user:user:_users' \
-  '*-lname:link pattern to search:' \
-  '*-ilname:link pattern to search (case insensitive):' \
-  '*-name:name pattern to search:' \
-  '*-iname:name pattern to search (case insensitive):' \
-  '*-path:path pattern to search:' \
-  '*-ipath:path pattern to search (case insensitive):' \
-  '*-regex:regular expression to search:' \
-  '*-iregex:regular expression to search (case insensitive):' \
-  '*-wholename:full path pattern to search:' \
-  '*-iwholename:full path pattern to search (case insensitive):' \
   '*-inum:inode number:' \
   '*-links:number of links:' \
-  '*-nouser' \
+  '*-ls' \
+  '*-mount' \
+  '*-mtime:modification time (days)' \
+  '*-name:name pattern' \
+  '*-newer:file to compare (modification time):_files' \
   '*-nogroup' \
-  '*-perm:file permission bits:' \
-  '*-readable' \
-  '*-writable' \
-  '*-size:file size:' \
-  '*-samefile:same inode as:_files' \
-  '*-true' \
-  '*-type:file type:((b\:block\ special\ file c\:character\ special\ file d\:directory p\:named\ pipe f\:normal\ file l\:symbolic\ link s\:socket))' \
-  '*-xtype:file type:((b\:block\ special\ file c\:character\ special\ file d\:directory p\:named\ pipe f\:normal\ file l\:symbolic\ link s\:socket))' \
-  '*-delete' \
-  '*-exec:program: _command_names -e:*\;::program arguments: _normal' \
-  '*-execdir:program: _command_names -e:*\;::program arguments: _normal' \
+  '*-nouser' \
   '*-ok:program: _command_names -e:*\;::program arguments: _normal' \
-  '*-okdir:program: _command_names -e:*\;::program arguments: _normal' \
-  '*-fls:output file:_files' \
-  '*-fprint:output file:_files' \
-  '*-fprint0:output file:_files' \
-  '*-fprintf:output file:_files:output format:' \
+  '*-perm:file permission bits' \
   '*-print' \
-  '*-print0' \
-  '*-printf:output format:' \
   '*-prune' \
-  '*-quit' \
-  '*-ls' \
-  '*-and' '*-a' \
-  '*-or' '*-o' \
-  '*-not' \
+  '*-size:file size (blocks)' \
+  '*-type:file type:((b\:block\ special\ file c\:character\ special\ file d\:directory p\:named\ pipe f\:normal\ file l\:symbolic\ link s\:socket))' \
+  '*-user:user:_users' \
+  '*-xdev' \
+  '*-a' '*-o' \
   '*:directory:_files -/'
diff --git a/Completion/Unix/Command/_fuser b/Completion/Unix/Command/_fuser
index ba0f301ea..f497729fc 100644
--- a/Completion/Unix/Command/_fuser
+++ b/Completion/Unix/Command/_fuser
@@ -1,10 +1,18 @@
 #compdef fuser
 
-local -a args arg1
+local -a args argf variant
 typeset -A opt_args
 
-if _pick_variant -c $words[1] psmisc='(#i)psmisc' unix -V; then
+args=(
+  '-u[append the user name of the process owner to each PID]'
+  '(-f)-c[list all processes accessing files on the filesystem specified by name]'
+  '(-c)-f[list all processes accessing named files]'
+)
+argf=( '*:file:_files' )
 
+_pick_variant -r variant psmisc='(#i)psmisc' $OSTYPE -V
+case $variant in
+  psmisc)
   (( $+functions[_fuser_services] )) ||
   _fuser_services() {
     local expl suf ret=1
@@ -23,45 +31,51 @@ if _pick_variant -c $words[1] psmisc='(#i)psmisc' unix -V; then
       compset -S ',*' || suf=( -S ${${opt_args[-n]/?*/,}:-/} -r "/, \t\n\-" )
       _ports $suf && ret=0
     fi
-      
+
     return ret
   }
 
-  _arguments \
-    '(-s)-a[show all files specified on the command line]' \
-    {-c,-m}'[list all processes accessing files on the filesystem specified by name]' \
-    '-k[kill processes accessing the file]' \
-    '-i[ask for confirmation before killing]' \
-    '-l[list all known signal names]' \
-    '-n[select name space]:namespace:(file udp tcp)' \
-    '(-a)-s[silent operation]' \
-    '-signal[send alternate signal with -k]:signal:_signals' \
-    '-u[append the user name of the process owner to each PID]' \
-    '-v[verbose mode]' \
-    '-V[display version information]' \
-    '-4[search only for IPv4 sockets]' \
-    '-6[search only for IPv6 sockets]' \
-    '*:name: _alternative "files:file:_files" "services:service:_fuser_services"'
-
-else
-  case $OSTYPE in
-    solaris2.9 )
-      args=(
-	'-n[list only processes with non-blocking mandatory locks]' 
-	'-s[send alternate signal with -k]:signal:_signals' 
-      )
-    ;;
-    sysv4 )
-      (( $+words[(r)-k] )) && arg1=( ':name: _alternative signals\:signal\:_signals\ -p files:file:_files' )
-    ;;
-  esac
+    args+=(
+      '(-s)-a[show all files specified on the command line]' \
+      {-c,-m}'[list all processes accessing files on the filesystem specified by name]' \
+      '-k[kill processes accessing the file]' \
+      '-i[ask for confirmation before killing]' \
+      '(-)-l[list all known signal names]' \
+      '-n[select name space]:namespace:(file udp tcp)' \
+      '(-a -u -v)-s[silent operation]' \
+      '-v[verbose mode]' \
+      '-V[display version information]' \
+      '-4[search only for IPv4 sockets]' \
+      '-6[search only for IPv6 sockets]' \
+    )
+    argf=( '*:name: _alternative "files:file:_files" "services:service:_fuser_services"' )
+    [[ -prefix -  && -z ${${words[1,CURRENT-1]}[(r)-[A-Z][A-Z]*]} ]] &&
+        argf[1]+=' "signal:signals:_signals -P-"'
+  ;;
+  freebsd*|openbsd*|solaris2.<9->)
+    args+=(
+      '-s[send alternate signal]:signal:_signals'
+      '-k[send SIGKILL to each process]'
+    )
+  ;|
+  openbsd*|freebsd*)
+    args+=(
+      '-M[extra values from specified core file]:core file:_files'
+      '-N[extract name list from specified system]:system'
+    )
+  ;|
+  freebsd*) args+=( '-m[include mapped files]' ) ;;
+  solaris2.<9->)
+    args+=(
+      '-n[list only processes with non-blocking mandatory locks]'
+    )
+  ;;
+  solaris2.<10->)
+    args+=( '-d[report device usage for all minor nodes bound to same device]' )
+  ;;
+  sysv4 )
+    (( $+words[(r)-k] )) && argf=( ':name: _alternative signals\:signal\:_signals\ -p files:file:_files' )
+  ;;
+esac
 
-  _arguments \
-    '(-f)-c[list all processes accessing files on the filesystem specified by name]' \
-    '(-c)-f[list all processes accessing named files]' \
-    '-k[kill processes accessing the file]' \
-    '-u[append the user name of the process owner to each PID]' \
-    $args \
-    $arg1 \
-    '*:file:_files'
-fi
+_arguments -s $args $argf
diff --git a/Completion/Unix/Command/_gcore b/Completion/Unix/Command/_gcore
new file mode 100644
index 000000000..4933ffee6
--- /dev/null
+++ b/Completion/Unix/Command/_gcore
@@ -0,0 +1,50 @@
+#compdef gcore
+
+case $OSTYPE in
+  solaris*)
+    local -a content
+
+    content=(
+      'anon[anonymous private mappings]'
+      'ctf[CTF type information]'
+      'data[writable private file mappings]'
+      'dism[DISM mappings]'
+      'heap[process heap]'
+      'ism[ISM mappings]'
+      'rodata[read-only private file mappings]'
+      'shanon[anonymous shared mappings]'
+      'shfile[file-backed shared mappings]'
+      'shm[System V shared memory]'
+      'stack[process stack]'
+      'symtab[symbol table sections for loaded files]'
+      'text[readable and executable private file mappings]'
+    )
+
+    _arguments -s \
+      '(-c -g)-p[use per-process core file repository]' \
+      '(-c -p)-g[use global core file repository]' \
+      '-F[force grabbing the target process]' \
+      '(-p -g)-c[set core file content]: :_values -s + "content" $content' \
+      '-o[set core file base name]:file base name:_files' \
+      '*:pid:_pids'
+  ;;
+  netbsd*)
+    _arguments \
+      '-c+[write core file to specified file]:file:_files' \
+      '*:pid:_pids'
+    ;;
+  freebsd*)
+    _arguments -s \
+      '-c+[write core file to specified file]:file:_files' \
+      '-f[dump all available segments]' \
+      '-s[stop process while gathering image]' \
+      '::executable:' \
+      ':pid:_pids'
+  ;;
+  *)
+    # GNU GDB gcore
+    _arguments \
+      '-o[set core file base name]:file base name:_files' \
+      ':pid:_pids'
+  ;;
+esac
diff --git a/Completion/Unix/Command/_grep b/Completion/Unix/Command/_grep
index 5068f6e48..d987c2b1e 100644
--- a/Completion/Unix/Command/_grep
+++ b/Completion/Unix/Command/_grep
@@ -1,4 +1,4 @@
-#compdef grep egrep fgrep -value-,GREP_OPTIONS,-default-
+#compdef grep egrep fgrep bsdgrep zgrep, zegrep, zfgrep -value-,GREP_OPTIONS,-default-
 # Ulrik Haugen 2001
 
 local arguments matchers command
diff --git a/Completion/Unix/Command/_iconv b/Completion/Unix/Command/_iconv
index 4bf29d410..d040be756 100644
--- a/Completion/Unix/Command/_iconv
+++ b/Completion/Unix/Command/_iconv
@@ -1,8 +1,8 @@
 #compdef iconv
 
-local expl curcontext="$curcontext" state line ret=1
+local expl curcontext="$curcontext" state line variant ret=1
 
-if _pick_variant libiconv='GNU*libiconv' glibc='(GNU*libc|EGLIBC|Gentoo)' unix --version; then
+if _pick_variant -r variant libiconv='GNU*libiconv' glibc='(GNU*libc|EGLIBC|Gentoo)' unix --version; then
   local -a args
   local exargs="-l --list -? --help --usage --version -V"
 
@@ -13,22 +13,22 @@ if _pick_variant libiconv='GNU*libiconv' glibc='(GNU*libc|EGLIBC|Gentoo)' unix -
     "($exargs)-c[omit invalid characters from output]"
     "(-s --silent --verbose $exargs)"{-s,--silent}'[suppress warnings]'
     '(-)'{-\?,--help}'[display help information]'
-    '(-)--usage[display a short usage message]'
     '(-)'{-V,--version}'[print program version]'
     '1:input file:_files' 
   )
 
-  case $_cmd_variant[$service] in
+  case $variant in
     (libiconv)
       args=( ${(R)args:#(|\*)(|\(*\))-[V\?]*} )  # remove -V and -?
       args+=(
-       '--byte-subst=[format for unconvertible bytes]:format string:'
-       '--widechar-subst=[format for unconvertible wide chars]:format string:'
-       '--unicode-subst=[format for unconvertible Unicode chars]:format string:'
+        '--byte-subst=[format for unconvertible bytes]:format string'
+        '--widechar-subst=[format for unconvertible wide chars]:format string'
+        '--unicode-subst=[format for unconvertible Unicode chars]:format string'
       )
       ;;
     (glibc)
       args+=( 
+        '(-)--usage[display a short usage message]'
         "(-o --output $exargs)"{-o+,--output=}'[specify output file]:output file:_files'
         "(-s --silent $exargs)--verbose[print progress information]"
       )
@@ -44,7 +44,7 @@ if _pick_variant libiconv='GNU*libiconv' glibc='(GNU*libc|EGLIBC|Gentoo)' unix -
     else
       _wanted codesets expl 'code set' compadd "$@" \
         -M 'm:{a-zA-Z}={A-Za-z} r:|-=* r:|=*' \
-        ${$(_call_program codesets iconv --list)%//} && ret=0
+        ${$(_call_program codesets $words[1] --list)%//} && ret=0
     fi
   fi
 
@@ -55,12 +55,17 @@ else
   local -U codeset
 
   _arguments -C \
-    '-f[specify code set of input file]:code set:->codeset' \
-    '-t[specify code set for output]:code set:->codeset' \
+    '(-l)-f[specify code set of input file]:code set:->codeset' \
+    '(-l)-t[specify code set for output]:code set:->codeset' \
+    '(-l)-c[omit invalid characters from output]' \
+    '(-l)-s[suppress warnings]' \
+    '(- 1)-l[list all character code sets]' \
     '1:file:_files' && return 0
 
   if [[ $state = codeset ]]; then
-    if [[ -f /usr/lib/iconv/iconv_data ]]; then  # IRIX & Solaris
+    if [[ $OSTYPE = freebsd* ]]; then
+      codeset=( $(_call_program codesets $words[1] -l) )
+    elif [[ -f /usr/lib/iconv/iconv_data ]]; then  # IRIX & Solaris
       codeset=( ${${(f)"$(</usr/lib/iconv/iconv_data)"}%%[[:blank:]]*} )
       codeset+=( /usr/lib/iconv/*%*.so(Ne.'reply=( ${${REPLY:t}%%%*} ${${REPLY:r}#*%} )'.) )
     elif [[ -d $LOCPATH/iconv ]]; then  # OSF
@@ -70,7 +75,7 @@ else
       return 1
     fi
 
-    _wanted codesets expl 'code set' compadd "$@" -a codeset
+    _wanted codesets expl 'code set' compadd -a codeset
   fi
 
 fi
diff --git a/Completion/Unix/Command/_id b/Completion/Unix/Command/_id
index 36cdf4c19..74fe6d9e1 100644
--- a/Completion/Unix/Command/_id
+++ b/Completion/Unix/Command/_id
@@ -1,13 +1,49 @@
-#compdef id
+#compdef id gid
 
-_arguments \
-  '-a[no-op]' \
-  '(-Z --context)'{-Z,--context}'[print only context]' \
-  '(-g --group)'{-g,--group}'[print only EGID]' \
-  '(-G --groups)'{-G,--groups}'[print all GIDs]' \
-  '(-n --name)'{-n,--name}'[print name instead of number]' \
-  '(-r --real)'{-r,--real}'[print real ID instead of effective]' \
-  '(-u --user)'{-u,--user}'[print only EUID]' \
-  '--help[display help]' \
-  '--version[display version]' \
-  ':user:_users'
+local args choices
+
+if _pick_variant gnu=GNU $OSTYPE --version; then
+  choices='--help --version -Z --context -g --group -G --groups -u --user'
+  _arguments \
+    "($choices)"{-Z,--context}'[print only security context]' \
+    "($choices)"{-g,--group}'[print only EGID]' \
+    "($choices -r --real)"{-G,--groups}'[print all GIDs]' \
+    '(-n --name --help --version)'{-n,--name}'[show name instead of number]' \
+    '(-r --real -g --groups --help --version)'{-r,--real}'[show real ID instead of effective]' \
+    "($choices)"{-u,--user}'[print only EUID]' \
+    '(-z --zero --help --version)'{-z,--zero}'[delimit entries with NUL characters]' \
+    '(- :)--help[display help information]' \
+    '(- :)--version[display version]' \
+    ':user:_users'
+else
+  choices="-A -a -c -G -g -M -p -P -u"
+  args=(
+    "($choices)-g[print only EGID]"
+    "($choices -r)-G[print all GIDs]"
+    "($choices)-u[print only EUID]"
+    '(-A -c -M -P)-n[show name instead of number]'
+    '(-A -c -M -P)-r[show real ID instead of effective]'
+  )
+  case $OSTYPE in
+    solaris*)
+      args+=(
+        '(-g -G -u -n -r)-a[show user name, user ID and all the groups]'
+	'(-g -G -u -n -r)-p[show project membership]'
+      )
+    ;;
+    darwin*|dragonfly*|freebsd*)
+      args+=( '(-)-P[print id in the form of a password file entry]' )
+    ;|
+    darwin*|freebsd*)
+      args+=(
+	'(-)-A[print process audit user ID]'
+	'(-)-M[print MAC label of the current process]'
+      )
+    ;|
+    freebsd*) args+=( '(-)-c[print current login class]' ) ;|
+    darwin*|dragonfly*|freebsd*|netbsd*|openbsd*)
+      args+=( '(-)-p[human readable output]' )
+    ;;
+  esac
+  _arguments -s $args ':user:_users'
+fi
diff --git a/Completion/Unix/Command/_join b/Completion/Unix/Command/_join
index 956d9d3b8..4915a0600 100644
--- a/Completion/Unix/Command/_join
+++ b/Completion/Unix/Command/_join
@@ -1,23 +1,29 @@
-#compdef join
+#compdef join gjoin
 
-# completions for GNU join version 5.97
-
-local arguments
-
-arguments=(
-    '-a+[print unpairable lines coming from file FILENUM, where FILENUM is 1 or 2, corresponding to FILE1 or FILE2]:file number:(1 2)'
-    '-e+[replace missing input fields with EMPTY]:replacement string:'
-    '(-i --ignore-case)'{-i,--ignore-case}'[ignore differences in case when comparing fields]'
-    "-j+[equivalent to '-1 FIELD -2 FIELD']:field number:"
-    '-o+[obey FORMAT while constructing output line]:format string:'
-    '-t+[use CHAR as input and output field separator]:separator:'
-    '-v+[like -a FILENUM, but suppress joined output lines]:file number:(1 2)'
-    '-1+[join on this FIELD of file 1]:field number:'
-    '-2+[join on this FIELD of file 2]:field number:'
-    --help'[display help and exit]'
-    --version'[output version information and exit]'
-    '1:file 1:_files'
-    '2:file 2:_files'
+local args variant
+args=(
+  '*-a+[print unpairable lines from specified file]:file number:(1 2)'
+  '-e+[replace missing input fields with specified string]:replacement string'
+  "(-1 -2)-j+[join on specified field for both files]:field number"
+  '-o+[use specified output format]:format string'
+  '-t+[use specified character as field separator]:separator'
+  '*-v+[like -a, but suppress joined output lines]:file number:(1 2)'
+  '(-j -1 -j1)'{-j1,-1+}'[join on specified field of first file]:field number'
+  '(-j -2 -j2)'{-j2,-2+}'[join on specified field of second file]:field number'
+  '1:file:_files' '2:file:_files'
+)
+_pick_variant -r variant gnu=GNU $OSTYPE --version
+case $variant in
+  gnu)
+    args+=(
+      '(-i --ignore-case)'{-i,--ignore-case}'[ignore differences in case when comparing fields]'
+      '(-)--help[display help information]'
+      '(-)--version[output version information]'
+      '(--check-order --nocheck-order)'{--check-order,--nocheck-order}
+      '--header[treat first line in each file as field headers]'
+      '(-z --zero-terminated)'{-z,--zero-terminated}'[end lines with 0 byte, not newline]'
     )
+  ;;
+esac
 
-_arguments -s $arguments
+_arguments -s $args
diff --git a/Completion/Unix/Command/_last b/Completion/Unix/Command/_last
index 43a08a709..706d82f26 100644
--- a/Completion/Unix/Command/_last
+++ b/Completion/Unix/Command/_last
@@ -1,17 +1,53 @@
 #compdef last lastb
 
-_arguments -s \
-  '-a[display hostname in last column]' \
-  '-n[number]:number' \
-  '-[number]:number' \
-  '-f[filename]:filename:_files' \
-  '-R[suppress display of hostname field]' \
-  '-d[translate IP to hostname]' \
-  '-i[display IP]' \
-  '-o[read old-format wtmp]' \
-  '-x[display shutdown/runlevel entries]' \
-  '-h[hostname]:host:_hosts' \
-  '-s[report duration in seconds]' \
-  '-t[tty]:tty' \
-  '-w[widen duration field]' \
-  '*:user:_users'
+local pattern arg args ttys
+ttys=( /dev/tty*(N) /dev/pts/*(N) reboot )
+ttys=( ${ttys#/dev/} )
+
+for pattern arg in \
+  '(solaris*|linux-gnu)' '-a[display hostname in last column]' \
+  '((free|net|open)bsd*|darwin*|dragonfly*|linux-gnu)' '-h[limit sessions by hostname]:host:_hosts' \
+  '((free|open)bsd*|linux-gnu)' '-s[report duration in seconds]' \
+  '(freebsd*|openbsd*)' '-d[limit sessions to those active at snapshot time]:time ([[CC]YY][MMDD]hhmm[.SS])' \
+  '((net|free|open)bsd*|darwin*|dragonfly*)' '-t[limit sessions by tty]:tty:compadd -a ttys' \
+  'openbsd*' '-c[calculate total time]' \
+  '^darwin*' '-f[specify account file]:file:_files' \
+  '(solaris*|linux-gnu|freebsd*|openbsd*)' '-n[specify number of lines to show]:number' \
+  '((open|net)bsd*|dragonfly*)' '-T[show more detailed time information including year and seconds]' \
+  'netbsd*' '-x[assume file is in wtmpx(5) format]' \
+  'netbsd*' '-n[show IP of remote hosts]' \
+  'freebsd*' '-w[show seconds in durarion field]' \
+  'freebsd*' '-y[show year in session start time]'
+do
+  [[ $OSTYPE = $~pattern ]] && args+=( $arg )
+done
+
+case $OSTYPE in
+  netbsd*|dragonfly*)
+    args+=(
+      '-H[specify width for host field]:width'
+      '-N[specify width for login name field]:width'
+      '-L[specify width for tty field]:width'
+    )
+  ;;
+  linux-gnu)
+    args+=(
+      '-R[suppress display of hostname field]'
+      '-d[translate IP to hostname]'
+      '-F[show full login and logout times and dates]'
+      '-i[show IP of remote hosts]'
+      '-o[read old-format wtmp]'
+      '-t[limit sessions to those active at snapshot time]:time (YYYYMMDDhhmmss)'
+      '-w[show full user and domain names]'
+      '-x[display shutdown/runlevel entries]'
+    )
+  ;;
+esac
+
+if [[ $OSTYPE = (linux-gnu|solaris*) ]]; then
+  args+=( '*:arg: _alternative "users:user:_users" "ttys:tty:compadd -a ttys"' )
+else
+  args+=( '*:user:_users' )
+fi
+
+_arguments -s $args
diff --git a/Completion/Unix/Command/_ldd b/Completion/Unix/Command/_ldd
index 381d12745..19b8a9105 100644
--- a/Completion/Unix/Command/_ldd
+++ b/Completion/Unix/Command/_ldd
@@ -1,6 +1,6 @@
 #compdef ldd
 
-if _pick_variant gnu='(GNU|EGLIBC|Gentoo)' solaris --version; then
+if _pick_variant gnu='(GNU|EGLIBC|Gentoo)' unix --version; then
   args=(
     '(- *)--version[display version information]'
     '(- *)--help[display help information]'
@@ -10,20 +10,31 @@ if _pick_variant gnu='(GNU|EGLIBC|Gentoo)' solaris --version; then
     '(-u --unused)'{-u,--unused}'[display any unused objects]'
   )
 else
-  args=(
-    -s
-    '(-r)-d[check immediate references]'
-    '(-d)-r[check immediate and lazy references]'
-    '-u[display any unused objects]'
-    '-U[display any unreferenced, or unused dependencies]'
-    '-e[set specified environment variable]:environment variable:(LD_PRELOAD LD_LIBRARY_PATH LD_RUN_PATH LD_DEBUG LD_DEBUG_OUTPUT LD_NOCONFIG LD_NOAUXFLTR)'
-    '-f[check for insecure executable]'
-    '-i[display order of execution of initialization sections]'
-    '-L[enable lazy loading]'
-    '-l[force immediate processing of any filters]'
-    '-s[display search path used]'
-    '-v[displays all dependency relationships]'
-  )
+  case $OSTYPE in
+    solaris*)
+      args=(
+	-s
+	'(-r)-d[check immediate references]'
+	'(-d)-r[check immediate and lazy references]'
+	'-u[display any unused objects]'
+	'-U[display any unreferenced, or unused dependencies]'
+	'-e[set specified environment variable]:environment variable:(LD_PRELOAD LD_LIBRARY_PATH LD_RUN_PATH LD_DEBUG LD_DEBUG_OUTPUT LD_NOCONFIG LD_NOAUXFLTR)'
+	'-f[check for insecure executable]'
+	'-i[display order of execution of initialization sections]'
+	'-L[enable lazy loading]'
+	'-l[force immediate processing of any filters]'
+	'-s[display search path used]'
+	'-v[displays all dependency relationships]'
+      )
+    ;;
+    freebsd*)
+      args=(
+        '-a[show all objects that are needed by each loaded object]'
+	'-v[verbose listing of the dynamic linking headers]'
+	'-f+[specify format]:format:((%a\:program\ name %A\:environment\ name %o\:library\ name %p\:path\ to\ library %x\:load\ address))'
+      )
+    ;;
+  esac
 fi
 
 _arguments $args \
diff --git a/Completion/Unix/Command/_ls b/Completion/Unix/Command/_ls
index 7680f9273..f2e149453 100644
--- a/Completion/Unix/Command/_ls
+++ b/Completion/Unix/Command/_ls
@@ -1,11 +1,8 @@
 #compdef ls gls
-# Ulrik Haugen 2001
 
 local arguments is_gnu
 
-_pick_variant -r is_gnu gnu=gnu unix --help
-
-if [[ "$OSTYPE" = (netbsd*|freebsd*|openbsd*|darwin*) && "$is_gnu" != gnu ]]; then
+if ! _pick_variant gnu=gnu unix --help; then
   arguments=(
     '(-A)-a[list entries starting with .]'
     '(-a)-A[list all except . and ..]'
@@ -14,10 +11,8 @@ if [[ "$OSTYPE" = (netbsd*|freebsd*|openbsd*|darwin*) && "$is_gnu" != gnu ]]; th
     '-R[list subdirectories recursively]'
 
     '(-k)-h[print sizes in human readable form]'
-    '(-h)-k[print sizes of 1k]'
 
     '-i[print file inode numbers]'
-
     '(-l -g -1 -C -m -x)-l[long listing]'
     '(-l -1 -C -m -x)-g[long listing but without owner information]'
     '(-l -g -C -m -x)-1[single column output]'
@@ -25,35 +20,36 @@ if [[ "$OSTYPE" = (netbsd*|freebsd*|openbsd*|darwin*) && "$is_gnu" != gnu ]]; th
     '(-l -g -1 -C -x)-m[comma separated]'
     '(-l -g -1 -C -m)-x[sort horizontally]'
 
-    '-o[display file flags]'
-
     '-s[display size of each file in blocks]'
 
     '(-u)-c[status change time]'
     '(-c)-u[access time]'
 
-    '-f[unsorted, all, short list]'
     '-r[reverse sort order]'
 
-    '(-t)-S[sort by size]'
     '(-S)-t[sort by modification time]'
 
     '(-p)-F[append file type indicators]'
     '(-F)-p[append file type indicators for directory]'
 
-    '-f[output is not sorted]'
-
     '-n[numeric uid, gid]'
 
-    '-T[show complete time information]'
-
-    '(-B -b -w -q)-B[print octal escapes for control characters]'
     '(-B -b -w -q)-b[as -B, but use C escape codes whenever possible]'
     '(-B -b -w -q)-q[hide control chars]'
-    '(-B -b -w -q)-w[print raw characters]'
 
     '*:files:_files'
   )
+  if [[ "$OSTYPE" = (netbsd*|dragonfly*|freebsd*|openbsd*|darwin*) ]]; then
+    arguments+=(
+      '(-h)-k[print sizes of 1k]'
+      '(-t)-S[sort by size]'
+      '-T[show complete time information]'
+      '-o[display file flags]'
+      '-f[output is not sorted]'
+      '(-B -b -w -q)-w[print raw characters]'
+      '(-B -b -w -q)-B[print octal escapes for control characters]'
+    )
+  fi
   if [[ "$OSTYPE" = (freebsd*|darwin*) ]]; then
     arguments+=(
       '-G[enable colorized output]'
@@ -61,6 +57,18 @@ if [[ "$OSTYPE" = (netbsd*|freebsd*|openbsd*|darwin*) && "$is_gnu" != gnu ]]; th
       '-P[do not follow symlinks]'
     )
   fi
+  if [[ $OSTYPE = solaris* ]]; then
+    arguments+=(
+      '(-l -1 -C -m -x)-o[long listing but without group information]'
+      '(-l -t -s -r -a)-f[interpret each argument as a directory]'
+      '(-E -l)-e[long listing with full and consistent date/time]'
+      '(-e -l)-E[long listing with ISO format date/time]'
+      '-H[follow symlinks on the command line]'
+      '-v[long listing with verbose ACL information]'
+      '-V[long listing with compact ACL information]'
+      '-@[long listing with marker for extended attribute information]'
+    )
+  fi
 else
   arguments=(
     '(--all -a -A --almost-all)'{--all,-a}'[list entries starting with .]'
@@ -131,10 +139,6 @@ else
     '(- :)--version[display version information]'
     '*:files:_files'
   )
-  # remove long options?
-  if [[ $is_gnu != gnu ]]; then
-    arguments=( ${${${arguments:#(|*\))--*}//--[^ )]#/}/\( #\)/} )
-  fi
 fi
 
 _arguments -s $arguments
diff --git a/Completion/Unix/Command/_md5sum b/Completion/Unix/Command/_md5sum
index 2351d1abd..c881a4e6d 100644
--- a/Completion/Unix/Command/_md5sum
+++ b/Completion/Unix/Command/_md5sum
@@ -1,10 +1,13 @@
-#compdef md5sum
+#compdef md5sum gmd5sum
 
 _arguments -S \
   '(-b --binary)'{-b,--binary}'[read in binary mode]' \
   '(-c --check)'{-c,--check}'[read MD5 sums from the FILEs and check them]' \
+  '--tag[create a BSD-style checksum]' \
   '(-t --text)'{-t,--text}'[read in text mode]' \
+  '(-q --quiet)'{-q,--quiet}"[don't print OK for each successfully verified file]" \
   '--status[no output, status code shows success]' \
+  '--strict[exit non-zero for improperly formatted checksum lines]' \
   '(-w --warn)'{-w,--warn}'[warn about improperly formatted checksum lines]' \
   '--help[display help and exit]' \
   '--version[output version information and exit]' \
diff --git a/Completion/Unix/Command/_mkdir b/Completion/Unix/Command/_mkdir
index 58d6c743b..f2299f7c7 100644
--- a/Completion/Unix/Command/_mkdir
+++ b/Completion/Unix/Command/_mkdir
@@ -1,33 +1,23 @@
-#compdef mkdir
+#compdef mkdir gmkdir zf_mkdir
 
-local curcontext="$curcontext" line state \
-  args args_zsh args_cmd variant expl ret=1
-typeset -a opt_args
+local curcontext="$curcontext" state line expl args variant ret=1
+typeset -A opt_args
 
 args=(
   '(-m --mode)'{-m,--mode=}'[set permission mode]:numeric mode'
   '(-p --parents)'{-p,--parents}'[make parent directories as needed]'
-  )
-
-args_zsh=('(-)*: :->directories')
-
-args_cmd=(
-  '(-v --verbose)'{-v,--verbose}'[print message for each created directory]'
-  '(- :)--help[display help information]'
-  '(- :)--version[display version information]'
-  '*: :->directories'
-  )
+  '(-)*: :->directories'
+)
 
 case "$OSTYPE" in
   linux*)
-    args_cmd=(
+    args+=(
       '(-Z --context)'{-Z,--context=}'[set SELinux context]:SELinux context'
-      $args_cmd)
-    ;;
+    )
+  ;;
 esac
 
-_pick_variant -r variant gnu=gnu zsh='\(eval\)' unix --help
-
+_pick_variant -r variant gnu=gnu zsh='\(eval\)' $OSTYPE --help
 # It can still happen that there is a precommand command or builtin in the line.
 # In such cases, the variant has to be modified suitably, after further checking
 # the variant of the _command_ mkdir.
@@ -44,26 +34,34 @@ _pick_variant -r variant gnu=gnu zsh='\(eval\)' unix --help
 #   variant=zsh
 # fi
 
-if [[ $variant == zsh ]]; then
-  args+=($args_zsh)
-else
-  args+=($args_cmd)
-fi
-
-# remove long options?
-[[ $variant != gnu ]] && args=( ${${${args:#(|*\))--*}//--[^ )]#/}/\( #\)/} )
+case $variant in
+  gnu|freebsd*|dragonfly*)
+    args+=(
+      '(-v --verbose)'{-v,--verbose}'[print message for each created directory]'
+    )
+  ;|
+  gnu)
+    args+=(
+      '(- :)--help[display help information]'
+      '(- :)--version[display version information]'
+    )
+  ;;
+  zsh) # remove all options
+    args=( '*: :->directories' )
+  ;;
+  *) # non-GNU: remove long options
+    args=( ${${${args:#(|*\))--*}//--[^ )]#/}/\( #\)/} )
+  ;;
+esac
 
 _arguments -C -s $args && ret=0
 
 case "$state" in
   directories)
-    if (( $ret )) && [[ ! -prefix - ]] || \
-      [[ $variant == zsh && ${#${${words[2,-1]}:#-*}} -gt 0 ]]; then
-      _wanted directories expl \
-        'parent directory (alternatively specify name of directory)' \
-        _path_files -/ && ret=0
-    fi
-    ;;
+    _wanted directories expl \
+      'parent directory (alternatively specify name of directory)' \
+      _path_files -/ && ret=0
+  ;;
 esac
 
 return ret
diff --git a/Completion/Unix/Command/_nl b/Completion/Unix/Command/_nl
new file mode 100644
index 000000000..b3876dc65
--- /dev/null
+++ b/Completion/Unix/Command/_nl
@@ -0,0 +1,40 @@
+#compdef nl gnl
+
+local curcontext="$curcontext" state line args ret=1
+
+args=(
+  '(-b --body-numbering)'{-b+,--body-numbering=}'[specify style for body lines]:style:->styles'
+  '(-d --section-delimiter)'{-d+,--section-delimiter=}'[separate logical pages with specified delimiter]:delimiter'
+  '(-f --footer-numbering)'{-f+,--footer-numbering=}'[specify style for footer lines]:style:->styles'
+  '(-h --header-numbering)'{-h+,--header-numbering=}'[specify style for header lines]:style:->styles'
+  '(-i --line-increment)'{-i+,--line-increment=}'[line number increment at each line]:increment'
+  '(-l --join-blank-lines)'{-l+,--join-blank-lines=}'[count consecutive empty lines as one]:number'
+  '(-n --number-format)'{-n+,--number-format=}'[specify format for line numbers]:format:((ln\:left\ justified rn\:right\ justified rz\:right\ justified\ with\ leading\ zeroes))'
+  '(-p --no-renumber)'{-p,--no-renumber}"[don't reset line numbers at logical pages]"
+  '(-s --number-separator)'{-s+,--number-separator=}'[add specified string after line numbers]:string'
+  '(-v --starting-line-number)'{-v+,--starting-line-number=}'[specify first line number on each logical page]:initial number'
+  '(-w --number-width)'{-w+,--number-width=}'[specify number of columns for line numbers]:columns'
+)
+
+if _pick_variant gnu=GNU unix --version; then
+  args+=(
+    '(- *)--help[display help information]'
+    '(- *)--version[display version information]'
+  )
+else
+  args=( ${(R)args:#(|\*)(|\(*\))--*} )    # remove long options
+fi
+
+_arguments -C -s $args '*:file:_files' && ret=0
+
+if [[ -n $state ]]; then
+  if compset -P p; then
+    _message -e regex 'regular expression'
+  else
+    _describe -t styles style '( p:number\ only\ lines\ matching\ regex )' -S '' -- '(
+      a:number\ all\ lines
+      t:number\ only\ non-empty\ lines
+      n:no\ line\ numbering
+    )'
+  fi
+fi || return ret
diff --git a/Completion/Unix/Command/_nm b/Completion/Unix/Command/_nm
index 7f395d614..80136329d 100644
--- a/Completion/Unix/Command/_nm
+++ b/Completion/Unix/Command/_nm
@@ -1,6 +1,6 @@
-#compdef nm
+#compdef nm eu-nm
 
-local args files
+local args files variant
 
 _nm_object_file() {
   [[ -x $REPLY || $REPLY = *.([ao]|so|elf) ]]
@@ -15,7 +15,7 @@ args=(
   '(-t --radix -o -x)'{-t,--radix}'[specify radix for numeric values]:radix:((d\:decimal o\:octal x\:hexadecimal))'
 )
 
-if _pick_variant gnu=GNU unix -V; then
+if _pick_variant -r variant binutils=GNU elftoolchain=elftoolchain elfutils=elfutils unix -V; then
   compset -P '@' && files='*:options file:_files'
   args+=(
     '(- *)--help[display help information]'
@@ -24,22 +24,47 @@ if _pick_variant gnu=GNU unix -V; then
     '(-C --no-demangle)--demangle=-[decode symbol names]::style:(auto gnu lucid arm hp edg gnu-v3 java gnat)'
     "(-C --demangle)--no-demangle[don't decode symbol names]"
     '(-u --undefined-only)--defined-only[display only defined symbols]'
-    '(-f --format -P)'{-f+,--format=}'[specify output format]:format:(bsd sysv posix)'
-    '(-l --line-numbers)'{-l,--line-numbers}'[display source file and line numbers from debug information]'
-    '(-n --numeric-sort -p --no-sort --size-sort)'{-n,--numeric-sort}'[sort symbols numerically by address]'
+    '(-f --format -P)--format=[specify output format]:format:(bsd sysv posix)'
+    '(-n --numeric-sort -p --no-sort --size-sort -v)'{-n,--numeric-sort}'[sort symbols numerically by address]'
     '(-p --no-sort -n --numeric-sort -r -P --reverse-sort --size-sort)'{-p,--no-sort}'[do not sort symbols]'
     '(-P --portability -B -f --format)'{-P,--portability}'[same as --format=posix]'
-    '(-r --reverse-sort -p --no-sort --size-sort)'{-r,--reverse-sort}'[reverse sort order]'
-    '--plugin[load specified plugin]:plugin'
+    '(-r --reverse-sort -p --no-sort --size-sort -v)'{-r,--reverse-sort}'[reverse sort order]'
     '(-u --undefined-only --defined-only)'{-u,--undefined-only}'[display only undefined symbols]'
-    "--target=[target object format]:targets:(${${(@M)${(f)$(_call_program targets nm --help)}:#*supported targets:*}##*: })"
     '(-a --debug-syms)'{-a,--debug-syms}'[display debugger-only symbols]'
     '(-S --print-size)'{-S,--print-size}'[print size of defined symbols]'
     '(-s --print-armap)'{-s,--print-armap}'[include index for symbols from archive members]'
-    '(-p --no-sort -n --numeric-sort -r)--size-sort[sort symbols by size]'
-    '--special-syms[include special symbols in the output]'
-    '--synthetic[display synthetic symbols as well]'
+    '(-p --no-sort -n --numeric-sort -r -v)--size-sort[sort symbols by size]'
   )
+  case $variant in
+    elftoolchain|binutils)
+      args+=(
+	'(-l --line-numbers)'{-l,--line-numbers}'[display source file and line numbers from debug information]'
+      )
+    ;|
+    elftoolchain)
+      args=( ${args:#*--(portability|extern-only)\[*}
+        '(- *)-h[display help information]'
+	'(-t -x)-o[print values in octal]'
+	'(-t -o)-x[print values in hexadecimal]'
+	'(--size-sort)-v[sort output by value]'
+      )
+    ;;
+    elfutils)
+      args+=(
+        '--mark-special[mark special symbols]'
+	'--color=[use color in output]:color:(always auto never)'
+      )
+    ;;
+    binutils)
+      args+=(
+	'(-f --format -P)-f+[specify output format]:format:(bsd sysv posix)'
+	'--plugin[load specified plugin]:plugin'
+	'--special-syms[include special symbols in the output]'
+	'--synthetic[display synthetic symbols as well]'
+	"--target=[target object format]:targets:(${${(@M)${(f)$(_call_program targets nm --help)}:#*supported targets:*}##*: })"
+      )
+    ;;
+  esac
 else
   # following flags are accurate for Solaris
   args=( ${args:#(|*\)(\*|))-[o-]*}
diff --git a/Completion/Unix/Command/_od b/Completion/Unix/Command/_od
index 59775abf6..db75b3f96 100644
--- a/Completion/Unix/Command/_od
+++ b/Completion/Unix/Command/_od
@@ -1,4 +1,4 @@
-#compdef od
+#compdef od god
 
 local curcontext="$curcontext" state state_descr line args ret=1
 local -A opt_args
@@ -25,6 +25,8 @@ if _pick_variant gnu=GNU unix --version; then
   # -h -B -I and -L are obsolescent and undocumented
   args=( ${(R)args:#(|\*)(|\(*\))-[hBIL]*} )
   args+=(
+    '--traditional'
+    '--endian=[swap input bytes]:endianess:(big little)'
     {-S+,--strings=-}'[output strings of at least specfied bytes long]:length'
     {-w-,--width=-}'[output specified bytes per line]:bytes'
     '(- : *)--help[display help and exit]'
@@ -33,18 +35,29 @@ if _pick_variant gnu=GNU unix --version; then
 else
   args=( ${(R)args:#(|\*)(|\(*\))--*} )    # remove long options
   case "$OSTYPE" in
-    (darwin*|freebsd*|dragonfly*|openbsd*)
+    darwin*|freebsd*|dragonfly*|openbsd*)
       args+=(
-        '-D[output unsigned decimal ints (-t u4)]'
+        '-D[output unsigned decimal integers (-t u4)]'
         {-e,-F}'[output double-precision floats (-t fD)]'
         {-H,-X}'[output hexadecimal ints (-t x4)]'
         '-O[output octal ints (-t o4)]'
       )
-      ;;
+    ;;
+    solaris*)
+      args=(
+        ${(M)args:#(|\*)(|\(*\))-[AjNtvbcdfosx]*}
+	'-C[output all printable characters and use C-style escapes]'
+	'-D[output unsigned decimal long words (-t u4)]'
+	'-F[output double-precision floats (-t f8)]'
+	'-O[output octal ints (-t o4)]'
+	'-S[output decimal ints (-t d4)]'
+	'-X[output hexadecimal ints (-t x4)]'
+      )
+    ;;
     (*)
       # POSIX options only
       args=( ${(M)args:#(|\*)(|\(*\))-[AjNtvbcdosx]*} )
-      ;;
+    ;;
   esac
 fi
 
diff --git a/Completion/Unix/Command/_patch b/Completion/Unix/Command/_patch
index add436702..c0df00c00 100644
--- a/Completion/Unix/Command/_patch
+++ b/Completion/Unix/Command/_patch
@@ -1,7 +1,7 @@
-#compdef patch
+#compdef patch gpatch
 
 if (( ! $+_patch_args )); then
-  local help="$(LC_ALL=C patch --help 2>&1)"
+  local help="$(LC_ALL=C $words[1] --help 2>&1)"
   local -A optionmap
   local arg
   local comp_p='compadd "$expl[@]" -S0 -r "1-9" - ""'
diff --git a/Completion/Unix/Command/_ping b/Completion/Unix/Command/_ping
index e59f6fa9f..a1a50e11f 100644
--- a/Completion/Unix/Command/_ping
+++ b/Completion/Unix/Command/_ping
@@ -33,31 +33,37 @@ if _pick_variant iputils=iputils unix -V; then
 
 else
 
-# FreeBSD 4.11
-
   _arguments \
     '-A[audible for no packet]' \
-    '-Q[somewhat quiet]' \
-    '-R[record route]' \
     '-a[audible for each packet]' \
+    '-c:count' \
+    "-D[set the don't fragment bit]" \
     '-d[set SO_DEBUG on the socket]' \
     '-f[flood ping]' \
-    '-n[numeric output only]' \
-    '-q[quiet]' \
-    '-r[bypass normal routing tables]' \
-    '-v[verbose]' \
-    '-c:count' \
+    '-G[specify maximum size for ICMP payload for sweeping pings]:size' \
+    '-g[specify minimum size for ICMP payload for sweeping pings]:size [0]' \
+    '-h[specify size increment for ICMP payload for sweeping pings]:size [1]' \
     '-i:wait seconds' \
+    '-I[source interface for multicast packets]:iface:_net_interfaces' \
+    '-L[suppress loopback of multicast packets]' \
     '-l:preload number' \
+    '-M:icmp:(mask time)' \
     '-m:ttl' \
-    '-p:padding pattern' \
+    '-n[numeric output only]' \
+    '-o[exit after receiving one packet]' \
     '-P:IPsec policy' \
+    '-p:padding pattern' \
+    '-Q[somewhat quiet]' \
+    '-q[quiet]' \
+    '-R[record route]' \
+    '-r[bypass normal routing tables]' \
+    '-S:source address' \
     '-s:packet size in bytes' \
-    '-S:src addr' \
-    '-t:timeout in seconds' \
-    '-L[suppress loopback of multicast packets]' \
-    '-I:iface:_net_interfaces' \
     '-T:ttl for multicasted packets' \
+    '-t:timeout in seconds' \
+    '-v[verbose]' \
+    '-W:wait time (ms)' \
+    '-z:type of service' \
     ':host:_hosts'
 
 fi
diff --git a/Completion/Unix/Command/_ps b/Completion/Unix/Command/_ps
new file mode 100644
index 000000000..925f48390
--- /dev/null
+++ b/Completion/Unix/Command/_ps
@@ -0,0 +1,188 @@
+#compdef ps
+
+_ps_props() {
+  local opts
+
+  if [[ $1 = -s ]]; then
+    shift
+    compset -P '[+-]' || _describe -t modifiers modifier \
+	'( +:ascending\ order -:descending\ order )' -S ''
+  fi
+
+  case $OSTYPE in
+    linux-gnu) opts=( ${${(f)"$(_call_program properties $words[1] L)"}%% *} ) ;;
+    freebsd*) opts=( $(_call_program properties $words[1] L) ) ;;
+    solaris*) opts=( ${=${(f)"$(_call_program properties $words[1] - 2>&1)"}[-3,-1]} ) ;;
+  esac
+
+  compadd "$@" -a opts
+}
+
+local curcontext="$curcontext" state line expl ret=1
+local short long
+local -a args bsd bsdarg pids
+local -A equivs
+
+args=(
+  '-a[select processes with tty except session leaders]'
+  {-A,-e}'[select every process]'
+  '-d[select all processes except session leaders]'
+  '*-p+[select processes by ID]:process ID:_sequence -s , _pids'
+  '*-G+[select processes by real group]:group:_sequence -s , _groups'
+  '*-g+[select processes by effective group or session]:group:_sequence -s , _groups'
+  '*-s+[select processes by session leaders]:session leader:_sequence -s , _pids'
+  '*-t+[select processes by attached terminal]:tty:_sequence -s , compadd - /dev/pts/<->(N\:s/\\/dev\\//) /dev/tty*(N\:t)'
+  '*-u+[select processes by effective user]:user:_sequence -s , _users'
+  '*-U+[select processes by real user]:user:_sequence -s , _users'
+  '-o+[specify output format]:property:_sequence -s , _ps_props -'
+
+  '-c[show scheduler properties]'
+  '-f[full listing]'
+  '-j[show session ID and process group ID]'
+  '-l[long listing]'
+  '-L[show information about each light weight process]'
+  '-y[show RSS in place of ADDR (used with -l)]'
+)
+
+bsd=(
+  'a[include processes belonging to other users]'
+  'e[show environment after command]'
+  '(j s u v X)l[output in long format]'
+  '(l s u v X)j[output in job control format]'
+  'x[include processes with no controlling terminal]'
+  '(j l s v X)u[output in resource usage format]'
+  '(j l s u X)v[output in virtual memory format]'
+  '*w[wide output]'
+  'H[show threads as if they were processes]'
+  'L[display all format specifiers]'
+  'S[include child process data with the parent]'
+  'T[select processes attached to current terminal]'
+  'Z[show security data]'
+)
+bsdarg=(
+  '*p[select processes by ID]'
+  '*t[select processes by attached terminal]'
+  '*U[select processes by effective user]'
+  'O[specify additional output fields]'
+  'o[specify output format]'
+  'N[set namelist file for WCHAN display]'
+)
+
+case $OSTYPE in
+  solaris2.<11->)
+    args+=(
+      '-h[select processes homed to the specified lgrp]:lgrp list'
+      '-H[show home lgroup of the process]'
+    )
+  ;|
+  solaris*)
+    args+=(
+      '-P[show processor to which the process or lwp is bound]'
+      '*-z[select processes by zone]:zone list:_sequence _zones'
+      '-Z[show zone with which process is associated]'
+    )
+  ;;
+  darwin*|dragonfly*|freebsd*|netbsd*|openbsd*)
+    bsd+=(
+      'A[select every process]'
+      'C[ignore resident time for CPU percentage]'
+      'c[show just executable name for command]'
+      'h[repeat header lines, one per page of output]'
+      '(r)m[sort by memory usage]'
+      '(m)r[sort by CPU usage]'
+    )
+    bsdarg+=(
+      'M[extract values from specified core]'
+    )
+  ;|
+  linux-gnu|netbsd*) bsdarg+=( 'k[specify sort order]' ) ;|
+  darwin*|freebsd*) bsdarg+=( 'G[select processes by real group]' ) ;|
+  freebsd*)
+    bsd+=(
+      'd[show process hierarchy]'
+      'f[show command and environment for swapped out processes]'
+      '*J[select processes by jail ID]'
+    )
+  ;;
+  netbsd*) bsd+=( '(j l u v)s[output in thread format]' ) ;;
+  openbsd*)
+    bsd+=(
+      'k[display information about kernel threads]'
+    )
+    bsdarg+=( 'W[extract swap information from the specified file]' )
+  ;;
+  linux-gnu)
+    args+=(
+      '-O+[specify additional output fields]:property:_sequence -s , _ps_props -'
+      '(-N --deselect)'{-N,--deselect}'[negate selection: all processes except those selected]'
+      '*-C[select processes by command name]:command:_sequence -s , _command_names -e'
+      '*--ppid[select processes by parent process ID]:parent process:_sequence -S , _pids'
+      '(-f)-F[extra full format listing]'
+      '--context[show SELinux security context format]'
+      '-M[show security data]'
+      '(--forest -H)'{--forest,-H}'[show process hierarchy]'
+      '--headers[repeat header lines, one per page of output]'
+      '(--cols --columns --width)'{--cols,--columns,--width}'[set screen width]:width'
+      '(--lines --rows)'{--lines,--rows}'[set screen height]'
+      '--cumulative[include child process data with the parent]'
+      '-n[set namelist file for WCHAN display]:file:_files'
+      '(--no-headers --no-heading)'{--no-headers,--no-heading}'[suppress headers]'
+      '--sort=[specify sort order]:order:_ps_props -s'
+      '-w[wide output]'
+      '-m[show threads after processes]'
+      '-T[show threads, with SPID column]'
+      '-Z[show security context format (SELinux)]'
+      '(- *)--help[display help information]::subject:(simple list output threads misc all)'
+      '(- *)--info[display debugging information]'
+      '(- *)'{-V,--version}'[display version information]'
+    )
+    equivs=( G Group g group p pid s sid t tty U User u user o format )
+    for short long in ${(kv)equivs}; do
+      args+=( ${${(M)args:#(\*|)-$short*}/$short+/-$long=} )
+    done
+    bsd+=(
+      'c[show true command name]'
+      'f[show process hierarchy]'
+      'h[suppress header]'
+      'm[show threads after processes]'
+      'n[numeric output for WCHAN and USER]'
+      'r[select running processes]'
+      '(j l u v X)s[output in signal format]'
+      'V[display version information]'
+      '(j l s u v)X[output in register format]'
+    )
+  ;;
+esac
+
+if (( CURRENT > 1 )) && [[ $OSTYPE != solaris* || ( $OSTYPE = linux-gnu && $words[CURRENT-1] != -* ) ]]; then
+  case $words[CURRENT-1] in
+    *k)
+      _wanted -C option-k-1 properties expl 'property' _sequence -s , _ps_props -s - && return
+    ;;
+    *G) _sequence -s , _groups && return ;;
+    *J) _sequence -s , _jails && return ;;
+    *[MNW]) _files && return ;;
+    *t)
+      _wanted -C option-t-1 ttys expl tty _sequence -s , \
+	  compadd - /dev/pts/<->(N\:s/\\/dev\\//) /dev/tty*(N\:t) && return
+    ;;
+    *p) _wanted -C option-p-1 processes expl 'process ID' _sequence -s , _pids && return;;
+    *U) _wanted -C option-U-1 users expl user _sequence -s , _users && return ;;
+    *[oO]) _wanted -C "option-${words[CURRENT-1][-1]}-1" properties \
+        expl 'property' _sequence -s , _ps_props - && return ;;
+  esac
+fi
+
+if [[ $OSTYPE = (*bsd*|darwin*|dragonfly*) ]]; then
+  compset -P - && pids=1
+else
+  _arguments -C -s $args '*:: :->rest' && ret=0
+  [[ -z "$state" || $OSTYPE = solaris* ]] && return ret
+fi
+
+_values -s '' -S ' ' 'options' $bsd && ret=0
+_values -S ' ' 'options' $bsdarg && ret=0
+if [[ -z $pids ]]; then
+  _pids && compstate[insert]=
+fi
+return ret
diff --git a/Completion/Unix/Command/_readelf b/Completion/Unix/Command/_readelf
new file mode 100644
index 000000000..9312ea864
--- /dev/null
+++ b/Completion/Unix/Command/_readelf
@@ -0,0 +1,62 @@
+#compdef readelf eu-readelf
+
+local variant args sections
+
+_elf_file() {
+  [[ -x $REPLY || $REPLY = (core*|*.([ao]|so|elf)) ]]
+}
+
+sections=( .bss .data .dynamic .dynsym .got .interp .shstrtab .symtab .text )
+_pick_variant -r variant elftoolchain=elftoolchain elfutils=elfutils binutils --version
+
+args=(
+  '(-a --all)'{-a,--all}'[show all tables]'
+  '(-h --file-header)'{-h,--file-header}'[show file header]'
+  '(-l --program-headers --segments)'{-l,--program-headers,--segments}'[show program headers]'
+  '(-S --section-headers --sections)'{-S,--section-headers,--sections}'[show sections header]'
+  '(-s --syms --symbols)'{-s,--syms,--symbols}'[show symbol table]'
+  '(-n --notes)'{-n,--notes}'[show core notes (if present)]'
+  '(-r --relocs)'{-r,--relocs}'[show relocations (if present)]'
+  '(-d --dynamic)'{-d,--dynamic}'[show dynamic section (if present)]'
+  '(-V --version-info)'{-V,--version-info}'[show version sections (if present)]'
+  '(-A --arch-specific)'{-A,--arch-specific}'[show architecture specific information (if any)]'
+  '(-c --archive-index)'{-c,--archive-index}'[show symbol/file index in an archive]'
+  \*{-x,--hex-dump=}"[dump contents of specified section as bytes]:section:($sections)"
+  \*{-p,--string-dump=}"[dump contents of specified section as strings]:section:($sections)"
+  '-w+[show the contents of DWARF2 debug sections]::debug section:(l L i a p r m f F s o R t)'
+  '--debug-dump=[show the contents of DWARF2 debug sections]::section:(rawline decodedline info abbrev pubnames aranges macro frames frames-interp str loc Ranges pubtypes gdb_index trace_info trace_abbrev trace_aranges)'
+  '(-I --histogram)'{-I,--histogram}'[show histogram of bucket list lengths]'
+  '(-W --wide)'{-W,--wide}'[allow output width to exceed 80 characters]'
+  '(- *)'{-H,--help}'[display help information]'
+  '(- *)'{-v,--version}'[display version information]'
+  "*:elf file:_files -g '*(-.e:_elf_file:)'"
+)
+
+case $variant in
+  elftoolchain|binutils)
+    args+=(
+      '(-g --section-groups)'{-g,--section-groups}'[show section groups]'
+      '(-t --section-details)'{-t,--section-details}'[show section details]'
+      '(-e --headers)'{-e,--headers}'[show file, program and sections headers]'
+      '(-u --unwind)'{-u,--unwind}'[show unwind info (if present)]'
+      '(-D --use-dynamic)'{-D,--use-dynamic}'[use dynamic section info when showing symbols]'
+    )
+  ;|
+  binutils)
+    args+=(
+      '--dyn-syms[show dynamic symbol table]'
+      \*{-R,--relocated-dump=}"[dump contents of specified section as relocated bytes]:section:($sections)"
+      "--dwarf-depth=[don't show DIEs at greater than specified depth]:depth"
+      '--dwarf-start=[show DIEs starting at specified depth or deeper]:depth'
+    )
+  ;;
+  elfutils)
+    args+=(
+      '--elf-section[used specified section as ELF input data]::section'
+      '(-e --exception)'{-e,--exception}'[show sections for exception handling]'
+      '(-N --numeric-addresses)'{-N,--numeric-addresses}"[don't find symbol names for addresses in DWARF data]"
+    )
+  ;;
+esac
+
+_arguments -s "$args[@]"
diff --git a/Completion/Unix/Command/_rm b/Completion/Unix/Command/_rm
index 1f156c481..4728ad464 100644
--- a/Completion/Unix/Command/_rm
+++ b/Completion/Unix/Command/_rm
@@ -1,4 +1,4 @@
-#compdef rm
+#compdef rm grm zf_rm
 
 declare -a opts args
 args=(
@@ -16,12 +16,25 @@ if _pick_variant gnu=gnu unix --help; then
     '--one-file-system[stay within filesystems of files given as arguments]'
     '(                   --preserve-root)--no-preserve-root[do not treat / specially]'
     '(--no-preserve-root                )--preserve-root[do not remove / (default)]'
+    '(-d --dir)'{-d,--dir}'[remove directories as well]'
     '(-v --verbose)'{-v,--verbose}'[explain what is being done]'
     '(- *)--help[display help message and exit]'
     '(- *)--version[output version information and exit]'
   )
 else
   args=(${args:#*--(force|recursive)\[*})
+  case $OSTYPE in
+    freebsd*)
+      args+=(
+        '-d[remove directories as well]'
+	'(-i)-I[prompt when removing many files]'
+	'-P[overwrite files before deleting them]'
+	'-v[explain what is being done]'
+	'-W[attempt to undelete named files]'
+	"-x[don't cross file systems when removing a hierarchy]"
+      )
+    ;;
+  esac
 fi
 
 local curcontext=$curcontext state line ret=1
diff --git a/Completion/Unix/Command/_sed b/Completion/Unix/Command/_sed
index 476575205..8e2385cc8 100644
--- a/Completion/Unix/Command/_sed
+++ b/Completion/Unix/Command/_sed
@@ -1,22 +1,29 @@
-#compdef sed
+#compdef sed gsed psed s2p
 
-local args
+local args inplace extended
 
 args=(
   '(-n --quiet --silent)'{-n,--quiet,--silent}'[suppress automatic printing of pattern space]'
-  '(1)*'{-e,--expression=-}'[add sed commands to run]:sed script'
+  '(1)*'{-e,--expression=-}'[specify sed commands to run]:sed script'
   '(1)*'{-f,--file=-}'[add contents of file to commands to run]:file:_files'
   '(-e)1: :_guard "^-*" sed script'
   '*:input file:_files'
 )
+inplace='[edit files in-place, running scripts separately for each file]::suffix for backup'
+extended='[use extended regular expressions]'
 
-if _pick_variant gnu=GNU unix --version; then
+if [[ $service = (psed|s2p) ]]; then
+  args=(
+    "${(@)args:#(|\(*\))(|\*)--*}"
+    '-a[delay opening files listed with w function]'
+  )
+elif _pick_variant gnu=GNU unix --version; then
   args+=(
     '--follow-symlinks[follow symlinks when processing in place]'
-    '(-i --in-place)'{-i-,--in-place=-}'[edit files in place]::suffix for backup'
+    '(-i --in-place)'{-i-,--in-place=-}$inplace
     '(-l --line-length)'{-l,--line-length=-}'[specify line-wrap length for the l command]'
     '(-r)--posix[disable GNU extensions]'
-    '(-r --regexp-extended)'{-r,--regexp-extended}'[use extended regular expressions]'
+    '(-r --regexp-extended)'{-r,--regexp-extended}$extended
     '(-s --separate)'{-s,--separate}'[consider files separately instead of as a combined stream]'
     '(-u --unbuffered)'{-u,--unbuffered}'[disable data buffering]'
     '(- 1 :)--help[print program usage]'
@@ -24,6 +31,27 @@ if _pick_variant gnu=GNU unix --version; then
   )
 else
   args=( "${(@)args:#(|\(*\))(|\*)--*}" )
+  case $OSTYPE in
+    openbsd*|freebsd*|netbsd*|darwin*|dragonfly*)
+      args+=(
+	'(-r -E)'{-r,-E}$extended
+	'-a[delay opening files listed with w function]'
+      )
+    ;|
+    darwin*|freebsd*|netbsd*)
+      args+=(
+        '-i'$inplace
+	'-l[make output line buffered]'
+      )
+    ;|
+    freebsd*) args+=( '-u[disable data buffering]' ) ;|
+    freebsd*|netbsd*)
+      args+=(
+        '-I[edit files in-place, treating all files as a single input stream]::suffix for backup'
+      )
+    ;;
+    openbsd*) args+=( '-u[make output line buffered]' ) ;;
+  esac
 fi
 
-_arguments "$args[@]"
+_arguments -s "$args[@]"
diff --git a/Completion/Unix/Command/_sort b/Completion/Unix/Command/_sort
index ff36b9b3d..2e7f0a01a 100644
--- a/Completion/Unix/Command/_sort
+++ b/Completion/Unix/Command/_sort
@@ -1,37 +1,76 @@
-#compdef sort
+#compdef sort gsort
 
+local args variant
 local ordering='(-d --dictionary-order -g --general-numeric-sort -M --month-sort -h --human-numeric-sort -n --numeric-sort --sort -V --version-sort --help --version)'
 
-_arguments -s -S \
-  '(-b --ignore-leading-blanks)'{-b,--ignore-leading-blanks}'[ignore leading blanks]' \
-  "$ordering"{-d,--dictionary-order}'[consider only blanks and alphanumeric characters]' \
-  '(-f --ignore-case)'{-f,--ignore-case}'[fold lower case to upper case characters]' \
-  "$ordering"{-g,--general-numeric-sort}'[compare according to general numeric value]' \
-  '(-i --ignore-nonprinting)'{-i,--ignore-nonprinting}'[consider only printable characters]' \
-  "$ordering"{-M,--month-sort}"[compare (unknown) < 'JAN' < ... < 'DEC']" \
-  "$ordering"{-h,--human-numeric-sort}'[compare human readable numbers (e.g., 2K 1G)]' \
-  "$ordering"{-n,--numeric-sort}'[compare according to string numerical value]' \
-  "$ordering"{-R,--random-sort}'[sort by random hash of keys]' \
-  '--random-source=[get random bytes from file]:file:_files' \
-  '(-r --reverse)'{-r,--reverse}'[reverse the result of comparisons]' \
-  "$ordering--sort=[sort according to ordering]:ordering:(general-numeric human-numeric month numeric random version)" \
-  "$ordering"{-V,--version-sort}'[sort version numbers]' \
-  '--batch-size=[maximum inputs to merge]:number' \
-  '(-c --check -C)'{-c,-C}'[check whether input is sorted; do not sort]' \
-  '(-c --check -C)--check=-[check whether input is sorted; do not sort]::bad line handling:(diagnose-first silent quiet)' \
-  '--compress-program=[specify program to compress temporary files with]:program:(gzip bzip2 lzop xz)' \
-  '--debug[annotate the of the line used to sort]' \
-  '--files0-from=[read input files from file]:file:_files' \
-  '(-k --key)'{-k+,--key=}'[start a key at POS1, end it as POS2 (origin 1)]:key' \
-  '(-m --merge)'{-m,--merge}'[merge already sorted files; do not sort]' \
-  '(-o --output)'{-o+,--output=}'[write result to file instead of standard output]:output file:_files' \
-  '(-s --stable)'{-s,--stable}'[preserve original order of lines with the same key]' \
-  '(-S --buffer-size)'{-S+,--buffer-size=}'[specify size for main memory buffer]:size' \
-  '(-t --field-separator)'{-t+,--field-separator=}'[specify field separator instead of non-blank to blank transition]:separator' \
-  \*{-T+,--temporary-directory=}'[specify directory for temporary files]:directory:_directories' \
-  '(-u --unique)'{-u,--unique}'[with -c, check for strict ordering; without -c, output only the first of an equal run]' \
-  '--parallel=[set number of sorts run concurrently]:number' \
-  '(-z --zero-terminated)'{-z,--zero-terminated}'[end lines with 0 byte, not newline]' \
-  '(- *)--help[display help and exit]' \
-  '(- *)--version[output version information and exit]' \
-  '*:file:_files'
+args=(
+  '(-c --check -C)-c[check whether input is sorted; do not sort]'
+  '(-m --merge)'{-m,--merge}'[merge already sorted files; do not sort]'
+  '(-o --output)'{-o+,--output=}'[write result to file instead of standard output]:output file:_files'
+  \*{-T+,--temporary-directory=}'[specify directory for temporary files]:directory:_directories'
+  '(-u --unique)'{-u,--unique}'[with -c, check for strict ordering; without -c, output only the first of an equal run]'
+  "$ordering"{-d,--dictionary-order}'[consider only blanks and alphanumeric characters]'
+  '(-f --ignore-case)'{-f,--ignore-case}'[fold lower case to upper case characters]'
+  '(-i --ignore-nonprinting)'{-i,--ignore-nonprinting}'[consider only printable characters]'
+  "$ordering"{-n,--numeric-sort}'[compare according to string numerical value]'
+  '(-r --reverse)'{-r,--reverse}'[reverse the result of comparisons]'
+  '(-b --ignore-leading-blanks)'{-b,--ignore-leading-blanks}'[ignore leading blanks]'
+  '(-t --field-separator)'{-t+,--field-separator=}'[specify field separator instead of non-blank to blank transition]:separator'
+  '(-k --key)'{-k+,--key=}'[specified start and end fields for key]:key field'
+)
+
+_pick_variant -r variant gnu=GNU $OSTYPE --version
+case $variant in
+  dragonfly*|netbsd*|openbsd*|freebsd*|gnu)
+    args+=(
+      '(-s --stable)'{-s,--stable}'[preserve original order of lines with the same key]'
+    )
+  ;|
+  openbsd*|freebsd*|gnu)
+    args+=(
+      '(-c --check -C)-C[check whether input is sorted; do not sort]'
+      '(-z --zero-terminated)'{-z,--zero-terminated}'[end lines with 0 byte, not newline]'
+    )
+  ;|
+  freebsd*|gnu)
+    args+=(
+      '(-c --check -C)--check=-[check whether input is sorted; do not sort]::bad line handling:(diagnose-first silent quiet)'
+      "$ordering"{-g,--general-numeric-sort}'[compare according to general numeric value]'
+      "$ordering"{-M,--month-sort}"[compare (unknown) < 'JAN' < ... < 'DEC']"
+      "$ordering"{-h,--human-numeric-sort}'[compare human readable numbers (e.g., 2K 1G)]'
+      "$ordering"{-R,--random-sort}'[sort by random hash of keys]'
+      "$ordering"{-V,--version-sort}'[sort version numbers]'
+      "$ordering--sort=[sort according to ordering]:ordering:(general-numeric human-numeric month numeric random version)"
+      '(-i --ignore-nonprinting)'{-i,--ignore-nonprinting}'[consider only printable characters]'
+      '--random-source=[get random bytes from file]:file:_files'
+      '--batch-size=[maximum inputs to merge]:number'
+      '--compress-program=[specify program to compress temporary files with]:program:(gzip bzip2 lzop xz)'
+      '--debug[annotate the of the line used to sort]'
+      '--files0-from=[read input files from file]:file:_files'
+      '(-S --buffer-size)'{-S+,--buffer-size=}'[specify size for main memory buffer]:size'
+      '(- *)--help[display help and exit]'
+      '(- *)--version[output version information and exit]'
+    )
+  ;|
+  netbsd*|dragonfly*)
+    args+=(
+      "${ordering}-l[sort by string length of field]"
+      "(-s)-S[don't use stable sort"
+    )
+  ;|
+  openbsd*)
+    args+=(
+      '-H[use a merge sort instead of a radix sort]'
+      '-R[specify record separator]:separator'
+    )
+  ;|
+  gnu)
+    args+=( '--parallel=[set number of sorts run concurrently]:number' )
+  ;;
+  freebsd*)
+    args+=( --radixsort  --mergesort --qsort --heapsort --mmap )
+  ;;
+  *) args=( "${(@)args:#(|\(*\))(|\*)--*}" ) ;;
+esac
+
+_arguments -s -S $args '*:file:_files'
diff --git a/Completion/Unix/Command/_uname b/Completion/Unix/Command/_uname
index 9b4663b8a..414a82a87 100644
--- a/Completion/Unix/Command/_uname
+++ b/Completion/Unix/Command/_uname
@@ -1,53 +1,81 @@
 #compdef uname
 
 typeset -A _uname_args
+local -a args
+
+case $LANG in
+  de_*)
+    _uname_args=(
+      all               "alle Grundinformationen ausgeben"
+      kernel-name       "Namen des Kernels ausgeben"
+      nodename          "Netzwerknamen der Maschine ausgeben"
+      kernel-release    "Release-Nummer des Kernels ausgeben"
+      kernel-version    "Version des Kernels ausgeben"
+      os-release        "Release-Nummer des Betriebssystems ausgeben"
+      machine           "Maschinentyp (Hardware) ausgeben"
+      processor         "Typ des Prozessors ausgeben"
+      hardware-platform "Hardwareplattform ausgeben"
+      operating-system  "Namen des Betriebssystems ausgeben"
+      help              "Hilfe anzeigen und beenden"
+      version           "Versionsinformation anzeigen und beenden"
+    )
+  ;;
+  (*)
+    _uname_args=(
+      all               "print all basic information"
+      kernel-name       "print kernel name"
+      nodename          "print network node hostname"
+      kernel-release    "print kernel release"
+      kernel-version    "print kernel version"
+      os-release        "print operating system release level"
+      machine           "print machine hardware name"
+      processor         "print processor type"
+      hardware-platform "print hardware platform"
+      operating-system  "print name of the operating system"
+      help              "display help information"
+      version           "output version information and exit"
+    )
+  ;;
+esac
 
 if _pick_variant gnu="Free Soft" unix --version; then
-  case $LANG in
-    (de_DE.UTF-8)
-       _uname_args=(
-             all               "alle Informationen ausgeben"
-             kernel-name       "Namen des Kernels ausgeben"
-             nodename          "Netzwerknamen der Maschine ausgeben"
-             kernel-release    "Release-Nummer des Kernels ausgeben"
-             kernel-version    "Version des Kernels ausgeben"
-             machine           "Maschinentyp (Hardware) ausgeben"
-             processor         "Typ des Prozessors ausgeben (oder das Wort unknown)"
-             hardware-platform "Hardwareplattform ausgeben (oder das Wort unknown)"
-             operating-system  "Namen des Betriebssystems ausgeben"
-             help              "diese Hilfe anzeigen und beenden"
-             version           "Versionsinformation anzeigen und beenden"
-       )
+  _arguments -s \
+    '(-)'{--all,-a}'['$_uname_args[all]']' \
+    '(--kernel-name -s)'{--kernel-name,-s}'['$_uname_args[kernel-name]']' \
+    '(--nodename -n)'{--nodename,-n}'['$_uname_args[nodename]']' \
+    '(--kernel-release -r)'{--kernel-release,-r}'['$_uname_args[kernel-release]']' \
+    '(--kernel-version -v)'{--kernel-version,-v}'['$_uname_args[kernel-version]']' \
+    '(--machine -m)'{--machine,-m}'['$_uname_args[machine]']' \
+    '(--processor -p)'{--processor,-p}'['$_uname_args[processor]']' \
+    '(--hardware-platform -i)'{--hardware-platform,-i}'['$_uname_args[hardware-platform]']' \
+    '(--operating-system -o)'{--operating-system,-o}'['$_uname_args[operating-system]']' \
+    '(-)--help['$_uname_args[help]']' \
+    '(-)--version['$_uname_args[version]']'
+else
+  args=(
+    "(-m -n -r -s -v)-a[${_uname_args[all]}]"
+    '-m[print hardware class]'
+    "-n[${_uname_args[nodename]}]"
+    "-p[${_uname_args[processor]}]"
+    "-r[${_uname_args[os-release]}]"
+    "-s[${_uname_args[operating-system]}]"
+    '-v[print detailed operating system version]'
+  )
+  case $OSTYPE in
+    freebsd*|dragonfly*) args+=( '-i[print kernel ident]' ) ;|
+    freebsd<10->.*)
+      args+=(
+	'-K[print FreeBSD kernel version]'
+	'-U[print FreeBSD user environment version]'
+      )
     ;;
-    (*)
-       _uname_args=(
-             all               "print all information"
-             kernel-name       "print the kernel name"
-             nodename          "print the network node hostname"
-             kernel-release    "print the kernel release"
-             kernel-version    "print the kernel version"
-             machine           "print the machine hardware name"
-             processor         "print the processor type or \"unknown\""
-             hardware-platform "print the hardware platform or \"unknown\""
-             operating-system  "print the operating system"
-             help              "display this help and exit"
-             version           "output version information and exit"
-       )
+    solaris*)
+      args+=(
+        '-i[print platform name]'
+	'-S[set system name]:system name'
+        '-X[print expanded system information]'
+      )
     ;;
   esac
-
-  _arguments \
-        '(--all -a)'{--all,-a}'['$_uname_args[all]']' \
-        '(--kernel-name -s)'{--kernel-name,-s}'['$_uname_args[kernel-name]']' \
-        '(--nodename -n)'{--nodename,-n}'['$_uname_args[nodename]']' \
-        '(--kernel-release -r)'{--kernel-release,-r}'['$_uname_args[kernel-release]']' \
-        '(--kernel-version -v)'{--kernel-version,-v}'['$_uname_args[kernel-version]']' \
-        '(--machine -m)'{--machine,-m}'['$_uname_args[machine]']' \
-        '(--processor -p)'{--processor,-p}'['$_uname_args[processor]']' \
-        '(--hardware-platform -i)'{--hardware-platform,-i}'['$_uname_args[hardware-platform]']' \
-        '(--operating-system -o)'{--operating-system,-o}'['$_uname_args[operating-system]']' \
-        '--help['$_uname_args[help]']' \
-        '--version['$_uname_args[version]']'
-else
-#       TODO add options of a NON GNU implementation
+  _arguments -s $args
 fi
diff --git a/Completion/Unix/Command/_uniq b/Completion/Unix/Command/_uniq
index dcd7a6f49..1cf12357b 100644
--- a/Completion/Unix/Command/_uniq
+++ b/Completion/Unix/Command/_uniq
@@ -1,4 +1,4 @@
-#compdef uniq
+#compdef uniq guniq
 
 local args
 
@@ -20,7 +20,7 @@ args=(
 
 if ! _pick_variant gnu=Free\ Soft unix --version; then
   local optchars="cdufs"
-  if [[ "$OSTYPE" == (darwin|freebsd)* ]]; then
+  if [[ "$OSTYPE" == (darwin|dragonfly|freebsd)* ]]; then
     optchars="${optchars}i"
   fi
   args=( ${(M)args:#(|\*)(|\(*\))-[$optchars]*} )
diff --git a/Completion/Unix/Command/_wc b/Completion/Unix/Command/_wc
new file mode 100644
index 000000000..49a03ba2c
--- /dev/null
+++ b/Completion/Unix/Command/_wc
@@ -0,0 +1,26 @@
+#compdef wc gwc
+
+local args
+
+args=(
+  '(-c --bytes)'{-c,--bytes}'[print byte counts]'
+  '(-C -m --chars)'{-m,--chars}'[print character counts]'
+  '(-w --words)'{-w,--words}'[print word counts]'
+  '(-l --lines)'{-l,--lines}'[print line counts]'
+)
+
+if _pick_variant gnu=GNU unix --version; then
+  args+=(
+    '(*)--files0-from=[read NUL-terminated file list from specified file]:file:_files'
+    '(-L --max-line-length)'{-L,--max-line-length}'[print longest line lengths]'
+  )
+else
+  args=( -A "-*" "${(@)args:#(|\(*\))(|\*)--*}" )
+  case $OSTYPE in
+    freebsd*|netbsd*) args+=( '-L[print longest line lengths]' ) ;;
+    openbsd*) args+=( '-h[human readable: use unit suffixes]' ) ;;
+    solaris*) args+=( ${${(M)args:#*-m\[*}//-m\[/-C\[} ) ;;
+  esac
+fi
+
+_arguments -s -S $args '*:file:_files'
diff --git a/Completion/Unix/Command/_xargs b/Completion/Unix/Command/_xargs
index f727ed8b7..d8c0a0ec2 100644
--- a/Completion/Unix/Command/_xargs
+++ b/Completion/Unix/Command/_xargs
@@ -1,15 +1,63 @@
-#compdef xargs
-
-_arguments \
-  '(-t)-p[prompt user for each command]' \
-  '(-p)-t[verbose - echo each command]' \
-  '-x[exit if max size exceeded]' \
-  -{e-,E}':end-of-file string:' \
-  '(-x -I)-i-:replacement string for lines:' \
-  '(-x -i)-I:replacement string for lines:' \
-  '(-n -L -x)-l-:number of input lines:' \
-  '(-n -l)-L:number of input lines:' \
-  '(-l -L)-n-:maximum number of arguments:' \
-  '-s-:maximum command line length:' \
+#compdef xargs gxargs
+
+local args variant
+
+args=(
+  '(-l -L --max-lines -n --max-args -s --max-chars)'{-n+,--max-args=}'[specify maximum number of arguments for each line]:number of arguments' \
+  '(-l -L --max-lines -n --max-args -s --max-chars)'{-s+,--max-chars=}'[specify maximum characters per command line]:maximum command line length'
+  '(-p --verbose -t --interactive)'{-p,--interactive}'[prompt user for each command]'
+  '(-p --verbose -t --interactive)'{-t,--verbose}'[verbose - echo each command]'
+  '(-x --exit)'{-x,--exit}'[exit if max size exceeded]'
+)
+
+_pick_variant -r variant gnu=GNU $OSTYPE --version
+
+case $variant in
+  gnu|darwin*|freebsd*|netbsd*|openbsd*)
+    args+=(
+      '(--max-procs -P)'{-P,--max-procs}'[parallel mode]:maximum processes' '!-r'
+    )
+  ;|
+  dragonfly*|darwin*|freebsd*|netbsd*|openbsd*)
+    args=( "${(@)args:#(|\(*\))(|\*)--*}"
+      '-0[expect NUL characters as input separators]'
+      '-J[specify marker for position of arguments]:marker'
+      '-R[specify maximum arguments that -I will replace in]:replacements'
+    )
+  ;|
+  freebsd*|netbsd*)
+    args+=(
+      '-S[space that -I can use for replacements]:size (bytes) [255]'
+    )
+  ;;
+  solaris*|gnu)
+    args+=(
+      '(-x -I)'{-i-,--replace}'[specify replacement string for command line]::replacement string'
+      '(-n -L -x)-l-[call program for every number of lines]:number of input lines'
+      '(-E -e --eof)'{-e-,--eof=}'[specify EOF marker]:end-of-file marker'
+    )
+  ;|
+  solaris*) args=( "${(@)args:#(|\(*\))(|\*)--*}" ) ;|
+  solaris2.<11->)
+    args+=( '-0[expect NUL characters as input separators]' )
+  ;;
+  gnu)
+    args+=(
+      '(-a --arg-file)'{-a+,--arg-file=}'[read input items from specified file]:file:_files'
+      '(-0 --null -d --delimiter)'{-0,--null}'[expect NUL characters as input separators]'
+      '(-d --delimiter -0 --null)'{-d+,--delimiter=}'[specify delimiter of input items]:delimiter'
+      '(-l -L --max-lines -n --max-args -s --max-chars)--max-lines=-[call program for every number of lines]::number of input lines'
+      '(-r --no-run-if-empty)'{-r,--no-run-if-empty}"[don't run command in absence of input]"
+      '(- *)--help[show help information]'
+      '(- *)--version[show version information]'
+      '--show-limits[show OS imposed limits to command-line length]'
+    )
+  ;;
+esac
+
+_arguments -s $args \
+  '-E[specify EOF marker]:end-of-file marker' \
+  '(-x -i)-I[specify replacement string for command line]:replacement string' \
+  '(-n -l)-L[call program for every number of lines]:number of input lines' \
   '(-):command: _command_names -e' \
   '*::args: _normal'
diff --git a/Completion/Unix/Type/_diff_options b/Completion/Unix/Type/_diff_options
index 472838cda..d76c265ca 100644
--- a/Completion/Unix/Type/_diff_options
+++ b/Completion/Unix/Type/_diff_options
@@ -103,17 +103,20 @@ if _pick_variant -c $cmd gnu=GNU unix -v; then
 else
   case $OSTYPE in
     solaris2.<9->)
-      args=( '(-c -e -f -C)-u[output a unified diff]' )
+      args=(
+	'(-c -e -f -C -U)-u[output a unified diff]'
+	'(-c -e -f -C -u)-U[output a unified diff]:lines of context'
+      )
     ;&
     solaris*)
       args+=(
 	'-i[case insensitive]'
         '-t[expand tabs to spaces]'
 	'-w[ignore all white space]'
-        '(-c -e -f -n -u -h -D)-C+[output a context diff]:number of lines of copied context'
-	'(-c -e -f -n -u -C -D)-h[do a fast, half-hearted job]'
-	'(-c -e -f -u -h -C -D)-n[reversed ed script]'
-	'(-c -e -f -n -u -h -C)-D[output merged file with preprocessor directives]:preprocessor symbol'
+	'(-c -e -f -n -u -U -h -D)-C+[output a context diff]:lines of context'
+	'(-c -e -f -n -u -U -C -D)-h[do a fast, half-hearted job]'
+	'(-c -e -f -u -U -h -C -D)-n[reversed ed script]'
+	'(-c -e -f -n -u -U -h -C)-D[output merged file with preprocessor directives]:preprocessor symbol'
         '-l[output through pr]'
 	'-s[report on identical files]'
         '-S+[set first file in comparison]:start with file:_files'
diff --git a/Completion/Unix/Type/_file_systems b/Completion/Unix/Type/_file_systems
index 4fdeabeff..2d903d471 100644
--- a/Completion/Unix/Type/_file_systems
+++ b/Completion/Unix/Type/_file_systems
@@ -17,13 +17,14 @@ case $OSTYPE in
   osf*) fss=( advfs ufs nfs mfs cdfs ) ;;
   solaris*) fss=( ufs nfs hsfs s5fs pcfs cachefs tmpfs ) ;;
   dragonfly*)
-    fss=( cd9660 devfs ext2fs fdesc kernfs linprocfs mfs msdos nfs 
+    fss=( cd9660 devfs ext2fs fdesc kernfs linprocfs mfs msdos nfs
           ntfs null nwfs portal procfs std udf ufs umap union )
   ;;
   freebsd*)
+    fss=( ${${(f)"$(_call_program fstypes lsvfs)"}[3,-1]%% *} ) ||
     fss=( cd9660 devfs ext2fs fdescfs kernfs linprocfs linsysfs mfs msdosfs nfs
-    ntfs nullfs nwfs portalfs procfs smbfs std udf ufs unionfs 
-    reiserfs xfs)
+    ntfs nullfs nwfs portalfs procfs smbfs std tmpfs udf ufs unionfs
+    reiserfs xfs zfs )
   ;;
   darwin*)
     fss=( afp cd9660 cddafs devfs fdesc hfs lfs msdos nfs
@@ -36,11 +37,3 @@ case $OSTYPE in
 esac
 
 _wanted fstypes expl 'file system type' compadd "$@" -M 'L:|no=' -a "$@" - fss
-
-
- 
-
-
-
-
-