about summary refs log tree commit diff
path: root/Completion/Unix
diff options
context:
space:
mode:
Diffstat (limited to 'Completion/Unix')
-rw-r--r--Completion/Unix/Command/.distfiles1
-rw-r--r--Completion/Unix/Command/_chmod82
2 files changed, 83 insertions, 0 deletions
diff --git a/Completion/Unix/Command/.distfiles b/Completion/Unix/Command/.distfiles
index 157ed7fce..92d7553fd 100644
--- a/Completion/Unix/Command/.distfiles
+++ b/Completion/Unix/Command/.distfiles
@@ -21,4 +21,5 @@ _netcat       _larch        _texinfo	  _figlet       _elinks       _tidy
 _global                     _ant          _lsof         _mt           _xmlsoft
 _perforce     _python       _antiword     _screen       _renice       _apm
 _ecasound     _gpg	    _subversion   _aap          _sablotron    _nmap
+_chmod
 '
diff --git a/Completion/Unix/Command/_chmod b/Completion/Unix/Command/_chmod
new file mode 100644
index 000000000..c3c949959
--- /dev/null
+++ b/Completion/Unix/Command/_chmod
@@ -0,0 +1,82 @@
+#compdef chmod
+
+local curcontext="$curcontext" state line ret=1
+local -a args privs
+
+args=( '*:file:->files' )
+(( $+words[(r)--reference*] )) || args+=( '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'
+    '(-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]' )
+fi
+
+_arguments -C -s "$args[@]" && ret=0
+
+case "$state" in
+  mode)
+    compset -P \*,
+    compset -S ,\*
+    if [[ -prefix [0-7] ]]; then
+      _message -e number 'numeric mode'
+    elif compset -P '[a-z]#[+-=]'; then
+      _values -S '' privilege \
+	'r[read]' 'w[write]' 'x[execute]' \
+	's[set uid/gid]' 't[sticky]' \
+	"$privs[@]" && ret=0
+    else
+      suf=( -S '' )
+      compset -P '*'
+      _alternative -O suf \
+	'who:who:((u\:user g\:group a\:all o\:others))' \
+	'operators:operator:(+ - =)'
+    fi
+  ;;
+  files)
+    if [[ -n $opt_args[--reference] ]]; then
+      if zstyle -t ":completion:${curcontext}:" disable-stat; then
+	_files && ret=0
+      else
+	zmodload -i zsh/stat 2>/dev/null
+	typeset -i8 ref=$(stat +mode $opt_args[--reference])
+	_wanted files expl file _files -g "*(-.^f${ref#??})" && ret=0
+      fi
+    elif [[ $words[2] = [0-7]## ]]; then
+      _wanted files expl file _files -g "*(-.^f$words[2])" && ret=0
+    else
+      local spec who op priv
+      local -a specs
+      for spec in ${(s:,:)words[2]}; do
+	if [[ ${spec#*[+-=]} != [rwxst]* ]]; then
+	  _files && ret=0
+	  return ret
+	fi
+
+	specs+=( ${${(M)spec##[+-=]*}:+a}$spec )
+      done
+      _wanted files expl file _files -g "*(-.^f:${(j.,.)specs}:)" && ret=0
+    fi
+  ;;
+esac
+
+return ret