Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

[PATCH] Completion batch #4: New UNIX functions



As the _cmd_variant stuff is percolating, here's another batch: These are all
new functions belonging to the 'Unix' group. None of them are particularly
complicated.

subl is the command-line interface to Sublime Text; the others are probably
self-explanatory. There are several more coreutils-style commands like this that
i intend to do too, but i haven't started on them just yet.

As always, let me know if you see anything i've done weird.

dana


diff --git a/Completion/Unix/Command/_fold b/Completion/Unix/Command/_fold
new file mode 100644
index 000000000..cccdb6c1e
--- /dev/null
+++ b/Completion/Unix/Command/_fold
@@ -0,0 +1,25 @@
+#compdef fold gfold
+
+local curcontext=$curcontext variant
+local -a context line state state_descr args
+local -A opt_args
+
+_pick_variant -r variant busybox=BusyBox gnu='Free Soft' unix --version
+
+args=(
+  '(-b --bytes)'{-b,--bytes}'[count bytes rather than columns]'
+  '(: -)--help[display help information]'
+  '(-s --spaces)'{-s,--spaces}'[fold on whitespace]'
+  '(-w --width)'{-w+,--width=}'[specify line width]:line width (columns or bytes)'
+  '(: -)--version[display version information]'
+  '*: :_files'
+)
+
+# Non-GNU variants don't support long options (except BusyBox's --help)
+if [[ $variant == *busybox* ]]; then # See also: _busybox
+  args=( ${args:#((#s)|*\))(\*|)--^help*} )
+elif [[ $variant != gnu ]]; then
+  args=( ${args:#((#s)|*\))(\*|)--*} )
+fi
+
+_arguments -s -S : $args

diff --git a/Completion/Unix/Command/_getopt b/Completion/Unix/Command/_getopt
new file mode 100644
index 000000000..f6e65f99b
--- /dev/null
+++ b/Completion/Unix/Command/_getopt
@@ -0,0 +1,30 @@
+#compdef getopt ggetopt
+
+local curcontext=$curcontext
+local -a context line state state_descr args aopts
+local -A opt_args
+
+# Note: BusyBox getopt is borrowed straight from util-linux, so they're
+# basically identical
+if _pick_variant busybox=BusyBox util-linux='getopt*enhanced' unix --version; then
+  args=(
+    '(-a --alternative)'{-a,--alternative}'[allow long options with single -]'
+    '(: -)'{-h,--help}'[display help information]'
+    '*'{-l+,--longoptions=}'[specify long options]:long options'
+    '(-n --name)'{-n+,--name=}'[specify program name]:program name'
+    '(1 -o --options)'{-o+,--options=}'[specify short options]:short options'
+    '(-q --quiet)'{-q,--quiet}'[suppress getopt(3) error messages]'
+    '(-Q --quiet-output)'{-Q,--quiet-output}'[suppress normal output]'
+    '(-s --shell)'{-s+,--shell=}'[specify shell quoting conventions]:shell:(bash csh tcsh sh)'
+    '(: -)'{-T,--test}'[test for enhanced getopt]'
+    '(-u --unquoted)'{-u,--unquoted}'[do not quote output]'
+    '(: -)'{-V,--version}'[display version information]'
+    '(-o --options)1: :_guard "^-*" "short options"'
+    '*:argument'
+  )
+  [[ -n $POSIXLY_CORRECT ]] && aopts+=( -A '-*' )
+else
+  args=( '1:short options' '*:argument' )
+fi
+
+_arguments -s -S $aopts : $args

diff --git a/Completion/Unix/Command/_install b/Completion/Unix/Command/_install
new file mode 100644
index 000000000..007f4bd27
--- /dev/null
+++ b/Completion/Unix/Command/_install
@@ -0,0 +1,111 @@
+#compdef install ginstall
+
+local curcontext=$curcontext lx
+local -a context line state state_descr common_args args tmp
+local -A opt_args val_args
+
+# These are *almost* common — non-GNU variants need to remove the long options
+common_args=(
+  '(--backup)-b[create backups of destination files]'
+  '(-C -c --compare)'{-C,--compare}'[copy files; do nothing if identical destination file exists]'
+  '(-C -c --compare)-c[copy files (default)]'
+  '(-d --directory)'{-d,--directory}'[create directories]'
+  '(-g --group)'{-g+,--group=}'[specify destination file group]: :_groups'
+  '(-m --mode)'{-m+,--mode=}'[specify destination file mode]: :_modes'
+  '(-o --owner)'{-o+,--owner=}'[specify destination file owner]: :_users'
+  '(-p --preserve-timestamps)'{-p,--preserve-timestamps}'[preserve modification times]'
+  '(-s --strip)'{-s,--strip}'[strip binaries]'
+  '(-v --verbose)'{-v,--verbose}'[output verbosely]'
+  '*: :_files'
+)
+
+if _pick_variant gnu='Free Soft' unix --version; then
+  # Hide Linux-specific options on non-Linux platforms
+  [[ $OSTYPE == linux* ]] || lx='!'
+  args+=(
+    $common_args
+    '(-b --backup)--backup=[create backup; optionally specify method]:: :->controls'
+    "${lx}--context=[like -Z, or specify SELinux security context to set]::SELinux security context"
+    '-D[create all leading destination path components]'
+    '(: -)--help[display help information]'
+    "${lx}--preserve-context[preserve SELinux security context]"
+    '--strip-program=[specify program used to strip binaries]:strip program:_files'
+    '(-S --suffix)'{-S+,--suffix=}'[specify backup suffix]:backup suffix'
+    '(-t --target-directory)'{-t+,--target-directory=}'[copy source to specified directory]: :_directories'
+    '(-T --no-target-directory)'{-T,--no-target-directory}'[treat destination as regular file]'
+    '(: -)--version[display version information]'
+    "${lx}-Z[set SELinux security context on destination files to default type]"
+  )
+
+else
+  args+=(
+    ${common_args##((#s)|*\))(\*|)--*}
+    '-B+[specify backup suffix for -b]:backup suffix'
+    '-f+[specify destination file flags]: :_flags'
+  )
+  [[ $OSTYPE == dragonfly* ]] && args+=(
+    '!-D+[no effect (compatibility with NetBSD)]: :_directories'
+    '-L+[use user/group database files from specified directory]: :_directories'
+    '-l[fall back to system files if user/group not found in -L directory]'
+  )
+  [[ $OSTYPE == netbsd* ]] && {
+    args+=(
+      '-a+[specify shell command to run on files after install]:shell command'
+      '-r[use temporary files to perform safe copy]'
+      '-S+[specify arguments to pass to strip program]:arguments to strip program'
+    )
+    # NetBSD has no -v for some reason
+    args=( ${args##((#s)|*\))(\*|)-v*} )
+  }
+  [[ $OSTYPE == openbsd* ]] && args+=(
+    '-D[create all leading destination path components]'
+    '-F[flush installed file contents to disk]'
+  )
+  [[ $OSTYPE == (darwin|dragonfly)* ]] && args+=(
+    '-M[disable use of mmap(2)]'
+  )
+  [[ $OSTYPE == (freebsd|netbsd)* ]] && args+=(
+    '-D+[specify destination directory used for metadata log]: :_directories'
+    '-h+[store digest in metadata log using specified method]: :->digests'
+    '(-C -c --compare)-l+[link files (rather than copy) using specified method]: :->linkflags'
+    '-M+[log mtree(8) metadata for installed files to specified file]:metadata log file:_files'
+    '+N+[use user/group database files from specified directory]: :_directories'
+    '-T+[specify mtree(8) tags to store in metadata log]:mtree(8) tags'
+    '-U[indicate that install is unprivileged]'
+  )
+  [[ $OSTYPE == netbsd* ]] || args+=(
+    '-S[use temporary files to perform safe copy]'
+  )
+fi
+
+_arguments -s -S : $args && return 0
+
+case $state in
+  controls)
+    tmp=(
+      {none,off}':never make backups'
+      {numbered,t}':make numbered backups'
+      {existing,nil}':make numbered backups if they already exist'
+      # 'never' actually means 'always'...
+      {simple,never}':make simple backups'
+    )
+    _describe -t controls 'version control method' tmp && return 0
+    ;;
+  digests)
+    tmp=( none md5 rmd160 sha1 sha256 sha512 )
+    [[ $OSTYPE == netbsd* ]] && tmp+=( sha384 )
+    _values 'digest method' $tmp && return 0
+    ;;
+  linkflags)
+    tmp=(
+      'h[hard links]'
+      's[symlinks]'
+      'm[mixed (hard links for files on same file system)]'
+      'a[symlinks use absolute path]'
+      'r[symlinks use relative path]'
+    )
+    _values -S '' 'link flags' $tmp && return 0
+    ;;
+esac
+
+return 1

diff --git a/Completion/Unix/Command/_mktemp b/Completion/Unix/Command/_mktemp
new file mode 100644
index 000000000..d08ca39a8
--- /dev/null
+++ b/Completion/Unix/Command/_mktemp
@@ -0,0 +1,44 @@
+#compdef mktemp gmktemp
+
+local curcontext=$curcontext variant
+local -a context line state state_descr args
+local -A opt_args
+
+_pick_variant -r variant busybox=BusyBox gnu='Free Soft' unix --version
+
+args=(
+  '(-d --directory)'{-d,--directory}'[make directory instead of file]'
+  '(: -)--help[display help information]'
+  '(-p --tmpdir)'{-p+,--tmpdir=}'[make relative to specified directory]: :_directories'
+  '(-q --quiet)'{-q,--quiet}'[suppress error messages]'
+  '--suffix=[append specified suffix to template]:template suffix'
+  '-t[interpret template as single path component relative to temp dir]'
+  '(-u --dry-run)'{-u,--dry-run}'[print file name only]'
+  '(: -)'{-V,--version}'[display version information]'
+  '1: :_guard "^-*" "template name"'
+)
+
+# Non-GNU variants don't support long options (except BusyBox's --help)
+if [[ $variant == *busybox* ]]; then # See also: _busybox
+  args=( ${args:#((#s)|*\))(\*|)--^help*} )
+elif [[ $variant != gnu ]]; then
+  args=( ${args:#((#s)|*\))(\*|)--*} )
+fi
+
+[[ $variant == gnu ]] || {
+  # BusyBox, OpenBSD, and Solaris have -p, but -t doesn't take an argument
+  if [[ $variant == *busybox* ]] || [[ $OSTYPE == (openbsd|solaris)* ]]; then
+    args=( ${args:#((#s)|*\))(\*|)-t*} )
+    args+=( '-t[generate template relative to temp dir]' )
+  # Dragonfly, FreeBSD, and Darwin take an argument to -t and support any number
+  # of template files
+  else
+    args=( ${args:#((#s)|*\))(1:*|(\*|)-t*)} )
+    args+=(
+      '-t[generate template relative to temp dir using specified prefix]:template prefix'
+      '*: :_guard "^-*" "template name"'
+    )
+  fi
+}
+
+_arguments -s -S : $args

diff --git a/Completion/Unix/Command/_subl b/Completion/Unix/Command/_subl
new file mode 100644
index 000000000..012309ad2
--- /dev/null
+++ b/Completion/Unix/Command/_subl
@@ -0,0 +1,17 @@
+#compdef subl
+
+local curcontext=$curcontext
+local -a context line state state_descr
+local -A opt_args
+
+_arguments -s -S : \
+  '(-a -n --add --new-window)'{-a,--add}'[add to current window]' \
+  '(-b --background)'{-b,--background}'[do not activate application]' \
+  '--command[run specified command]:command' \
+  '(: -)'{-h,--help}'[display help information]' \
+  '(-a -n --add --new-window)'{-n,--new-window}'[open new window]' \
+  '--project[load specified project]:project file:_files' \
+  '(-s --stay)'{-s,--stay}'[keep application activated]' \
+  '(: -)'{-v,--version}'[display version information]' \
+  '(-w --wait)'{-w,--wait}'[wait for files to close]' \
+  '*:file or directory:_files'



Messages sorted by: Reverse Date, Date, Thread, Author