From: dana <dana@dana.is>
To: zsh-workers@zsh.org
Subject: [PATCH] Completion batch #4: New UNIX functions
Date: Thu, 4 Jan 2018 11:48:02 -0600 [thread overview]
Message-ID: <0ED247D6-B6E3-40AB-A59D-DDEFC4083BEE@dana.is> (raw)
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'
next reply other threads:[~2018-01-04 17:48 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-01-04 17:48 dana [this message]
2018-01-05 14:54 ` Oliver Kiddle
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=0ED247D6-B6E3-40AB-A59D-DDEFC4083BEE@dana.is \
--to=dana@dana.is \
--cc=zsh-workers@zsh.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.vuxu.org/mirror/zsh/
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).