summaryrefslogtreecommitdiff
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