Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
[PATCH] Completion batch #4: New UNIX functions
- X-seq: zsh-workers 42223
- From: dana <dana@xxxxxxx>
- To: zsh-workers@xxxxxxx
- Subject: [PATCH] Completion batch #4: New UNIX functions
- Date: Thu, 4 Jan 2018 11:48:02 -0600
- Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dana-is.20150623.gappssmtp.com; s=20150623; h=from:content-transfer-encoding:mime-version:subject:message-id:date :to; bh=AHEJF+EETimpmLgSlUYRDR1RqJelSwcj3ZfqtrF/Z0U=; b=Vlbg/kB+US4Af+bi0DhXixsdBICVXV8U8fx+B272d10wgNXmH5kqlnqL79BqnNJ/LU b8R/Qy9BgtnXwz+CUPH9VOts/qcJwWAKAd4SaBPjHA4Bz4nQz7q1LOL3suf1pUkspyJy 4ZO5Q7bmbU5kzHixPXzyG9uqsibEzz6AoXigMGrttppK7YENeV57TawZAgH4s61R04wQ Pag/gtqY1gRAkZNnTid5IdafNrcFLy4UpQxS1fGl+3FdtPp0bsIyhOdZ/ISQtQkLdiMy 63FmD1Gh2uGT4UyPKI2Ij4RmBpiIsLut8QSWCOrSuaDRSoj5tloqVtjEtBH/SwgGHWBX 6MrQ==
- List-help: <mailto:zsh-workers-help@zsh.org>
- List-id: Zsh Workers List <zsh-workers.zsh.org>
- List-post: <mailto:zsh-workers@zsh.org>
- List-unsubscribe: <mailto:zsh-workers-unsubscribe@zsh.org>
- Mailing-list: contact zsh-workers-help@xxxxxxx; run by ezmlm
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