about summary refs log tree commit diff
path: root/Completion/BSD/Type
diff options
context:
space:
mode:
authordana <dana@dana.is>2018-01-03 16:13:23 -0600
committerOliver Kiddle <opk@zsh.org>2018-01-04 00:16:43 +0100
commit1c4e7601c4b83322e8702954c2c3b8e4672026a3 (patch)
treedcc08a08daf81c0638330e65dd8469ed691b0ca7 /Completion/BSD/Type
parent5f68531b5d8b1e6262f34e91bf047909f12dfeb2 (diff)
downloadzsh-1c4e7601c4b83322e8702954c2c3b8e4672026a3.tar.gz
zsh-1c4e7601c4b83322e8702954c2c3b8e4672026a3.tar.xz
zsh-1c4e7601c4b83322e8702954c2c3b8e4672026a3.zip
42210: factor out completion of file modes and flags and handle _comp_priv_prefix for chflags
Diffstat (limited to 'Completion/BSD/Type')
-rw-r--r--Completion/BSD/Type/_flags70
1 files changed, 70 insertions, 0 deletions
diff --git a/Completion/BSD/Type/_flags b/Completion/BSD/Type/_flags
new file mode 100644
index 000000000..95044121c
--- /dev/null
+++ b/Completion/BSD/Type/_flags
@@ -0,0 +1,70 @@
+#autoload
+
+# Provides completion for file flags (formerly part of _chflags)
+
+local curcontext=$curcontext su=$(( ! EUID || $+_comp_priv_prefix ))
+local -a context line state state_descr copts=( "${@}" ) flags flag_descs
+local -A val_args
+
+flag_descs+=(
+  uappnd 'user append-only'
+  uchg 'user immutable'
+)
+
+if (( su )); then
+  flag_descs+=(
+    arch archived
+    nodump nodump
+    sappnd 'system append-only'
+    schg 'system immutable'
+  )
+fi
+
+if [[ $OSTYPE = (darwin|dragonfly|freebsd|netbsd)* ]]; then
+  flag_descs+=(opaque opaque)
+
+  if [[ $OSTYPE = darwin* ]]; then
+    flag_descs+=(hidden hidden)
+  fi
+
+  if [[ $OSTYPE = (dragonfly|freebsd)* ]]; then
+    flag_descs+=(uunlnk 'user undeletable')
+
+    (( su )) &&
+    flag_descs+=(sunlnk 'system undeletable')
+  fi
+
+  if [[ $OSTYPE = dragonfly* ]]; then
+    flag_descs+=(
+      cache XXX
+      nouhistory 'user nohistory'
+    )
+
+    (( su )) && flag_descs+=(
+      noscache XXX
+      noshistory 'system nohistory'
+    )
+  fi
+
+  [[ $OSTYPE = freebsd* ]] && flag_descs+=(
+    uarch archive
+    uhidden hidden
+    uoffline offline
+    urdonly 'DOS, Windows and CIFS readonly'
+    ureparse 'Windows reparse point'
+    usparse 'sparse file'
+    usystem 'DOS, Windows and CIFS system'
+  )
+fi
+
+for 1 2 in $flag_descs; do
+  if [[ $1 = no* ]]; then
+    flags+=("(${1#no})$1[set the $2 flag]"
+             "($1)${1#no}[unset the $2 flag]")
+  else
+    flags+=("(no$1)$1[set the $2 flag]"
+             "($1)no$1[unset the $2 flag]")
+  fi
+done
+
+_values -O copts -s , 'file flags' $flags