about summary refs log tree commit diff
path: root/Completion/Unix/Type/_file_modes
blob: fbe4c9363c933f9c2ada6a69e7a301f68bafdeb7 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#autoload

# Provides completion for file modes (formerly part of _chmod)

local curcontext=$curcontext
local -a context line state state_descr copts=( "${@}" ) privs
local -A val_args

privs=(
  '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[others' current permissions]"
)

[[ $OSTYPE == solaris* ]] &&
privs+=( 'l[mandatory locking]' )

compset -P '*,'
compset -S ',*'

if [[ -prefix [0-7] ]]; then
  _message -e number 'numeric mode'
elif compset -P '[a-z]#[+-=]'; then
  _values -O copts -S '' privilege $privs && return 0
else
  compset -P '*'
  copts=( -S '' )
  _alternative -O copts \
    'who:who:((a\:all u\:owner g\:group o\:others))' \
    'operators:operator:(+ - =)' \
  && return 0
fi

return 1