summaryrefslogtreecommitdiffstats
path: root/Completion/Unix
diff options
context:
space:
mode:
Diffstat (limited to 'Completion/Unix')
-rw-r--r--Completion/Unix/Command/_abcde2
-rw-r--r--Completion/Unix/Command/_ansible6
-rw-r--r--Completion/Unix/Command/_cat86
-rw-r--r--Completion/Unix/Command/_cdrecord4
-rw-r--r--Completion/Unix/Command/_column8
-rw-r--r--Completion/Unix/Command/_configure24
-rw-r--r--Completion/Unix/Command/_csplit4
-rw-r--r--Completion/Unix/Command/_drill2
-rw-r--r--Completion/Unix/Command/_du12
-rw-r--r--Completion/Unix/Command/_entr1
-rw-r--r--Completion/Unix/Command/_ffmpeg1649
-rw-r--r--Completion/Unix/Command/_find12
-rw-r--r--Completion/Unix/Command/_flac4
-rw-r--r--Completion/Unix/Command/_fuser5
-rw-r--r--Completion/Unix/Command/_gcc18
-rw-r--r--Completion/Unix/Command/_gcore2
-rw-r--r--Completion/Unix/Command/_git75
-rw-r--r--Completion/Unix/Command/_gnutls3
-rw-r--r--Completion/Unix/Command/_gpg1
-rw-r--r--Completion/Unix/Command/_gphoto23
-rw-r--r--Completion/Unix/Command/_hardlink43
-rw-r--r--Completion/Unix/Command/_imagemagick2
-rw-r--r--Completion/Unix/Command/_ldd11
-rw-r--r--Completion/Unix/Command/_less11
-rw-r--r--Completion/Unix/Command/_mpc2
-rw-r--r--Completion/Unix/Command/_nano2
-rw-r--r--Completion/Unix/Command/_ngrep2
-rw-r--r--Completion/Unix/Command/_nm8
-rw-r--r--Completion/Unix/Command/_nmap199
-rw-r--r--Completion/Unix/Command/_numfmt1
-rw-r--r--Completion/Unix/Command/_objdump9
-rw-r--r--Completion/Unix/Command/_opustools4
-rw-r--r--Completion/Unix/Command/_pandoc1
-rw-r--r--Completion/Unix/Command/_patchutils10
-rw-r--r--Completion/Unix/Command/_pgrep29
-rw-r--r--Completion/Unix/Command/_pmap2
-rw-r--r--Completion/Unix/Command/_postfix2
-rw-r--r--Completion/Unix/Command/_ps1
-rw-r--r--Completion/Unix/Command/_rar13
-rw-r--r--Completion/Unix/Command/_readelf13
-rw-r--r--Completion/Unix/Command/_ruby125
-rw-r--r--Completion/Unix/Command/_screen1
-rw-r--r--Completion/Unix/Command/_script3
-rw-r--r--Completion/Unix/Command/_sh177
-rw-r--r--Completion/Unix/Command/_shutdown59
-rw-r--r--Completion/Unix/Command/_sleep25
-rw-r--r--Completion/Unix/Command/_sqlite3
-rw-r--r--Completion/Unix/Command/_ssh12
-rw-r--r--Completion/Unix/Command/_strings7
-rw-r--r--Completion/Unix/Command/_strip4
-rw-r--r--Completion/Unix/Command/_tcpdump3
-rw-r--r--Completion/Unix/Command/_texinfo17
-rw-r--r--Completion/Unix/Command/_tiff6
-rw-r--r--Completion/Unix/Command/_w9
-rw-r--r--Completion/Unix/Command/_w3m10
-rw-r--r--Completion/Unix/Command/_xmlsoft16
-rw-r--r--Completion/Unix/Command/_xxd15
-rw-r--r--Completion/Unix/Command/_xz8
-rw-r--r--Completion/Unix/Command/_zfs14
-rw-r--r--Completion/Unix/Command/_zip2
-rw-r--r--Completion/Unix/Command/_zstd2
-rw-r--r--Completion/Unix/Type/_date_formats2
-rw-r--r--Completion/Unix/Type/_diff_options2
63 files changed, 2361 insertions, 447 deletions
diff --git a/Completion/Unix/Command/_abcde b/Completion/Unix/Command/_abcde
index 6b09d87b5..be18d7f05 100644
--- a/Completion/Unix/Command/_abcde
+++ b/Completion/Unix/Command/_abcde
@@ -34,7 +34,7 @@ _arguments -s -S -A "-*" \
'(- :)-v[show the version and exit]' \
'-V[be more verbose]' \
'-x[eject the CD when all tracks have been read]' \
- '-X+[use an alternative "cue2discid" implementation]:cue2discid:_command_names -e' \
+ '-X+[use an alternative "cue2discid" implementation]:cue2discid:_phony builtin _command_names -e' \
'-w+[add a comment to the tracks ripped from the CD]:comment' \
"-W+[concatenate CD's]:cd-number" \
'-z[debug mode]' \
diff --git a/Completion/Unix/Command/_ansible b/Completion/Unix/Command/_ansible
index 554e61c49..d87bf49c2 100644
--- a/Completion/Unix/Command/_ansible
+++ b/Completion/Unix/Command/_ansible
@@ -143,7 +143,6 @@ case $service in
;;
ansible-playbook)
args+=(
- '--flush-cache[clear the fact cache for every host in inventory]'
'--force-handlers[run handlers even if a task fails]'
'--list-tags[list all available tags]'
'--list-tasks[list all tasks that would be executed]'
@@ -208,10 +207,15 @@ case $state in
else
local -a inventory
typeset -ga _ansible_hosts _ansible_groups
+ typeset -g _ansible_inventory_last_cwd
+ if [[ $PWD != $_ansible_inventory_last_cwd ]]; then
+ unset _ansible_hosts _ansible_groups
+ fi
if (( !$#_ansible_hosts || !$#_ansible_groups )); then
inventory=( ${(f)"$(_call_program groups ansible-inventory --graph)"} )
_ansible_hosts=( ${${(M)inventory%--[^:]#}#--} )
_ansible_groups=( ${${${(M)inventory%@*:}%:}#@} )
+ _ansible_inventory_last_cwd=$PWD
fi
if [[ $state = hosts ]]; then
suf=( -qS: )
diff --git a/Completion/Unix/Command/_cat b/Completion/Unix/Command/_cat
index 78c35653c..d15c5f93c 100644
--- a/Completion/Unix/Command/_cat
+++ b/Completion/Unix/Command/_cat
@@ -1,65 +1,73 @@
#compdef cat gcat
+local ign
local -a args
if _pick_variant gnu='(GNU|uutils)' unix --version; then
+ (( $#words > 2 )) && ign='!(- : *)'
args=(
'(-A --show-all)'{-A,--show-all}'[equivalent to -vET]'
'(-b --number-nonblank -n --number)'{-b,--number-nonblank}'[number nonempty output lines, overrides -n]'
'-e[equivalent to -vE]'
- '(-E --show-ends)'{-E,--show-ends}'[display $ at end of each line]'
+ '(-E --show-ends)'{-E,--show-ends}'[display $ or ^M$ at end of each line]'
'(-n --number)'{-n,--number}'[number all output lines]'
'(-s --squeeze-blank)'{-s,--squeeze-blank}'[suppress repeated empty output lines]'
'-t[equivalent to -vT]'
'(-T --show-tabs)'{-T,--show-tabs}'[display TAB characters as ^I]'
'-u[ignored]'
'(-v --show-nonprinting)'{-v,--show-nonprinting}'[use ^ and M- notation, except for LFD and TAB]'
- '(- : *)--help[display help and exit]'
- '(- : *)--version[output version information and exit]'
+ "$ign--help[display help and exit]"
+ "$ign--version[display version information]"
'*: :_files'
)
-
-elif [[ "$OSTYPE" == (*bsd|dragonfly|darwin)* ]]; then
- args=(
- -A "-*"
+else
+ # POSIX requires just '-u'
+ args=( -A "-?*"
'(-n)-b[number non-blank output lines]'
'(-v)-e[display $ at the end of each line (implies -v)]'
- '-n[number all output lines]'
- '-s[squeeze multiple blank lines into one]'
- '(-v)-t[display tab as ^I (implies -v)]'
- '-u[do not buffer output]'
'-v[display non-printing chars as ^X or M-a]'
- '*: :_files'
- )
- [[ $OSTYPE = (free|net)bsd* ]] && args+=(
- '-l[set a lock on the stdout file descriptor]'
- )
- [[ $OSTYPE = netbsd* ]] && args+=(
- '-B+[read with buffer of specified size]:size (bytes)'
- '-f[only attempt to display regular files]'
- )
- [[ $OSTYPE = darwin* ]] && args+=(
- '-l[set an exclusive advisory lock on standard output]'
- )
-elif [[ $OSTYPE = solaris* ]]; then
- args=(
- -A "-*"
- '(-b)-n[number all output lines]'
- '(-n)-b[number non-blank output lines]'
- "-u[don't buffer output]"
- '-s[be silent about non-existent files]'
- '-v[display non-printing chars as ^X or M-a]'
- '-e[display $ at the end of each line (requires -v)]'
- '-t[display tab as ^I and formfeeds and ^L (requires -v)]'
- '*: :_files'
- )
-else
- # POSIX requires '-u', and most OSes may support '-n'
- args=(
'-n[number all output lines]'
- '-u[do not buffer output]'
+ "-u[don't buffer output]"
'*: :_files'
)
+ case $OSTYPE in
+ (*bsd|dragonfly|darwin)*)
+ args+=(
+ '-s[squeeze multiple blank lines into one]'
+ '(-v)-t[display tab as ^I (implies -v)]'
+ )
+ ;|
+ (free|net)bsd*)
+ args+=(
+ '-l[set a lock on the stdout file descriptor]'
+ )
+ ;|
+ aix*|solaris*)
+ args+=(
+ '(-q)-s[be silent about non-existent files]'
+ '-t[display tab as ^I and formfeeds and ^L (requires -v)]'
+ )
+ ;|
+
+ aix*)
+ args+=(
+ '(-s)-q[be silent about non-existent files]'
+ '(-r -S)'{-r,-S}'[condense consecutive blank lines to one line]'
+ '-Z[dump encrypted files in encrypted format]'
+ )
+ ;;
+ netbsd*)
+ args+=(
+ '-B+[read with buffer of specified size]:size (bytes)'
+ '-f[only attempt to display regular files]'
+ )
+ ;;
+ darwin*)
+ args+=(
+ '-l[set an exclusive advisory lock on standard output]'
+ )
+ ;;
+ esac
fi
_arguments -s -S $args
diff --git a/Completion/Unix/Command/_cdrecord b/Completion/Unix/Command/_cdrecord
index 602cd5e8e..e429d7bfa 100644
--- a/Completion/Unix/Command/_cdrecord
+++ b/Completion/Unix/Command/_cdrecord
@@ -80,8 +80,8 @@ if [[ -n $state ]]; then
'mcn[set media catalog number for this CD]:text' \
'isrc[set isrc number for the next track]:text' \
'index[set the index list for the next track]:list' \
- 'textfile[set the file with CD-Text data]:name:_files -g "*.inf(-.)"' \
- 'cuefile[set the file with CDRWIN CUE data]:name:_files -g "*.cue(-.)"' && ret=0
+ 'textfile[set the file with CD-Text data]:name:_tilde_files -g "*.inf(-.)"' \
+ 'cuefile[set the file with CDRWIN CUE data]:name:_tilde_files -g "*.cue(-.)"' && ret=0
fi
_requested files expl track _files && ret=0
(( ret )) || break
diff --git a/Completion/Unix/Command/_column b/Completion/Unix/Command/_column
index 737bb4561..d9f397f23 100644
--- a/Completion/Unix/Command/_column
+++ b/Completion/Unix/Command/_column
@@ -32,10 +32,11 @@ case $variant in
+ fill
'(info table text json -x --fillrows)'{-x,--fillrows}'[print across before down]'
+ table
- '(info fill -t --table)'{-t,--table}'[create a table]'
+ '(info fill -t --table -S --use-spaces)'{-t,--table}'[create a table]'
'(info fill -o --output-separator)'{-o+,--output-separator=}'[specify column separator for table output]:separator [two spaces]'
- '(info fill -s --separator)'{-s+,--separator=}'[specify column delimiters in input data]:delimiters'
+ '(info fill -s --input-separator --separator)'{-s+,--input-separator=,--separator=}'[specify column delimiters in input data]:delimiters'
'(info fill -O --table-order)'{-O+,--table-order=}'[specify order of output columns]: :->columns'
+ '(info)--table-colorscheme=[specify color scheme name]:name [column]'
'(info fill -N --table-columns)*'{-C+,--table-column=}'[specify column properties]: :_values -s, -S= property
"name[column name]\:name"
"trunc[truncate text in the columns when necessary]"
@@ -54,13 +55,16 @@ case $variant in
'(info fill json -d --table-noheadings)'{-d,--table-noheadings}"[don't print header]"
'(info fill json -E --table-noextreme)'{-E+,--table-noextreme}"[specify columns where length can be ignored]: :->columns"
'(info fill json -e --table-header-repeat)'{-e,--table-header-repeat}'[repeat header for each page]'
+ '(info fill json -K --table-header-as-columns)'{-K,--table-header-as-columns}'[use first row as table header]'
'(info fill json -H --table-hide)'{-H+,--table-hide=}"[don't print specified columns]: :->columns"
'(info fill json -R --table-right)'{-R+,--table-right=}'[right align text in these columns]: :->columns'
'(info fill json -T --table-truncate)'{-T+,--table-truncate=}'[truncate text in the columns when necessary]: :->columns'
'(info fill json -W --table-wrap)'{-W+,--table-wrap=}'[wrap text in the columns when necessary]: :->columns'
+ '(info fill json)--wrap-separator=[wrap at specified separator]:string'
'(info fill json -r --tree)'{-r+,--tree=}'[specify column to format tree-like]: :->columns'
'(info fill json -i --tree-id)'{-i+,--tree-id=}'[specify column containing ID for child-parent relations]: :->columns'
'(info fill json -p --tree-parent)'{-p+,--tree-parent=}'[specify column containing reference to parent]: :->columns'
+ '(info table json -S --use-spaces)'{-S+,--use-spaces=}'[minimal whitespace between columns (no tabs)]:spaces'
+ json
'(info fill text -n --table-name -c --output-width)'{-n+,--table-name=}'[specify table name for JSON output]:name'
'(info fill text -J --json -c --output-width)'{-J,--json}'[use JSON output format for table]'
diff --git a/Completion/Unix/Command/_configure b/Completion/Unix/Command/_configure
index 3b22b53db..460144ac3 100644
--- a/Completion/Unix/Command/_configure
+++ b/Completion/Unix/Command/_configure
@@ -1,6 +1,11 @@
#compdef configure config.status
-_arguments -- -i '(--(disable|enable)-FEATURE* --(with|without)-PACKAGE*)' \
+local ret=1
+local -a expl suf
+
+[[ -prefix - ]] ||
+ ! zstyle -T ":completion:${curcontext}:options" prefix-needed &&
+ _arguments -- -i '(--(disable|enable)-FEATURE* --(with|without)-PACKAGE*)' \
-s '((#s)--disable- --enable-
(#s)--enable- --disable-
(#s)--with- --without-
@@ -8,4 +13,19 @@ _arguments -- -i '(--(disable|enable)-FEATURE* --(with|without)-PACKAGE*)' \
'*=(E|)PREFIX*:prefix directory:_files -/' \
'*=PROGRAM*:program:_command_names -e' \
'*=NAME*executable*:program:_command_names -e' \
- '*=NAME*:file:_files'
+ '*=NAME*:file:_files' && ret=0
+
+if [[ ! -prefix - ]]; then
+ if [[ "$PREFIX" = *\=* ]]; then
+ compstate[parameter]="${PREFIX%%\=*}"
+ compset -P 1 '*='
+ _value && ret=0
+ else
+ compset -S '=*' || suf=( -S = )
+ _wanted -x variables expl variable compadd $suf \
+ CC CFLAGS CPP CPPFLAGS CXX CXXFLAGS DEFS ERLCFLAGS FCFLAGS \
+ FFLAGS GOFLAGS LDFLAGS LIBS OBJCFLAGS OBJCXXFLAGS && ret=0
+ fi
+fi
+
+return ret
diff --git a/Completion/Unix/Command/_csplit b/Completion/Unix/Command/_csplit
index b0ba1d7f4..eb354bd83 100644
--- a/Completion/Unix/Command/_csplit
+++ b/Completion/Unix/Command/_csplit
@@ -17,7 +17,7 @@ specs=(
if _pick_variant gnu='(GNU|uutils)' unix --version; then
# GNU coreutils 8.32
specs+=(
- '(hv -b --suffix-format -n --digits)'{-b+,--suffix-format=}'[specify format for numbers in output file names]:format [%%02d]: '
+ '(hv -b --suffix-format -n --digits)'{-b+,--suffix-format=}'[specify format for numbers in output file names]:format [%02d]: '
'(hv)--suppress-matched[suppress the lines matching the pattern]'
'(hv -z --elide-empty)'{-z,--elide-empty-files}'[remove empty output files]'
+ hv
@@ -44,7 +44,7 @@ case $state in
elif compset -P '[0-9]*'; then
_message 'line number' && ret=0
elif [[ ${words[CURRENT]} != -* ]] then
- _message "line_number, '/regex/[offset]', '%%regex%%[offset]', or '{count}'" && ret=0
+ _message "line_number, '/regex/[offset]', '%regex%[offset]', or '{count}'" && ret=0
fi
esac
diff --git a/Completion/Unix/Command/_drill b/Completion/Unix/Command/_drill
index 68fa7917b..6ce634874 100644
--- a/Completion/Unix/Command/_drill
+++ b/Completion/Unix/Command/_drill
@@ -20,7 +20,7 @@ _arguments -s -S -C \
'(-4)-6[stay on ipv6]' \
'-a[fallback to EDNS0 and TCP if the answer is truncated]' \
'-b+[specify buffer size (defaults to 512 b)]:size (bytes) [512]' \
- '-c+[use specified file for rescursive nameserver configuration]:file [/etc/resolv.conf]:_files' \
+ '-c+[use specified file for recursive nameserver configuration]:file [/etc/resolv.conf]:_files' \
'-k+[specify a file that contains a trusted DNSSEC key]:file:_files' \
'*-o+[set/unset header bits]:mnemonic (uppercase sets, lower unsets):_sequence compadd - QR qr AA aa TC tc RD rd CD cd RA ra AD ad' \
'-p+[use specified remote port number]:port:_ports' \
diff --git a/Completion/Unix/Command/_du b/Completion/Unix/Command/_du
index 038811eb8..be2cbdfce 100644
--- a/Completion/Unix/Command/_du
+++ b/Completion/Unix/Command/_du
@@ -5,7 +5,7 @@ if _pick_variant gnu='(Free Soft|uutils)' unix --version /dummy/no-such-file; th
_arguments -s \
'(-a --all -s --summarize)'{-a,--all}'[write counts for all files]' \
- '--apparent-size[print apparent sizes rather than disc usage]' \
+ '(-A --apparent-size)'{-A,--apparent-size}'[print apparent sizes rather than disc usage]' \
'(-B --block-size -k)'{-B+,--block-size=}'[specify block size]:size (bytes)' \
'(-B --block-size -k --apparent-size -b --bytes)'{-b,--bytes}'[equivalent to --apparent-size --block-size=1]' \
'(-c --total)'{-c,--total}'[produce a grand total]' \
@@ -56,22 +56,22 @@ else
local xdev='[skip directories on different filesystems]'
for pattern arg in \
'(freebsd|darwin)*' '-A[apparent size instead of usage]' \
- '(darwin*|*bsd*|dragonfly*|solaris2.<10->)' '(-H -L -P)-H[follow symlinks on the command line]' \
+ '(aix*|darwin*|*bsd*|dragonfly*|solaris2.<10->)' '(-H -L -P)-H[follow symlinks on the command line]' \
'(darwin|*bsd|dragonfly)*' '(-H -L -P)-P[do not follow symlinks (default)]' \
'(darwin|dragonfly|freebsd)*' '*-I+[ignore files/directories matching specified mask]:mask' \
'(darwin|*bsd|dragonfly)*' '(-a -s -d)-d+[display entry for directories up to specified depth]:depth' \
'(darwin*|*bsd*|dragonfly*|solaris2.<10->)' '(-k -m -g -B)-h[human readable output]' \
'netbsd*' '-i[output inode usage instead of blocks]' \
- '(darwin*|freebsd*|netbsd*|solaris2.<11->)' '(-h -k -g -B)-m[use block size of 1M-byte]' \
- '(darwin|freebsd<8->.|netbsd)*' '(-h -k -m -B)-g[use block size of 1G-byte]' \
+ '(aix*|darwin*|freebsd*|netbsd*|solaris2.<11->)' '(-h -k -g -B)-m[use block size of 1M-byte]' \
+ '(aix|darwin|freebsd<8->.|netbsd)*' '(-h -k -m -B)-g[use block size of 1G-byte]' \
'(freebsd|darwin)*' '(-h -k -m -g)-B+[block size]:block size (bytes)' \
'(darwin|*bsd|dragonfly)*' '-c[display grand total]' \
- '(freebsd|darwin)*' '-l[count sizes many times if hard linked]' \
+ '(aix|freebsd|darwin)*' '-l[count sizes many times if hard linked]' \
'(freebsd|netbsd)*' '-n[ignore files and directories with nodump flag set]' \
'solaris*' "(-a)-o[don't add child directories' usage to parent's total]" \
'(freebsd|darwin)*' '-t+[report only entries for which size exceeds threshold]:threshold' \
'solaris*' "-d$xdev" \
- '(darwin|*bsd|dragonfly|solaris)*' "-x$xdev"
+ '(aix|darwin|*bsd|dragonfly|solaris)*' "-x$xdev"
do
[[ $OSTYPE = $~pattern ]] && args+=( $arg )
done
diff --git a/Completion/Unix/Command/_entr b/Completion/Unix/Command/_entr
index 4fb984af2..ebd66ab72 100644
--- a/Completion/Unix/Command/_entr
+++ b/Completion/Unix/Command/_entr
@@ -13,6 +13,7 @@ _arguments -s -S \
'(*)-s[evaluate the first argument using interpreter specified by $SHELL]' \
'*-x[format custom exit status messages using a persistent awk(1) process]' \
'-z[exit after the utility completes]' \
+ '(- *)-h[display usage information]' \
'(-): :->command' \
'*::arguments:_normal' && ret=0
diff --git a/Completion/Unix/Command/_ffmpeg b/Completion/Unix/Command/_ffmpeg
index 9c91fe386..2cdeb02fe 100644
--- a/Completion/Unix/Command/_ffmpeg
+++ b/Completion/Unix/Command/_ffmpeg
@@ -1,200 +1,1525 @@
#compdef ffmpeg
-local curcontext="$curcontext" state line expl
-typeset -A opt_args
+# notes:
+# - stream/file options modify the input/output file argument that follows, so
+# ideally their arguments would be limited accordingly (e.g. -c would only
+# show encoders before an output file). but it seemed like being too 'smart'
+# about this could be very confusing/annoying. so we don't do that
-(( $+functions[_ffmpeg_presets] )) || _ffmpeg_presets() {
- local presets
- presets=(~/.ffmpeg/*.ffpreset(:t:r) "$FFMPEG_DATADIR"/*.ffpreset(:t:r))
- _wanted ffmpeg-presets expl 'preset' compadd -a presets
+# complete numeric argument
+(( $+functions[_ffmpeg_numbers] )) ||
+_ffmpeg_numbers() {
+ # most numeric args support these suffixes, even when it's nonsensical, e.g.
+ # -framerate 1KiB specifies 8192 fps. and most options that only accept
+ # integer args nonetheless need -f here because of this
+ _numbers -f "$@" {K,M,G}{,i}{,B}
}
-(( $+functions[_ffmpeg_acodecs] )) || _ffmpeg_acodecs() {
- local acodecs
- acodecs=(copy ${${(M)${(f)"$(_call_program audio-codecs $words[1] -codecs 2>/dev/null)"}:#[[:space:]][D[:space:]][E[:space:]]A[S[:space:]][D[:space:]][T[:space:]][[:space:]][^[:space:]]##*}//(#b)????????([^[:space:]]##)*/$match[1]})
- _wanted ffmpeg-audio-codecs expl 'force audio codec (''copy'' to copy stream)' compadd -a acodecs
+# `compadd -R` helper for _ffmpeg_flags
+(( $+functions[_ffmpeg_flags_remf] )) ||
+_ffmpeg_flags_remf() {
+ [[ $1 == 0 ]] || return
+ # swallow last char of inserted match if it was typed again
+ [[ $LBUFFER[-1] == $KEYS ]] && LBUFFER=${LBUFFER%?}
}
-(( $+functions[_ffmpeg_vcodecs] )) || _ffmpeg_vcodecs() {
- local vcodecs
- vcodecs=(copy ${${(M)${(f)"$(_call_program video-codecs $words[1] -codecs 2>/dev/null)"}:#[[:space:]][D[:space:]][E[:space:]]V[S[:space:]][D[:space:]][T[:space:]][[:space:]][^[:space:]]##*}//(#b)????????([^[:space:]]##)*/$match[1]})
- _wanted ffmpeg-video-codecs expl 'force video codec (''copy'' to copy stream)' compadd -a vcodecs
+# complete flag argument (flag1+flag2-flag3)
+# $1 ... => flag
+(( $+functions[_ffmpeg_flags] )) ||
+_ffmpeg_flags() {
+ local ret=1 tag=${curtag:-flags}
+ local -a expl ca_opts ca_x_opts flags
+ local -A opth
+
+ zparseopts -A opth -D -F - \
+ M+:=ca_opts {x+:,X+:}=ca_x_opts 1 2 F: J: n o: q r: R: s: S: V: \
+ || return
+
+ flags=( ${@:#${PREFIX//:/\\:}(|:*)} )
+
+ compset -S '[+-]*'
+ compset -P '*[+-]'
+
+ _describe -t $tag flag flags "${(@)ca_opts}" "${(@)ca_x_opts}" -S '' && ret=0
+
+ [[ $IPREFIX$PREFIX == *[+-] ]] || {
+ compset -P '*'
+ _wanted operators expl operator \
+ compadd "${(@)ca_opts}" -R _ffmpeg_flags_remf -S '' - + - && ret=0
+ }
+
+ return ret
}
-(( $+functions[_ffmpeg_scodecs] )) || _ffmpeg_scodecs() {
- local scodecs
- scodecs=(copy ${${(M)${(f)"$(_call_program subtitle-codecs $words[1] -codecs 2>/dev/null)"}:#[[:space:]][D[:space:]][E[:space:]]S[S[:space:]][D[:space:]][T[:space:]][[:space:]][^[:space:]]##*}//(#b)????????([^[:space:]]##)*/$match[1]})
- _wanted ffmpeg-subtitle-codecs expl 'force subtitle codec (''copy'' to copy stream)' compadd -a scodecs
+# helper to get stream type char from stream specifier in previous word. this
+# isn't quite accurate, but probably fine for most purposes
+# $1 => param to assign to
+(( $+functions[_ffmpeg_prev_ss_type] )) ||
+_ffmpeg_prev_ss_type() {
+ [[ $1 == (-|--) ]] && shift
+ case ${9::=${(Q)words[CURRENT-1]}} in
+ -[adsv]codec|-[av]f)
+ : ${(P)1::=${(U)9[2]}}
+ ;;
+ -(c|codec):(|*:*:)[adstvV](|:*)) ;&
+ -filter:(|*:*:)[avV](|:*))
+ 8=${(M)9##*:[adstvV](:|)}
+ 8=${${8%:}##*:}
+ : ${(P)1::=${(U)8}}
+ ;;
+ *) return 1 ;;
+ esac
}
-(( $+functions[_ffmpeg_formats] )) || _ffmpeg_formats() {
- local formats
- formats=(${(ou)${=${(s:,:)${${(M)${(f)"$(_call_program formats $words[1] -formats 2>/dev/null)"}:#[[:space:]][D[:space:]][E[:space:]][[:space:]][^[:space:]]##*}//(#b)????([^[:space:]]##)*/$match[1]}}}})
- _wanted ffmpeg-formats expl 'force format' compadd -a formats
+# complete stream specifier, usually after a colon-option like -c:
+(( $+functions[_ffmpeg_stream_specs] )) ||
+_ffmpeg_stream_specs() {
+ # does it make sense to allow e.g. -c:a:a:... ?
+ if compset -P '([adstvV]|g:([^i:]*|i:*)|(p|disp):*):'; then
+ _ffmpeg_stream_specs
+ elif compset -P 'g:(\#|\\\#|i:)'; then
+ _message 'group ID'
+ elif compset -P g:; then
+ _message 'group specifier'
+ elif compset -P p:; then
+ _message 'program ID'
+ elif compset -P '(\#|\\\#|i:)'; then
+ _message 'stream ID'
+ elif compset -P m:; then
+ _message 'metadata tag key[:value]'
+ elif compset -P disp:; then
+ _sequence -s+ _ffmpeg_dispositions -I
+ else
+ local ret=1
+ local -a ca_opts
+ local -A opth
+
+ zparseopts -A opth -D -F - \
+ {1+,2+,F+:,M+:,n+,o+:,q+,r+:,R+:,s+:,S+:}=ca_opts J: V: x: X: \
+ || return
+
+ _describe -t stream-specifier-types 'stream-type specifier' '(
+ a:"audio"
+ d:"data"
+ s:"subtitle"
+ t:"attachment"
+ v:"video (all)"
+ V:"video (not images)"
+ )' -qS: "${(@)ca_opts}" && ret=0
+ _describe -t stream-specifier-others 'other stream specifier' \
+ '(
+ g:"group index or ID"
+ i:"stream ID"
+ p:"program ID"
+ m:"metadata tag"
+ disp:"dispositions"
+ )' -qS: "${(@)ca_opts}" \
+ -- \
+ '(
+ u:"usable configuration"
+ )' "${(@)ca_opts}" && ret=0
+
+ return ret
+ fi
}
-(( $+functions[_ffmpeg_pix_fmts] )) || _ffmpeg_pix_fmts() {
- local pix_fmts
- _wanted ffmpeg-pix-fmts expl 'pixel format' compadd "$@" - \
- ${${${(M)${(f)"$(_call_program formats $words[1] -pix_fmts 2>/dev/null)"}:#[I.][O.][H.][P.][B.] [^=[:space:]]*}#* }%% *}
+# complete metadata specifier
+(( $+functions[_ffmpeg_metadata_specs] )) ||
+_ffmpeg_metadata_specs() {
+ if compset -P s:; then
+ _ffmpeg_stream_specs
+ elif compset -P c:; then
+ _message 'chapter index'
+ elif compset -P p:; then
+ _message 'program index'
+ else
+ _describe -t metadata-specs 'metadata specifier' \
+ '(
+ c:"per-chapter metadata"
+ p:"per-program metadata"
+ s:"per-stream metadata"
+ )' -qS: \
+ -- \
+ '(
+ g:"global metadata"
+ )'
+ fi
}
-(( $+functions[_ffmpeg_bsfs] )) || _ffmpeg_bsfs() {
- local bsfs
- bsfs=(${${(f)"$(_call_program bsfs $words[1] -bsfs 2>/dev/null)"}:#*:})
- _wanted ffmpeg-bsfs expl 'set bitstream filter' compadd -a bsfs
+# complete preset name
+(( $+functions[_ffmpeg_presets] )) ||
+_ffmpeg_presets() {
+ local -a presets=(
+ ~/.ffmpeg
+ $FFMPEG_DATADIR
+ ${${${${(Q)words[1]}:c}%/bin/*}:-/usr}/share/ffmpeg
+ )
+ presets=( $^presets/*.ffpreset(N:t:r) )
+ _wanted presets expl preset compadd "$@" -a presets
}
-typeset -A _ffmpeg_flags
+# complete codec or encoder/decoder (-codec et al accept either)
+# -D => decoders, -E => encoders, -T => type (audio, video, etc)
+(( $+functions[_ffmpeg_codecs] )) ||
+_ffmpeg_codecs() {
+ local ret=1 de=DE de_desc=encoder/decoder type=ADSTV type_desc
+ local -a ca_opts codecs encdecs
+ local -A opth
+
+ zparseopts -A opth -D -F - \
+ {1+,2+,F+:,M+:,n+,o+:,q+,r+:,R+:,s+:,S+:,x+:,X+:}=ca_opts J: V: \
+ D E T: \
+ || return
+
+ case ${(L)opth[-T]} in
+ a|aud*) type=A ;;
+ d|dat*) type=D ;;
+ s|sub*) type=S ;;
+ t|att*) type=T ;;
+ v|vid*) type=V ;;
+ *) _ffmpeg_prev_ss_type type ;;
+ esac
+ case $type in
+ A) type_desc=audio ;;
+ D) type_desc=data ;;
+ S) type_desc=subtitle ;;
+ T) type_desc=attachment ;;
+ V) type_desc=video ;;
+ esac
+
+ if (( ${+opth[-D]} )); then
+ de=D de_desc=decoder
+ elif (( ${+opth[-E]} )); then
+ de=E de_desc=encoder
+ fi
+
+ codecs=( ${(f)"$( _call_program codecs $words[1] -codecs )"} )
+ codecs=( ${(M)codecs:# [ADILSTV. ](#c6) [^=]* *} )
+ [[ $de == *D* ]] || codecs=( ${codecs:# D?*} )
+ [[ $de == *E* ]] || codecs=( ${codecs:# ?E*} )
+ codecs=( ${(M)codecs:# ??[$type]??? *} )
+ codecs=( ${codecs# ?????? } )
+
+ # -decoders and -encoders don't include data/attachment
+ [[ $type == *[ASV]* ]] && {
+ [[ $de == *D* ]] &&
+ encdecs+=( ${(f)"$( _call_program decoders $words[1] -decoders )"} )
+ [[ $de == *E* ]] &&
+ encdecs+=( ${(f)"$( _call_program encoders $words[1] -encoders )"} )
+
+ encdecs=( ${(M)encdecs:# [$type][ABDFSVX. ](#c5) [^=]* *} )
+ encdecs=( ${encdecs# ?????? } )
+ }
+
+ if zstyle -t ":completion:$curcontext:$tag" verbose; then
+ codecs=( ${codecs%%[[:space:]]##\((decoders#|encoders#):*} )
+ codecs=( ${${(@)codecs//:/\\:}/[[:space:]]##/:} )
+ # _describe doesn't remove duplicates when there are descriptions
+ encdecs=( ${(u)encdecs} )
+ encdecs=( ${${(@)encdecs//:/\\:}/[[:space:]]##/:} )
+ else
+ codecs=( ${codecs%%[[:space:]]*} )
+ encdecs=( ${encdecs%%[[:space:]]*} )
+ fi
-(( $+functions[_ffmpeg_flag_options] )) || _ffmpeg_flag_options() {
- local expl
- _wanted options expl 'flag' compadd -S '' -- {-,+}${^flag_options}
+ _describe -t codecs "${type_desc:+$type_desc }codec" \
+ codecs "${(@)ca_opts}" && ret=0
+ _describe -t encoders-decoders "${type_desc:+$type_desc }$de_desc" \
+ encdecs "${(@)ca_opts}" && ret=0
+ [[ $de == *E* && ${(Q)words[CURRENT-1]} == -(c|[adsv]#codec)(|:*) ]] &&
+ _describe -t codecs-special 'copy option' '( copy:"copy stream" )' && ret=0
+
+ return ret
}
-(( $+functions[_ffmpeg_more_flag_options] )) || _ffmpeg_more_flag_options() {
- compset -p $1 && _ffmpeg_flag_options
+# complete format/muxer/demuxer/device
+# -D => demuxer, -E => muxer, -v => device
+(( $+functions[_ffmpeg_formats] )) ||
+_ffmpeg_formats() {
+ local dde=dDE tag=formats desc=format
+ local -a ca_opts tmp formats
+ local -A opth
+
+ zparseopts -A opth -D -F - \
+ {1+,2+,F+:,J+:,M+:,n+,o+:,q+,r+:,R+:,s+:,S+:,V+:,x+:,X+:}=ca_opts \
+ D E v \
+ || return
+
+ if (( ${+opth[-D]} )); then
+ dde=D tag=demuxers desc=demuxer
+ elif (( ${+opth[-E]} )); then
+ dde=E tag=muxers desc=muxer
+ elif (( ${+opth[-v]} )); then
+ dde=d tag=devices desc=device
+ fi
+
+ tmp=( ${(f)"$( _call_program formats $words[1] -formats )"} )
+ tmp=( ${(M)tmp:# [dDE. ](#c3) [^=]* *} )
+ [[ $dde == *D* ]] && formats+=( ${(M)tmp:# D?? *} )
+ [[ $dde == *E* ]] && formats+=( ${(M)tmp:# ?E? *} )
+ [[ $dde == *d* ]] && formats+=( ${(M)tmp:# ??d *} )
+ formats=( ${formats# ??? } )
+
+ # some formats have multiple descriptions, e.g. 'matroska:Matroska' and
+ # 'matroska:Matroska / WebM'. ideally we would merge these together somehow
+ if zstyle -t ":completion:$curcontext:$tag" verbose; then
+ local f d
+ tmp=( ${${(@)formats//:/\\:}/[[:space:]]##/:} )
+ formats=( )
+ for f in $tmp; do
+ d=${f#*:} f=${f%%:*}
+ formats+=( ${^${(@s<,>)f}}:$d )
+ done
+ formats=( ${(u)formats} )
+
+ else
+ formats=( ${(@s<,>)${(@)formats%%[[:space:]]*}} )
+ fi
+
+ _describe -t $tag $desc formats "${(@)ca_opts}"
}
-(( $+functions[_ffmpeg_new_flag_options] )) || _ffmpeg_new_flag_options() {
- compset -P '*' && _ffmpeg_flag_options
+# complete bitstream filter
+# -I => single bsf
+(( $+functions[_ffmpeg_bsfs] )) ||
+_ffmpeg_bsfs() {
+ local tag=bsfs desc='bitstream filter'
+ local -a ca_opts expl bsfs
+ local -A opth
+
+ zparseopts -A opth -D -F - \
+ {1+,2+,F+:,J+:,M+:,n+,o+:,q+,r+:,R+:,s+:,S+:,V+:,x+:,X+:}=ca_opts \
+ I \
+ || return
+
+ bsfs=( ${(f)"$( _call_program $tag $words[1] -bsfs )"} )
+ bsfs=( ${bsfs##[[:space:]]##} )
+ bsfs=( ${bsfs:#*:} )
+
+ if (( ${+opth[-I]} )); then
+ _describe -t $tag $desc bsfs "${(@)ca_opts}"
+ else
+ _wanted $tag expl '' _values -s, -S= $desc \
+ $^bsfs':bsf option (opt1=val1\:opt2=val2\:...):'
+ fi
}
-(( $+functions[_ffmpeg_flags] )) || _ffmpeg_flags() {
- local -a flag_options
- eval "flag_options=(\${=_ffmpeg_flags[$1]})"
+# complete pixel format / hwaccel output format
+# -H => hwaccel formats only
+(( $+functions[_ffmpeg_pix_fmts] )) ||
+_ffmpeg_pix_fmts() {
+ local tag=pixel-formats desc='pixel format'
+ local -a ca_opts pixfmts
+ local -A opth
- local match mbegin mend
- integer ret=1
+ zparseopts -A opth -D -F - \
+ {1+,2+,F+:,J+:,M+:,n+,o+:,q+,r+:,R+:,s+:,S+:,V+:,x+:,X+:}=ca_opts \
+ H \
+ || return
- if [[ $PREFIX = (#b)(*)[-+]([^-+]#) ]]; then
- if [[ -n ${flag_options[(R)$match[2]]} ]]; then
- _ffmpeg_new_flag_options && ret=0
- fi
- if [[ -n ${flag_options[(R)$match[2]?*]} ]]; then
- _ffmpeg_more_flag_options ${#match[1]} && ret=0
- fi
- else
- _ffmpeg_flag_options && ret=0
- fi
+ pixfmts=( ${(f)"$( _call_program $tag $words[1] -pix_fmts )"} )
+ pixfmts=( ${(M)pixfmts:#[BHIOP. ](#c5) [^=]* *} )
- return ret
+ (( ${+opth[-H]} )) && {
+ tag=hwaccel-formats desc='output format'
+ pixfmts=( ${(M)pixfmts:#??H?? *} )
+ }
+
+ pixfmts=( ${pixfmts#????? *} )
+ pixfmts=( ${pixfmts%%[[:space:]]*} )
+
+ (( ${+opth[-H]} )) || {
+ compset -P + || pixfmts+=( + )
+ }
+
+ _describe -t $tag $desc pixfmts "${(@)ca_opts}"
}
-(( $+functions[_ffmpeg_register_lastopt_values] )) || _ffmpeg_register_lastopt_values() {
- if (( lastopt_takesargs )); then
- lastopt+=":$lastopt_description:"
- if (( $#lastopt_values )); then
- if [[ $lastopt_type == flags ]]; then
- lastopt="*$lastopt"
- flagtype=${${lastopt%%:*}#-}
- lastopt+="->$flagtype"
- _ffmpeg_flags[$flagtype]="${lastopt_values[*]}"
- else
- lastopt+="(${lastopt_values[*]})"
- fi
- fi
- fi
- _ffmpeg_argspecs+=$lastopt
+# complete filter
+(( $+functions[_ffmpeg_filters] )) ||
+_ffmpeg_filters() {
+ local MATCH MBEGIN MEND x y z tag=filters desc=filter type=AV
+ local -a ca_opts tmp filters
+ local -A opth
+
+ zparseopts -A opth -D -F - \
+ {1+,2+,F+:,J+:,M+:,n+,o+:,q+,r+:,R+:,s+:,S+:,V+:,x+:,X+:}=ca_opts \
+ T: \
+ || return
+
+ case ${(L)opth[-T]} in
+ a|aud*) type=A ;;
+ v|vid*) type=V ;;
+ *) _ffmpeg_prev_ss_type type ;;
+ esac
+ case $type in
+ A) tag=audio-$tag desc="audio $desc" ;;
+ V) tag=video-$tag desc="video $desc" ;;
+ esac
+
+ tmp=( ${(f)"$( _call_program filters $words[1] -filters )"} )
+ tmp=( ${(M)tmp:#*-\>*} )
+ tmp=( ${tmp# ?? } )
+ tmp=( ${tmp/[ ]##/$'\t'} )
+ tmp=( ${tmp/[ ]##/$'\t'} )
+
+ for x y z in "${(@ps<\t>)tmp}"; do
+ [[ ${y//[N$type]/} == $y ]] ||
+ filters+=( $x:${z//:/\\:} )
+ done
+
+ if zstyle -t ":completion:$curcontext:$tag" verbose; then
+ # undo sentence case/punctuation
+ filters=( ${filters%.} )
+ filters=( ${filters/(#m):[A-Z][a-z]/${(L)MATCH}} )
+ else
+ filters=( ${filters%%:*} )
+ fi
+
+ _describe -t $tag $desc filters "${(@)ca_opts}"
+}
+
+# complete filtergraph spec
+(( $+functions[_ffmpeg_filtergraphs] )) ||
+_ffmpeg_filtergraphs() {
+ # [link][link] fltr@id=val:key=val:val, fltr@id [link]; fltr=val; ...
+ compset -P '*[];,]'
+ compset -P '[[:space:]]##'
+ compset -S '[;,[]*'
+ compset -S '[[:space:]]##'
+
+ if compset -P '*\['; then
+ _message 'link label'
+ elif compset -P '*='; then
+ _message 'filter arguments ([key=]val:[key=]val:...)'
+ elif compset -P '*@'; then
+ _message 'filter ID'
+ else
+ _ffmpeg_filters -r$'@=,[; \t\n\-' -S,
+ fi
+}
+
+# complete protocol
+(( $+functions[_ffmpeg_protocols] )) ||
+_ffmpeg_protocols() {
+ local tag=protocols desc=protocol
+ local -a protocols
+
+ protocols=( ${(f)"$( _call_program $tag $words[1] -protocols )"} )
+ protocols=( ${protocols:#*:*} )
+ protocols=( ${protocols##[[:space:]]##} )
+
+ _describe -t $tag $desc protocols "$@"
+}
+
+# complete standard or custom channel layout
+(( $+functions[_ffmpeg_layouts] )) ||
+_ffmpeg_layouts() {
+ local ret=1
+ local -a tmp names layouts
+
+ tmp=( ${(f)"$( _call_program layouts $words[1] -layouts )"} )
+ tmp=( ${tmp##[[:space:]]##} )
+
+ names=( ${tmp[1,(R)*(#i)layouts*:*]} )
+ names=( ${names:#(#i)*(NAME[[:space:]]##D|(channel|layout)*:)*} )
+ names=( ${^${names/[[:space:]]##/\[}}\] )
+ names=( $^names':custom name' )
+
+ layouts=( ${tmp[(R)*(#i)layouts*:*,-1]} )
+ layouts=( ${layouts:#(#i)*(NAME[[:space:]]##D|layouts*:)*} )
+ layouts=( ${layouts//:/\\:} )
+ layouts=( ${layouts/[[:space:]]##/:} )
+
+ [[ $PREFIX == *[@+]* ]] || {
+ _describe -t channel-layouts 'standard channel layout' layouts && ret=0
+ }
+ _values -s+ -S@ 'channel name' $names && ret=0
+
+ return ret
}
-local -a _ffmpeg_argspecs
-{
- local lastopt REPLY
- local lastopt_description
- local lastopt_takesargs
- local lastopt_type
- local -a lastopt_values
+# complete sample format
+(( $+functions[_ffmpeg_sample_fmts] )) ||
+_ffmpeg_sample_fmts() {
+ local tag=sample-formats desc='sample format'
+ local -a sample_fmts
+
+ sample_fmts=( ${(f)"$( _call_program $tag $words[1] -sample_fmts )"} )
+ sample_fmts=( ${sample_fmts:#*(:|name[[:space:]]##desc)*} )
+ sample_fmts=( ${sample_fmts##[[:space:]]##} )
+ sample_fmts=( ${sample_fmts%%[[:space:]]*} )
+
+ _describe -t $tag $desc sample_fmts "$@"
+}
+
+# complete hardware acceleration method
+# -T => types only
+(( $+functions[_ffmpeg_hwaccels] )) ||
+_ffmpeg_hwaccels() {
+ local tag=hwaccels desc='hardware acceleration method'
+ local -a ca_opts hwaccels
+ local -A opth
+
+ zparseopts -A opth -D -F - \
+ {1+,2+,F+:,J+:,M+:,n+,o+:,q+,r+:,R+:,s+:,S+:,V+:,x+:,X+:}=ca_opts \
+ T \
+ || return
+
+ hwaccels=( ${(f)"$( _call_program $tag $words[1] -hwaccels )"} )
+ hwaccels=( ${hwaccels##[[:space:]]##} )
+ hwaccels=( ${hwaccels:#*:*} )
+
+ (( ${+opth[-T]} )) || hwaccels+=( none auto )
+
+ _describe -t $tag $desc hwaccels "${(@)ca_opts}"
+}
+
+# complete hardware devices
+(( $+functions[_ffmpeg_hw_devices] )) ||
+_ffmpeg_hw_devices() {
+ local i tag=hardware-devices desc='hardware device'
+ local -a ca_opts devices
+ local -A opth
+
+ zparseopts -A opth -D -F - \
+ {1+,2+,F+:,M+:,n+,o+:,q+,r+:,R+:,s+:,S+:,x+:,X+:}=ca_opts J: V: \
+ || return
+
+ for (( i = 2; i <= CURRENT; i++ )); do
+ [[ ${(Q)words[i]} == -init_hw_device ]] || continue
+ devices+=( ${${${(Q)words[i+1]}#*=}%@*} )
+ (( i++ ))
+ done
+
+ # exclude name in current arg
+ [[ ${(Q)words[CURRENT-1]} == -init_hw_device ]] &&
+ [[ ${i::=$IPREFIX$PREFIX} == *=* ]] &&
+ devices=( ${devices:#${${i%%[@:,]*}#*=}} )
- _call_program options $words[1] -h 2>/dev/null | while IFS=$'\n' read -r; do
- if [[ $REPLY == -* ]]; then
- [[ -n $lastopt ]] && _ffmpeg_register_lastopt_values
- lastopt=${REPLY%%[[:space:]]*}
- lastopt_description=${REPLY##-[^[:space:]]##[[:space:]]##}
- if [[ $lastopt_description == (#b)'<'(?##)'>'* ]]; then
- lastopt_type=$match[1]
- lastopt_description=${lastopt_description##<[^[:space:]]##>[[:space:]]##[^[:space:]]##[[:space:]]#}
- if [[ -z $lastopt_description ]]; then
- lastopt_description=$lastopt
- fi
- lastopt_description=${lastopt_description//:/\\:}
- elif [[ $lastopt_description == [^[:space:]]##[[:space:]][[:space:]]* ]]; then
- local example=${lastopt_description%% *}
- example=${example//:/\\:}
- lastopt_description=${lastopt_description##[^[:space:]]##[[:space:]]##}
- lastopt_description=${lastopt_description//:/\\:}
- if [[ $example == filename ]]; then
- lastopt_takesargs=0
- lastopt+=":${lastopt_description}:_files"
- elif [[ $lastopt == -[asv]pre ]]; then
- lastopt_takesargs=0
- lastopt="*$lastopt"
- lastopt+=": :_ffmpeg_presets"
- elif [[ $lastopt == -acodec ]]; then
- lastopt_takesargs=0
- lastopt+=": :_ffmpeg_acodecs"
- elif [[ $lastopt == -vcodec ]]; then
- lastopt_takesargs=0
- lastopt+=": :_ffmpeg_vcodecs"
- elif [[ $lastopt == -scodec ]]; then
- lastopt_takesargs=0
- lastopt+=": :_ffmpeg_scodecs"
- elif [[ $lastopt == -f ]]; then
- lastopt_takesargs=0
- lastopt="*$lastopt"
- lastopt+=": :_ffmpeg_formats"
- elif [[ $lastopt == -pix_fmt ]]; then
- lastopt_takesargs=0
- lastopt="*$lastopt"
- lastopt+=":set pixel format:_ffmpeg_pix_fmts"
- elif [[ $example == bitstream_filter ]]; then
- lastopt_takesargs=0
- lastopt+=": :_ffmpeg_bsfs"
- else
- lastopt_takesargs=1
- lastopt_description+=" ($example)"
- fi
- else
- lastopt_takesargs=0
- if [[ $lastopt == -vfilters ]]; then
- lastopt+=": :->vfilters"
- fi
- fi
- lastopt_values=()
- elif [[ $REPLY == ' '* ]]; then
- REPLY=${REPLY##[[:space:]]##}
- REPLY=${REPLY%%[[:space:]]##*}
- lastopt_takesargs=1
- lastopt_values+=$REPLY
- fi
+ _alternative -O ca_opts \
+ "$tag:$desc:( ${(j< >)${(@q+)devices}} )" \
+ "$tag:$desc:_ffmpeg_hwaccels -T"
+}
+
+# complete hardware devices init spec
+(( $+functions[_ffmpeg_hw_device_inits] )) ||
+_ffmpeg_hw_device_inits() {
+ local -a expl
+ if compset -P '*,*=' && [[ $PREFIX != *,* ]]; then
+ _wanted values expl 'device parameter value' _files -qS,
+ elif compset -P '*,'; then
+ _message 'device parameter (key=val)'
+ elif compset -P '*@'; then
+ _ffmpeg_hw_devices
+ elif compset -P '*:'; then
+ _wanted devices expl device _files -qS,
+ elif compset -P '*='; then
+ _message 'hardware device name'
+ else
+ _ffmpeg_hwaccels -T -qS=
+ fi
+}
+
+# complete input/output devices
+(( $+functions[_ffmpeg_devices] )) ||
+_ffmpeg_devices() {
+ local de=DE tag=devices desc=device
+ local -a ca_opts tmp devices
+ local -A opth
+
+ zparseopts -A opth -D -F - \
+ {1+,2+,F+:,J+:,M+:,n+,o+:,q+,r+:,R+:,s+:,S+:,V+:,x+:,X+:}=ca_opts \
+ D E \
+ || return
+
+ if (( ${+opth[-D]} )); then
+ de=D tag=input-$tag desc="input $desc"
+ elif (( ${+opth[-E]} )); then
+ de=E tag=output-$tag desc="output $desc"
+ fi
+
+ tmp=( ${(f)"$( _call_program devices $words[1] -devices )"} )
+ tmp=( ${(M)tmp:# [DE. ](#c2) [^=]* *} )
+
+ [[ $de == *D* ]] && devices+=( ${(M)tmp:# D? *} )
+ [[ $de == *E* ]] && devices+=( ${(M)tmp:# ?E *} )
+ devices=( ${devices# ?? } )
+
+ if zstyle -t ":completion:$curcontext:$tag" verbose; then
+ local f d
+ tmp=( ${${(@)devices//:/\\:}/[[:space:]]##/:} )
+ devices=( )
+ for f in $tmp; do
+ d=${f#*:} f=${f%%:*}
+ devices+=( ${^${(@s<,>)f}}:$d )
done
- [[ -n $lastopt ]] && _ffmpeg_register_lastopt_values
+ devices=( ${(u)devices} )
+
+ else
+ devices=( ${(@s<,>)${(@)devices%%[[:space:]]*}} )
+ fi
+
+ _describe -t $tag $desc devices "${(@)ca_opts}"
+}
+
+# complete disposition flags
+# -I => single disposition
+(( $+functions[_ffmpeg_dispositions] )) ||
+_ffmpeg_dispositions() {
+ local tag=dispositions desc='disposition flag'
+ local -a ca_opts expl dispositions
+ local -A opth
+
+ zparseopts -A opth -D -F - \
+ {1+,2+,F+:,J+:,M+:,n+,o+:,q+,r+:,R+:,s+:,S+:,V+:,x+:,X+:}=ca_opts \
+ I \
+ || return
+
+ dispositions=( ${(f)"$( _call_program $tag $words[1] -dispositions )"} )
+ dispositions=( ${dispositions:#*:*} )
+ dispositions=( ${dispositions##[[:space:]]##} )
+
+ if (( ${+opth[-I]} )); then
+ _describe -t $tag $desc dispositions "${(@)ca_opts}"
+ else
+ _wanted $tag expl $desc _ffmpeg_flags "${(@)ca_opts}" - $dispositions
+ fi
+}
+
+# complete stats format spec
+(( $+functions[_ffmpeg_stats_fmt_specs] )) ||
+_ffmpeg_stats_fmt_specs() {
+ local bs
+
+ compset -S '[{[[:space:]]*'
+ compset -P '*[}[[:space:]]'
+
+ [[ -n $compstate[quote] ]] || bs=\\
+
+ argv=( -r'}\-' -S"$bs}" "$@" )
+ compset -P '*{' || argv=( -P"$bs{" "$@" )
+
+ _describe -t stats-format-spec-directives 'stats format spec directive' '(
+ fidx:"index of output file"
+ sidx:"index of output stream in file"
+ n:"frame number"
+ ni:"input frame number"
+ tb:"time base for time stamps of frame/packet"
+ tbi:"timebase for ptsi"
+ pts:"presentation time stamp of frame/packet"
+ ptsi:"presentation time stamp of input frame (ni)"
+ t:"presentation time of frame/packet"
+ ti:"presentation time of input frame (ni)"
+ dts:"decoding time stamp of packet"
+ dt:"decoding time of frame/packet (dts*tb)"
+ sn:"number of audio samples sent to encoder"
+ samp:"number of audio samples in frame"
+ size:"size of packet (bytes)"
+ br:"current bit rate (bps)"
+ abr:"average bit rate of whole stream (bps)"
+ key:"K if packet contains key frame, N otherwise"
+ )' "$@"
+}
+
+# complete vsync method / frame-rate mode
+(( $+functions[_ffmpeg_fps_modes] )) ||
+_ffmpeg_fps_modes() {
+ _describe -t fps-modes 'frame-rate mode [auto]' '(
+ passthrough:"pass through frames unmodified"
+ cfr:"duplicate or drop frames to achieve constant frame rate"
+ vfr:"pass through or drop frames to achieve variable frame rate"
+ auto:"choose cfr or vfr based on muxer capabilities"
+ )' "$@"
+}
+
+# complete video-size abbreviation
+(( $+functions[_ffmpeg_video_sizes] )) ||
+_ffmpeg_video_sizes() {
+ _describe -t video-sizes 'video size abbreviation (or WxH)' '(
+ ntsc:720x480 pal:720x576 qntsc:352x240 qpal:352x288
+ sntsc:640x480 spal:768x576 film:352x240 ntsc-film:352x240
+ sqcif:128x96 qcif:176x144 cif:352x288 4cif:704x576
+ 16cif:1408x1152 qqvga:160x120 qvga:320x240 vga:640x480
+ svga:800x600 xga:1024x768 uxga:1600x1200 qxga:2048x1536
+ sxga:1280x1024 qsxga:2560x2048 hsxga:5120x4096 wvga:852x480
+ wxga:1366x768 wsxga:1600x1024 wuxga:1920x1200 woxga:2560x1600
+ wqsxga:3200x2048 wquxga:3840x2400 whsxga:6400x4096
+ whuxga:7680x4800 cga:320x200 ega:640x350 hd480:852x480
+ hd720:1280x720 hd1080:1920x1080 2k:2048x1080 2kflat:1998x1080
+ 2kscope:2048x858 4k:4096x2160 4kflat:3996x2160
+ 4kscope:4096x1716 nhd:640x360 hqvga:240x160 wqvga:400x240
+ fwqvga:432x240 hvga:480x320 qhd:960x540 2kdci:2048x1080
+ 4kdci:4096x2160 uhd2160:3840x2160 uhd4320:7680x4320
+ )' "$@"
}
-_arguments -C -S \
- "${_ffmpeg_argspecs[@]}" \
- '*:output file:_files' \
- && return
+# complete map data source
+(( $+functions[_ffmpeg_map_sources] )) ||
+_ffmpeg_map_sources() {
+ compset -P -
+
+ if compset -P '*:view:'; then
+ _message 'view ID'
+ elif compset -P '*:vidx:'; then
+ _message 'view index'
+ elif compset -P '*:vpos:'; then
+ _describe -t view-positions 'view position' '(left right)'
+ elif compset -P 1 '*:'; then
+ local ret=1
+ # this isn't quite right
+ compset -P '<->:' ||
+ compset -P '[astvV](:(?|[\\#]##[^:]##))#:' ||
+ compset -P 'g:(i:|)[\\#]#[^:]##:' ||
+ compset -P 'p:[^:]##(|:(?|[\\#]##[^:]##))#:' ||
+ compset -P '([\\#]##|i:)[^:]##:' ||
+ compset -P 'm:[^:]##:' || # how can this have a value here?
+ compset -P 'disp:[^:]##:' ||
+ compset -P u:
+ _ffmpeg_stream_specs -qS: && ret=0
+ _describe -t view-specifiers 'view specifier' '(
+ view:"view ID"
+ vidx:"view index"
+ vpos:"view position"
+ )' -qS: && ret=0
+ return ret
+ else
+ _message \
+ 'map source ([-]input_file_id[:stream_specifier][:view_specifier][:?])'
+ fi
+}
+
+# complete program spec
+(( $+functions[_ffmpeg_program_specs] )) ||
+_ffmpeg_program_specs() {
+ local x
+ local -a kvs keys=(
+ 'title:program title'
+ 'program_num:program number'
+ 'st:stream index'
+ )
+ for x in $keys; do
+ kvs+=( "${x%%:*}[${${x#*:}%%:*}]:${x#*:}" )
+ done
+
+ # it doesn't seem like these need to be given in order
+ compset -P '*:'
+ _values -s: -S= 'program specifier (key=val:key=val:...)' $kvs
+}
+
+# complete stream-group spec
+(( $+functions[_ffmpeg_stream_group_specs] )) ||
+_ffmpeg_stream_group_specs() {
+ local x
+ local -a kvs keys=(
+ 'map:input-group mapping'
+ 'type:stream-group type:( iamf_audio_element iamf_mix_presentation )'
+ 'st:stream index'
+ 'stg:stream group'
+ 'id:stream-group ID'
+ )
+ for x in $keys; do
+ kvs+=( "${x%%:*}[${${x#*:}%%:*}]:${x#*:}" )
+ done
+
+ # @todo we should complete these. it's annoying because some use ':' for their
+ # own values
+ compset -P '*,' && {
+ _message 'type option'
+ return
+ }
+
+ # it doesn't seem like these need to be given in order. except maybe the type
+ # options?
+ compset -P '*:'
+ _values -s: -S= 'stream-group specifier (key=val:key=val:...)' $kvs
+}
+
+# complete key-frame force condition
+(( $+functions[_ffmpeg_kf_force_conds] )) ||
+_ffmpeg_kf_force_conds() {
+ if compset -P expr:; then
+ _message expression
+ elif compset -P '*[0-9,]*'; then
+ _message 'time stamps (time[,time...])'
+ else
+ _describe -t kf-force-conditions 'when to force key frame (or time stamps)' \
+ '(
+ source:"when source frame is marked as key frame"
+ scd_metadata:"when frame has metadata entry lavfi.scd.time"
+ )' \
+ -- \
+ '( expr:"when evaluated expression is non-zero" )' -qS:
+ fi
+}
+
+# complete log-level flag
+(( $+functions[_ffmpeg_loglevels] )) ||
+_ffmpeg_loglevels() {
+ local -a levels=(
+ quiet panic fatal error warning info verbose debug trace
+ )
+ compset -P "(|*+)(${(j<|>)${(@b)levels}})" && return
+ _alternative \
+ "levels:logging level:_ffmpeg_flags - ${(j< >)${(@q+)levels}}" \
+ 'flags: :_ffmpeg_flags - repeat level time datetime'
+}
+
+# complete date spec
+(( $+functions[_ffmpeg_dates] )) ||
+_ffmpeg_dates() {
+ _message -e dates \
+ 'date ([(YYYY-MM-DD|YYYYMMDD)[T|t| ]]((HH:MM:SS[.m]]])|(HHMMSS[.m]]]))[Z]) (or now)'
+}
+
+# complete duration spec
+(( $+functions[_ffmpeg_durations] )) ||
+_ffmpeg_durations() {
+ _message -e durations 'duration ([-][HH:]MM:SS[.m] or [-]S+[.m][s|ms|us])'
+}
+
+# complete compare functions
+(( $+functions[_ffmpeg_cmp_functions] )) ||
+_ffmpeg_cmp_functions() {
+ _describe -t compare-functions 'compare function' '(
+ sad sse satd dct psnr bit rd zero vsad vsse nsse w53 w97 dctmax
+ chroma msad
+ )' "$@"
+}
+
+# complete frame discard methods
+(( $+functions[_ffmpeg_discard_methods] )) ||
+_ffmpeg_discard_methods() {
+ _describe -t discard-methods 'frame discard method' '(
+ none:"no frames"
+ default:"useless frames"
+ noref:"non-reference frames"
+ bidir:"bi-directional frames"
+ nointra:"all except I frames"
+ nokey:"all except key frames"
+ all:"all frames"
+ )' "$@"
+}
+
+# complete -help topic
+(( $+functions[_ffmpeg_help_topics] )) ||
+_ffmpeg_help_topics() {
+ if compset -P decoder=; then
+ _ffmpeg_codecs -D
+ elif compset -P encoder=; then
+ _ffmpeg_codecs -E
+ elif compset -P demuxer=; then
+ _ffmpeg_formats -D
+ elif compset -P muxer=; then
+ _ffmpeg_formats -E
+ elif compset -P filter=; then
+ _ffmpeg_filters
+ elif compset -P bsf=; then
+ _ffmpeg_bsfs -I
+ elif compset -P protocol=; then
+ _ffmpeg_protocols
+ else
+ _describe -t help-topics 'help topic' \
+ '(
+ long:"basic and advanced tool options"
+ full:"all options"
+ )' \
+ -- \
+ '(
+ decoder:"specified decoder"
+ encoder:"specified encoder"
+ demuxer:"specified demuxer"
+ muxer:"specified muxer"
+ filter:"specified filter"
+ bsf:"specified bitstream filter"
+ protocol:"specified protocol"
+ )' -qS=
+ fi
+}
+
+local MATCH MBEGIN MEND x y z no
+local -a ss_opts ms_opts basic_opts expert_opts gen_avo_opts opts tmp
+
+# names of options that support optional :stream_specifier form
+ss_opts=(
+ ac apad apply_cropping ar aspect autorotate autoscale b
+ bits_per_raw_sample bsf c canvas_size ch_layout channel_layout
+ chroma_intra_matrix codec copyinkf copypriorss discard
+ display_hflip display_rotation display_vflip disposition
+ drop_changed dump_attachment enc_time_base filter filter_script
+ fix_sub_duration fix_sub_duration_heartbeat force_fps
+ force_key_frames fps_mode fpsmax frames guess_layout_max hwaccel
+ hwaccel_device hwaccel_output_format inter_matrix intra_matrix
+ itsscale max_muxing_queue_size muxing_queue_data_threshold pass
+ passlogfile pix_fmt pre q qscale r rc_override reinit_filter s
+ sample_fmt stats_enc_post stats_enc_post_fmt stats_enc_pre
+ stats_enc_pre_fmt stats_mux_pre stats_mux_pre_fmt tag threads
+ time_base top
+)
+
+# names of options that support optional :metadata_specifier form
+ms_opts=( metadata map_metadata )
+
+# option specs are grouped and ordered per `ffmpeg -help full` output. the
+# separate arrays probably aren't necessary, but i was keeping track of it
+# anyway, and maybe it'll be useful in the future
+
+# note: in order for the replacements below to work reliably, all specs must
+# have descriptions ('-o[desc]'), and colons must not be omitted after optarg
+# descriptions: '-o[desc]:argdesc:', NOT '-o[desc]:argdesc'
+
+# basic information/capability options
+basic_opts+=(
+ '(- : *)'{-L,-license}'[display licence information]'
+ '(- : *)'{-h,-help,--help}'[display help information]:: :_ffmpeg_help_topics'
+ '!(- : *)-?[]:: :_ffmpeg_help_topics' # annoying
+ '(- : *)-version[display version information]'
+ '(- : *)-muxers[display available muxers]'
+ '(- : *)-demuxers[display available demuxers]'
+ '(- : *)-devices[display available devices]'
+ '(- : *)-decoders[display available decoders]'
+ '(- : *)-encoders[display available encoders]'
+ '(- : *)-filters[display available filters]'
+ '(- : *)-pix_fmts[display available pixel formats]'
+ '(- : *)-layouts[display channel names and standard channel layouts]'
+ '(- : *)-sample_fmts[display available sample formats]'
+)
+# advanced information/capability options
+expert_opts+=(
+ '(- : *)-buildconf[display build configuration]'
+ '(- : *)-formats[display available formats]'
+ '(- : *)-codecs[display available codecs]'
+ '(- : *)-bsfs[display available bitstream filters]'
+ '(- : *)-protocols[display available protocols]'
+ '(- : *)-dispositions[display stream dispositions]'
+ '(- : *)-colors[display recognised colours]'
+ '(- : *)-sources[display input sources (specify device)]:: :{
+ compset -S ",*"
+ if compset -P "*,"; then
+ _message "input device option (opt1=val1,opt2=val2,...)"
+ else
+ _ffmpeg_devices -D -qS,
+ fi
+ }'
+ '(- : *)-sinks[display output sinks (specify device)]:: :{
+ compset -S ",*"
+ if compset -P "*,"; then
+ _message "output device option (opt1=val1,opt2=val2,...)"
+ else
+ _ffmpeg_devices -E -qS,
+ fi
+ }'
+ '(- : *)-hwaccels[display available hardware-acceleration methods]'
+)
+# basic global options
+basic_opts+=(
+ '(-v -loglevel)'{-v,-loglevel}'[set logging level]: :_ffmpeg_loglevels'
+ '(-n)-y[overwrite output files without asking]'
+ '(-y)-n[never overwrite output files]'
+ '-print_graphs[print execution graph data to stderr]'
+ '-print_graphs_file[write execution graph data to specified file]:execution graph file:_files'
+ '-print_graphs_format[specify execution graph format]:execution graph format:(
+ default compact csv flat ini json xml mermaid mermaidhtml
+ )'
+ '-stats[print encoding progress and statistics]'
+)
+# advanced global options
+expert_opts+=(
+ '-report[generate report]'
+ '-max_alloc[specify heap allocation size limit]: :\
+ _ffmpeg_numbers -u bytes "max heap allocation block size"
+ '
+ # we could check these against $MACHTYPE but i don't think it matters
+ '-cpuflags[specify CPU flags]:CPU flag:_ffmpeg_flags - \
+ mmx mmxext \
+ sse sse2 sse2slow sse3 sse3slow ssse3 sse4.1 sse4.2 \
+ atom \
+ avx avx2 \
+ xop \
+ fma3 fma4 \
+ 3dnow 3dnowext \
+ bmi1 bmi2 \
+ cmov \
+ pentium2 pentium3 pentium4 k6 k62 athlon athlonxp k8 \
+ armv5te armv6 armv6t2 vfp vfpv3 neon setend \
+ armv8 vfp neon \
+ altivec
+ '
+ '-cpucount[specify CPU count]: :_ffmpeg_numbers "CPU count"'
+ '-hide_banner[suppress banner]'
+ '(-copy_unknown)-ignore_unknown[ignore unknown stream types]'
+ '(-ignore_unknown)-copy_unknown[copy unknown stream types]'
+ '-recast_media[allow forcing decoder of different media type]'
+ '-benchmark[show benchmark information at end of encode]'
+ '-benchmark_all[show benchmark information during encode]'
+ '-progress[write progress information to specified URL]: :{
+ if compset -P pipe\:; then
+ _describe "file descriptor" "(0 1 2)"
+ else
+ _alternative "urls\: \:_urls" "files\: \:_files"
+ fi
+ }'
+ '-stdin[enable interaction on standard input]'
+ '-timelimit[specify max run time]: :\
+ _ffmpeg_numbers -u seconds "max CPU user time"
+ '
+ '-dump[dump each input packet to stderr]'
+ '-hex[also dump payload (with -dump)]'
+ '-frame_drop_threshold[specify frame-drop threshold]: :\
+ _ffmpeg_numbers -u frames -N -d-1.1 "frame-drop threshold"
+ '
+ '-copyts[copy timestamps]'
+ '-start_at_zero[shift input timestamps to start at 0 (with -copyts)]'
+ '-copytb[specify how to set encoder time base when copying stream]:mode:((
+ -1\:"decide automatically"
+ 0\:"use decoder time base"
+ 1\:"use demuxer time base"
+ ))'
+ '-dts_delta_threshold[specify timestamp discontinuity delta threshold]: :\
+ _ffmpeg_numbers -u seconds -d10 "timestamp discontinuity delta threshold"
+ '
+ '-dts_error_threshold[specify timestamp error delta threshold]: :\
+ _ffmpeg_numbers -u seconds -d108000 "timestamp error delta threshold"
+ '
+ '-xerror[exit on error]'
+ '-abort_on[abort on specified condition flags]:condition flag:\
+ _ffmpeg_flags - empty_output empty_output_stream
+ '
+ '-filter_threads[specify number of threads used for each filter pipeline]: :\
+ _ffmpeg_numbers threads
+ '
+ '-filter_buffered_frames[specify max buffered frames in a filtergraph]: :\
+ _ffmpeg_numbers -d0 "max buffered frames"
+ '
+ '*'{-filter_complex,-lavfi}'[define specified complex filtergraph]: :_ffmpeg_filtergraphs'
+ '-filter_complex_threads[specify number of threads used for each complex filtergraph]: :\
+ _ffmpeg_numbers threads
+ '
+ '!*-filter_complex_script[]:-filter_complex script:_files' # deprecated
+ '-auto_conversion_filters[enable automatic conversion filters globally]'
+ '-stats_period[specify progress/statistics update interval]: :\
+ _ffmpeg_numbers -u seconds -d0.5 "update interval"
+ '
+ '-debug_ts[print timestamp/latency information]'
+ '-max_error_rate[specify max decoding error ratio]: :\
+ _ffmpeg_numbers -l0 -m1 -d0.67 "max decoding error ratio"
+ '
+ '-sdp_file[write sdp information to specified file]:sdp file:_files'
+ '*-init_hw_device[initialise specified hardware device]: :_ffmpeg_hw_device_inits'
+ '-filter_hw_device[specify hardware device for filtering]: :_ffmpeg_hw_devices'
+ '!-adrift_threshold[]:threshold:' # deprecated
+ '!-qphist[]' # deprecated
+ # deprecated in favour of -fps_mode, but still used in documentation, so no !
+ '-vsync[specify video sync method globally]: :_ffmpeg_fps_modes'
+)
+# basic per-file options (input and output)
+basic_opts+=(
+ '*-f[force specified container format]: :_ffmpeg_formats'
+ '*-t[stop after specified duration]: :_ffmpeg_durations'
+ '*-to[stop at specified time]: :_ffmpeg_durations'
+ '*-ss[start at specified time]: :_ffmpeg_durations'
+)
+# advanced per-file options (input and output)
+expert_opts+=(
+ '*-bitexact[enable bitexact mode]'
+ '*-thread_queue_size[specified max queued packets for demuxer]: :\
+ _ffmpeg_numbers "max queued packets"
+ '
+)
+# advanced per-file options (input only)
+expert_opts+=(
+ '*-sseof[start at specified time relative to EOF]: :_ffmpeg_durations'
+ '*-seek_timestamp[seek by timestamp (with -ss/-sseof)]'
+ '*-accurate_seek[enable accurate seeking (with -ss/-sseof)]'
+ '*-isync[specify input index for sync reference]: :\
+ _ffmpeg_numbers -N -d-1 "input index"
+ '
+ '*-itsoffset[specify input time offset]: :_ffmpeg_durations'
+ '*-re[read input at native frame rate (like -readrate 1)]'
+ '*-readrate[specify input read speed limit]: :\
+ _ffmpeg_numbers -u seconds -l0 -d0 "max input read duration per 1s of wall time"
+ '
+ '*-readrate_initial_burst[specify initial read burst time (with -readrate)]: :\
+ _ffmpeg_numbers -u seconds "initial read burst time"
+ '
+ '*-readrate_catchup[specify catch-up read speed limit if blocked (with -readrate)]: :\
+ _ffmpeg_numbers -u seconds "max input read duration per 1s of wall time"
+ '
+ '*-dump_attachment[extract matching attachment into specified file]:attachment output file:_files'
+ '*-stream_loop[specify number of times to loop input stream]: :\
+ _ffmpeg_numbers -N -d0 "input-stream loops"
+ '
+ '*-find_stream_info[decode streams to fill missing info with heuristics]'
+)
+# basic per-file options (output only)
+basic_opts+=(
+ '*-metadata[add specified metadata to output]:metadata key=value:'
+)
+# advanced per-file options (output only)
+expert_opts+=(
+ '*-map[specify stream mapping from input to output]: :_ffmpeg_map_sources'
+ '*-map_metadata[set metadata mapping from input to output]: :{
+ if compset -P 1 "*\:"; then
+ _ffmpeg_metadata_specs
+ else
+ _message "input file index[\:metadata specifier]"
+ fi
+ }'
+ '*-map_chapters[specify chapter mapping from input to output]: :\
+ _ffmpeg_numbers -N "input index"
+ '
+ '*-fs[specify output file size limit]: :\
+ _ffmpeg_numbers -u bytes "output file size limit"
+ '
+ '*-timestamp[specify recording timestamp]: :_ffmpeg_dates'
+ '*-program[add program with specified streams]: :_ffmpeg_program_specs'
+ '*-stream_group[add stream group with specified streams]: :_ffmpeg_stream_group_specs'
+ '*-dframes[specify max data frames to output (-like -frames\:d)]: :\
+ _ffmpeg_numbers "max data frames"
+ '
+ '*-target[specify target file type]:file type:(
+ {film-,ntsc-,pal-,}{vcd,svcd,dvd,dv,dv50}
+ )'
+ '*-shortest[finish encoding when shortest output stream ends]'
+ '*-shortest_buf_duration[specify buffer duration for -shortest]: :\
+ _ffmpeg_numbers -u seconds -d10 "max duration of buffered frames"
+ '
+ '*'{-q,-qscale}'[specify VBR quality]: :\
+ _ffmpeg_numbers "quality scale value"
+ '
+ # this is codec-specific, but here are some we know about
+ '*-profile[specify codec profile]:codec profile:(
+ # avcodeccontext
+ unknown main10
+ # dnxhd
+ dnxhd dnxhr_444 dnxhr_hqx dnxhr_hq dnxhr_sq dnxhr_lb
+ # prores
+ auto proxy lt standard hq 4444 4444xq
+ # x264
+ baseline main high high10 high422 high444
+ # h264 videotoolbox
+ baseline constrained_baseline main high constrained_high extended
+ # hevc videotoolbox
+ main main10 main42210 rext
+ # prores videotoolbox
+ auto proxy lt standard hq 4444 xq
+ )'
+ '*-attach[add attachment]:file to attach:_files'
+ '*-muxdelay[specify max demux-decode delay]: :\
+ _ffmpeg_numbers -u seconds "max demux-decode delay"
+ '
+ '*-muxpreload[specify initial demux-decode delay]: :\
+ _ffmpeg_numbers -u seconds "demux-decode delay"
+ '
+ '*-fpre[set options from specified preset file]:preset file:_files' \
+)
+# basic per-stream options
+basic_opts+=(
+ '*'{-c,-codec}'[specify encoder or decoder]: :_ffmpeg_codecs'
+ '*-filter[apply specified filtergraph]: :_ffmpeg_filtergraphs'
+)
+# advanced per-stream options
+expert_opts+=(
+ '*-pre[specify preset]: :_ffmpeg_presets'
+ '*-itsscale[specify input timestamp scale]: :_ffmpeg_numbers scale'
+ '*-copyinkf[copy initial non-key frames]'
+ '*-copypriorss[copy or discard frames before start time]'
+ '*-frames[specify max frames to output]: :\
+ _ffmpeg_numbers "max frames"
+ '
+ # there are hundreds of these so i'm not sure it makes sense to complete them
+ '*-tag[force specified codec tag/fourcc]:codec fourcc:'
+ '!*-filter_script[]:-filter script:_files' # deprecated
+ '*-reinit_filter[specify whether to re-initialise filtergraph on input parameter change]:re-initialise mode:((
+ 0\:disabled
+ 1\:enabled
+ ))'
+ '*-drop_changed[specify whether to drop frame on input parameter change]:drop mode:((
+ 0\:disabled
+ 1\:enabled
+ ))'
+ '*-discard[specify frames to discard]: :_ffmpeg_discard_methods'
+ '*-disposition[specify disposition flags]: :_ffmpeg_dispositions'
+ '*-bits_per_raw_sample[specify bits per raw sample]: :\
+ _ffmpeg_numbers "bits per raw sample"
+ '
+ '*-stats_enc_pre[write pre-encoding frame stats to specified file]:stats file:_files'
+ '*-stats_enc_post[write post-encoding frame stats to specified file]:stats file:_files'
+ '*-stats_mux_pre[write pre-muxing frame stats to specified file]:stats file:_files'
+ '*-stats_enc_pre_fmt[specify format for -stats_enc_pre]: :_ffmpeg_stats_fmt_specs'
+ '*-stats_enc_post_fmt[specify format for -stats_enc_post]: :_ffmpeg_stats_fmt_specs'
+ '*-stats_mux_pre_fmt[specify format for -stats_mux_pre]: :_ffmpeg_stats_fmt_specs'
+ '*-time_base[specify time base for output stream]:time base (num\:den or float):'
+ '*-enc_time_base[specify time base for encoder]:encoder time base (or num\:den or float):((
+ 0\:"assign default value according to media type"
+ demux\:"use time base from demuxer"
+ filter\:"use time base from filtergraph"
+ ))'
+ '*-bsf[specify bitstream filters]: :_ffmpeg_bsfs'
+ '*-max_muxing_queue_size[specify max packets in muxing queue]: :\
+ _ffmpeg_numbers "max packets in muxing queue"
+ '
+ '*-muxing_queue_data_threshold[specify minimum threshold for -max_muxing_queue_size]: :\
+ _ffmpeg_numbers -u bytes -d50M "minimum threshold for muxing queue size"
+ '
+)
+# basic video options
+basic_opts+=(
+ '*-r[specify frame rate]: :\
+ _ffmpeg_numbers -u "Hz, fraction, or abbreviation" "frame rate"
+ '
+ '*-aspect[specify aspect ratio]: :\
+ _ffmpeg_numbers -u "float or num:den" "aspect ratio"
+ '
+ '*-vn[disable video]'
+ '*-vcodec[force specified video codec (like -c\:v)]: :_ffmpeg_codecs -Tv'
+ '*-vf[apply specified filtergraph to video (like -filter\:v)]: :_ffmpeg_filtergraphs'
+ # this is actually not a video option, it has to be used like -b:a or -b:v.
+ # but this is where it's listed in the help output
+ '*-b[specify bit rate]: :_ffmpeg_numbers -u bps "bit rate"'
+ # this isn't in the help output for some reason
+ '*-s[specify video frame size]: :_ffmpeg_video_sizes'
+)
+# advanced video options
+expert_opts+=(
+ '*-vframes[specify max video frames to output (like -frames\:v)]: :\
+ _ffmpeg_numbers "max video frames"
+ '
+ '*-fpsmax[specify max video frame rate]: :\
+ _ffmpeg_numbers -u "Hz, fraction, or abbreviation" "frame rate"
+ '
+ '*-pix_fmt[specify pixel format]: :_ffmpeg_pix_fmts'
+ '*-display_rotation[specify video rotation]: :\
+ _ffmpeg_numbers -u degrees "anti-clockwise video rotation"
+ '
+ '*-display_hflip[flip video horizontally]'
+ '*-display_vflip[flip video vertically]'
+ '*-rc_override[specify rate-control override]:rate control (beg,end,quant):'
+ '*-timecode[specify timecode]:timecode (hh\:mm\:ss[\:;.]ff)'
+ '*-pass[specify pass number for two-pass video encoding]:pass:(1 2)'
+ '*-passlogfile[specify two-pass log-file prefix]:log-file prefix [ffmpeg2pass]:'
+ '*-intra_matrix[specify intra quantisation matrix]:intra quantisation matrix:'
+ '*-inter_matrix[specify inter quantisation matrix]:inter quantisation matrix:'
+ '*-chroma_intra_matrix[specify chroma intra quantisation matrix]:intra quantisation matrix:'
+ '*-vtag[force specified video codec tag/fourcc (like -tag\:v)]:video codec fourcc:'
+ '*-fps_mode[specify frame-rate mode]: :_ffmpeg_fps_modes'
+ '*-force_fps[force selected frame rate]'
+ '*-streamid[specify stream identifier]:output-stream-index\:new-value:'
+ '*-force_key_frames[force key frames at specified timestamps]: :_ffmpeg_kf_force_conds'
+ '*-hwaccel[specify hardware acceleration for decoding]: :_ffmpeg_hwaccels'
+ '*-hwaccel_device[specify hardware-acceleration device (with -hwaccel)]: :_ffmpeg_hw_devices'
+ '*-hwaccel_output_format[specify hardware-acceleration output format (with -hwaccel)]: :_ffmpeg_pix_fmts -H'
+ '*-autorotate[automatically rotate video]'
+ '*-autoscale[automatically scale video]'
+ '*-apply_cropping[automatically crop video using specified method]:crop method [all]:((
+ none\:"don'\''t apply cropping"
+ all\:"apply codec- and container-level cropping"
+ codec\:"apply codec-level cropping"
+ container\:"apply container-level cropping"
+ ))'
+ '*-fix_sub_duration_heartbeat[set stream as heartbeat stream (with -fix_sub_duration)]'
+ '*-vpre[specify video preset]: :_ffmpeg_presets'
+ '!*-top[]:top:' # deprecated
+)
+# basic audio options
+basic_opts+=(
+ '*-aq[specify audio VBR quality (like -q\:a)]: :\
+ _ffmpeg_numbers "quality scale value"
+ '
+ '*-ar[specify audio sampling rate]: :\
+ _ffmpeg_numbers -u Hz "audio sampling rate"
+ '
+ '*-ac[specify number of audio channels]: :\
+ _ffmpeg_numbers "audio channels"
+ '
+ '*-an[disable audio]'
+ '*-acodec[force specified audio codec (like -c\:a)]: :_ffmpeg_codecs -Ta'
+ '*-ab[specify audio bit rate]: :_ffmpeg_numbers -u bps "audio bit rate"'
+ '*-af[apply specified filtergraph to audio (like -filter\:a)]: :_ffmpeg_filtergraphs'
+)
+# advanced audio options
+expert_opts+=(
+ '*-aframes[specify max audio frames to output (like -frames\:a)]: :\
+ _ffmpeg_numbers "max audio frames"
+ '
+ '*-apad[pad audio stream with specified parameters (like -af apad) (with -shortest)]:apad filter parameters ([key=]val\:[key=]val\:...):'
+ '*-atag[force specified audio codec tag/fourcc (like -tag\:a)]:audio codec fourcc:'
+ '*-sample_fmt[specify audio sample format]: :_ffmpeg_sample_fmts'
+ '*'{-channel_layout,-ch_layout}'[specify audio channel layout]: :_ffmpeg_layouts'
+ '*-guess_layout_max[specify max channels for guessing channel layout]: :\
+ _ffmpeg_numbers "max audio channels"
+ '
+ '*-apre[specify audio preset]: :_ffmpeg_presets'
+)
+# basic subtitle options
+basic_opts+=(
+ '*-sn[disable subtitles]'
+ '*-scodec[force specified subtitle codec (like -c\:s)]: :_ffmpeg_codecs -Ts'
+)
+# advanced subtitle options
+expert_opts+=(
+ '*-stag[force specified subtitle codec tag/fourcc (like -tag\:s)]:subtitle codec fourcc:'
+ '*-fix_sub_duration[fix subtitle durations]'
+ '*-canvas_size[specify size of canvas for rendering subtitles]: :_ffmpeg_video_sizes'
+ '*-spre[specify subtitle preset]: :_ffmpeg_presets'
+)
+# basic data-stream options
+basic_opts+=(
+ '*-dcodec[force specified data codec (like -c\:d)]: :_ffmpeg_codecs -Td'
+ '*-dn[disable data]'
+)
+# generic codec AVOptions. my assumption is that these are rarely used, so i
+# haven't put much effort into them
+gen_avo_opts+=(
+ '!*-bt[]: :_ffmpeg_numbers -u bps "bit-rate tolerance"'
+ '!*-flags[]: :_ffmpeg_flags - \
+ unaligned mv4qpel loop gray psnr ildct low_delay global_header \
+ bitexact aic ilme cgop output_corrupt
+ '
+ '!*-flags2[]: :_ffmpeg_flags - \
+ fast noout ignorecrop local_header chunks showall export_mvs \
+ skip_manual ass_ro_flush_noop icc_profiles
+ '
+ '!*-export_side_data[]: :_ffmpeg_flags - \
+ mvs prft venc_params film_grain enhancements
+ '
+ '*-g[specify GOP (group of pictures) length]: :\
+ _ffmpeg_numbers -u frames "GOP length"
+ '
+ '*-cutoff[specify audio cut-off frequency]: :\
+ _ffmpeg_numbers -u Hz "cut-off frequency"
+ '
+ '*-frame_size[specify audio frame size]: :\
+ _ffmpeg_numbers -u samples/channel "frame size"
+ '
+ '!*-qcomp[]:float:'
+ '!*-qblur[]:float:'
+ '!*-qmin[]:int:'
+ '!*-qmax[]:int:'
+ '!*-qdiff[]:int:'
+ '!*-bf[]:int:'
+ '!*-b_qfactor[]:float:'
+ '!*-bug[]: :_ffmpeg_flags - \
+ autodetect xvid_ilace ump4 no_padding amv qpel_chroma std_qpel \
+ qpel_chroma2 direct_blocksize edge hpel_chroma dc_clip ms trunc \
+ iedge
+ '
+ '*-strict[specify how strictly to follow standards]:strictness level:(
+ very strict normal unofficial experimental
+ )'
+ '!*-b_qoffset[]:float:'
+ '!*-err_detect[]: :_ffmpeg_flags - \
+ crccheck bitstream buffer explode ignore_err careful compliant
+ aggressive
+ '
+ '!*-maxrate[]:int64:'
+ '!*-minrate[]:int64:'
+ '!*-bufsize[]:int:'
+ '!*-i_qfactor[]:float:'
+ '!*-i_qoffset[]:float:'
+ '!*-lumi_mask[]:float:'
+ '!*-tcplx_mask[]:float:'
+ '!*-scplx_mask[]:float:'
+ '!*-p_mask[]:float:'
+ '!*-dark_mask[]:float:'
+ '!*-dct[]:algorithm:(auto fastint int mmx altivec faan neon)'
+ '!*-idct[]:algorithm:(
+ auto int simple simplemmx arm altivec simplearm simplearmv5te
+ simplearmv6 simpleneon xvid xvidmmx faani simpleauto
+ )'
+ '!*-ec[]: :_ffmpeg_flags - guess_mvs deblock favor_inter'
+ '!*-sar[]:rational:'
+ '!*-debug[]: :_ffmpeg_flags - \
+ pict rc bitstream mb_type qp dct_coeff green_metadata skip \
+ startcode er mmco bugs buffers thread_ops nomc
+ '
+ '!*-dia_size[]:int:'
+ '!*-last_pred[]:int:'
+ '!*-pre_dia_size[]:int:'
+ '!*-subq[]:int:'
+ '!*-me_range[]:int:'
+ '!*-global_quality[]:int:'
+ '!*-mdb[]:macroblock decision algorithm [simple]:(simple bits rd)'
+ '!*-rc_init_occupancy[]:int:'
+ '*-threads[specify number of threads to use]: :\
+ _ffmpeg_numbers -d1 "threads (or auto)"
+ '
+ '!*-dc[]:int:'
+ '!*-nssew[]:int:'
+ '!*-skip_top[]:int:'
+ '!*-skip_bottom[]:int:'
+ '!*-level[]:int:'
+ '!*-lowres[]:int:'
+ '!*-cmp[]: :_ffmpeg_cmp_functions'
+ '!*-subcmp[]: :_ffmpeg_cmp_functions'
+ '!*-mbcmp[]: :_ffmpeg_cmp_functions'
+ '!*-ildctcmp[]: :_ffmpeg_cmp_functions'
+ '!*-precmp[]: :_ffmpeg_cmp_functions'
+ '!*-mblmin[]:int:'
+ '!*-mblmax[]:int:'
+ '!*-skip_loop_filter[]: :_ffmpeg_discard_methods'
+ '!*-skip_idct[]: :_ffmpeg_discard_methods'
+ '!*-skip_frame[]: :_ffmpeg_discard_methods'
+ '!*-bidir_refine[]:int:'
+ '!*-keyint_min[]:int:'
+ '!*-refs[]:int:'
+ '!*-trellis[]:int:'
+ '!*-mv0_threshold[]:int:'
+ '!*-compression_level[]:int:'
+ '!*-rc_max_vbv_use[]:float:'
+ '!*-rc_min_vbv_use[]:float:'
+ '!*-color_primaries[]:colour primary [unknown]:(
+ bt709 unknown bt470m bt470bg smpte170m smpte240m film bt2020
+ smpte428 smpte428_1 smpte431 smpte432 jedec-p22 ebu3213
+ unspecified
+ )'
+ '!*-color_trc[]:colour transfer characteristic [unknown]:(
+ bt709 unknown gamma22 gamma28 smpte170m smpte240m linear log100
+ log316 iec61966-2-4 bt1361e iec61966-2-1 bt2020-10 bt2020-12
+ smpte2084 smpte428 arib-std-b67 unspecified log log_sqrt
+ iec61966_2_4 bt1361 iec61966_2_1 bt2020_10bit bt2020_12bit
+ smpte428_1
+ )'
+ '!*-colorspace[]:colour space [unknown]:(
+ rgb bt709 unknown fcc bt470bg smpte170m smpte240m ycgco bt2020nc
+ bt2020c smpte2085 chroma-derived-nc chroma-derived-c ictcp ipt-c2
+ unspecified ycocg ycgco-re ycgco-ro bt2020_ncl bt2020_cl
+ )'
+ '!*-color_range[]:colour range [unknown]:(
+ unknown tv pc unspecified mpeg jpeg limited full
+ )'
+ '!*-chroma_sample_location[]:sample location [unknown]:(
+ unknown left center topleft top bottomleft bottom unspecified
+ )'
+ '!*-alpha_mode[]:alpha mode [unknown]:(
+ unknown unspecified premultiplied straight
+ )'
+ '!*-slices[]:int:'
+ '!*-thread_type[]:thread-type flag [slice+frame]:_ffmpeg_flags - slice frame'
+ '!*-audio_service_type[]:audio service type [ma]:(ma ef vi hi di co em vo ka)'
+ '!*-request_sample_fmt[]: :_ffmpeg_sample_fmts'
+ '!*-sub_charenc[specify subtitle character encoding]:subtitle character encoding:'
+ '!*-sub_charenc_mode[]:subtitle character encoding mode flag [0]:\
+ _ffmpeg_flags - do_nothing auto pre_decoder ignore
+ '
+ '!*-skip_alpha[]'
+ '!*-field_order[]:field order [0]:(progressive tt bb tb bt)'
+ '!*-dump_separator[specify information dump field separator]:field separator:'
+ '!*-codec_whitelist[]: :_sequence -s, _ffmpeg_codecs -D'
+ '!*-max_pixels[]:int64:'
+ '!*-max_samples[]:int64:'
+ '!*-hwaccel_flags[]:hardware-acceleration flag [ignore_level]:\
+ _ffmpeg_flags - \
+ ignore_level allow_high_depth allow_profile_mismatch \
+ unsafe_output
+ '
+ '!*-extra_hw_frames[]:int:'
+ '!*-discard_damaged_percentage[]:int:'
+ '!*-side_data_prefer_packet[]: : _values -s, "side data type" \
+ replaygain displaymatrix spherical stereo3d audio_service_type \
+ mastering_display_metadata content_light_level icc_profile exif
+ '
+)
+# generic format AVOptions. see above
+gen_avo_opts+=(
+ '!*-avioflags[]: :_ffmpeg_flags - direct'
+ '!*-probesize[]:int64:'
+ '!*-formatprobesize[]:int:'
+ '!*-packetsize[]:int:'
+ '!*-fflags[]: :_ffmpeg_flags - \
+ flush_packets ignidx genpts nofillin noparse igndts \
+ discardcorrupt sortdts fastseek nobuffer bitexact autobsf
+ '
+ '!*-seek2any[]'
+ '!*-analyzeduration[]:int64:'
+ '!*-cryptokey[]:binary:'
+ '!*-indexmem[]:int:'
+ '!*-rtbufsize[]:int:'
+ '!*-fdebug[]: :_ffmpeg_flags - ts'
+ '!*-max_delay[]:int:'
+ '!*-start_time_realtime[]:int64:'
+ '!*-fsprobesize[]:int:'
+ '!*-audio_preload[]:int:'
+ '!*-chunk_duration[]:int:'
+ '!*-chunk_size[]:int:'
+ '!*'{-f_err_detect,-err_detect}'[]: :_ffmpeg_flags - \
+ crccheck bitstream buffer explode ignore_err careful compliant \
+ aggressive
+ ' # -f_err_detect is deprecated
+ '!*-use_wallclock_as_timestamps[]'
+ '!*-skip_initial_bytes[]:int64:'
+ '!*-correct_ts_overflow[]'
+ '!*-flush_packets[]:int:'
+ '!*-metadata_header_padding[]:int:'
+ '!*-output_ts_offset[]: :_ffmpeg_durations'
+ '!*-max_interleave_delta[]:int64:'
+ # deprecated. see -strict
+ '!*-f_strict[]:strictness level:(very strict normal unofficial experimental)'
+ '!*-max_ts_probe[]:int:'
+ '!*-avoid_negative_ts[]:time-stamp shift method:(
+ auto disabled make_non_negative make_zero
+ )'
+ '!*-format_whitelist[]: :_sequence -s, _ffmpeg_formats -D'
+ '!*-protocol_whitelist[]: :_sequence -s, _ffmpeg_protocols'
+ '!*-protocol_blacklist[]: :_sequence -s, _ffmpeg_protocols'
+ '!*-max_streams[]:int:'
+ '!*-skip_estimate_duration_from_pts[]'
+ '!*-max_probe_packets[]:int:'
+ '!*-duration_probesize[]:int64:'
+)
+# and... this
+basic_opts+=(
+ '*-i[input file or URL]:input file:_files'
+)
+
+# previous iterations of this function only completed basic options. not sure if
+# that's specifically desirable, but we can support it
+opts=( $basic_opts )
+if zstyle -t ":completion:$curcontext:$curtag" basic; then
+ opts+=( ${expert_opts/#(#m)[^!]/!$MATCH} ${gen_avo_opts/#(#m)[^!]/!$MATCH} )
+else
+ opts+=( $expert_opts $gen_avo_opts )
+fi
+
+# --help looks annoying in the list
+[[ -n $words[(r)--*] ]] || opts=( ${opts:#(|\(*\))\*#--*} )
+
+# support -no variants of boolean options
+[[ $PREFIX == -no* ]] &&
+for x in ${opts:#*\]:*}; do
+ [[ $x == \([' *:-']##\)* ]] && continue # skip -version etc
+ # skip some others that are stupid
+ [[ $x == (|\(*\))-(hide_banner|n|y)\[* ]] && continue
+ # turn '-foo[do bar]' into "-nofoo[don't do bar]"
+ [[ $x == \(* ]] && x=${x/\)-/\)-no} || x=${x/-/-no}
+ x=${x/\[/\[don\'t }
+ opts+=( $x )
+done
-[[ "$state" == "vfilters" ]] &&
- _values -s , -S = 'video filter' \
- 'aspect:set aspect ratio (rational number X\:Y or decimal number):' \
- 'crop:crop input video (x\:y\:width\:height):' \
- 'format: :_sequence -s : _ffmpeg_pix_fmts' \
- 'noformat: :_sequence -s : _ffmpeg_pix_fmts' \
- 'null' \
- 'pad:add pads to the input image (width\:height\:x\:y\:color_string):' \
- 'pixelaspect:set pixel aspect ratio (rational number X\:Y or decimal number):' \
- 'scale:scale input video (width\:height):' \
- 'slicify:output slice height ("random" or a number of pixels):' \
- 'unsharp:luma_x\:luma_y\:luma_amount\:chroma_x\:chroma_y\:chroma_amount:' \
- 'vflip' \
- 'buffer' \
- 'nullsrc' \
- 'nullsink' \
- && return
+# support optional stream/metadata spec, e.g. -codec:a or -metadata:s:a
+[[ $words[CURRENT] == -/#*:* || $words[CURRENT-1] == -/#*:* ]] &&
+for x y in ss_opts _ffmpeg_stream_specs ms_opts _ffmpeg_metadata_specs; do
+ for z in ${(P)x}; do
+ [[ $words[CURRENT] == -/#$z:* || $words[CURRENT-1] == -/#$z:* ]] || continue
+ tmp=( ${(M)opts:#(|\(*\))\*#-$z\[*} )
+ opts=( ${opts:#$tmp} )
+ # turn '-c:x:y' into '-c\:-: :_ffmpeg_stream_specs:x:y'
+ tmp=( ${tmp/\[/\\:-\[} )
+ tmp=( ${tmp/%(#m):([^:]|\\:)##(|:([^:]|\\:)#)/: :$y$MATCH} )
+ opts+=( $tmp )
+ break
+ done
+done
-[[ -n $state && -n $_ffmpeg_flags[$state] ]] &&
- _ffmpeg_flags $state && return
+# support -/ variant (-/filter:v filter.script) of options with args
+[[ $words[CURRENT] == -/* || $words[CURRENT-1] == -/?* ]] &&
+for (( x = 1; x <= $#opts; x++ )); do
+ [[ $opts[x] == *\]:* ]] || continue
+ [[ $opts[x] == \([' *:-']##\)* ]] && continue # skip -help etc
+ y=${${${${opts[x]#\!}#\(*\)}#\*}%%(\\:|)(-|)\[*} # option name for desc
+ # turn '-c:x:y' into '-/c:...:_files'
+ [[ $opts[x] == \(* ]] && opts[x]=${opts[x]/\)-/\)-/} || opts[x]=${opts[x]/-/-/}
+ opts[x]=${opts[x]/%:([^:]|\\:)##(|:([^:]|\\:)#)/:$y argument value file:_files}
+done
-return 1
+_arguments -S : $opts '*:output file:_files'
diff --git a/Completion/Unix/Command/_find b/Completion/Unix/Command/_find
index 8628ad43e..2afb46e34 100644
--- a/Completion/Unix/Command/_find
+++ b/Completion/Unix/Command/_find
@@ -12,17 +12,21 @@ case $variant in
'*-local'
)
;|
- solaris*|darwin*)
+ solaris*|darwin*|freebsd<15->.*)
args+=( '*-xattr' )
;|
solaris2.<10->|freebsd*|darwin*)
args+=( '*-acl' )
;|
- solaris2.<11->|freebsd*|dragonfly*|darwin*|openbsd*|gnu)
+ aix*|solaris2.<11->|freebsd*|dragonfly*|darwin*|openbsd*|gnu)
args+=(
'*-amin:access time (minutes)'
'*-cmin:inode change time (minutes)'
'*-mmin:modification time (minutes)'
+ )
+ ;|
+ solaris2.<11->|freebsd*|dragonfly*|darwin*|openbsd*|gnu)
+ args+=(
'*-iname:name pattern to match (case insensitive)'
'*-print0'
)
@@ -36,7 +40,7 @@ case $variant in
darwin*|freebsd*|gnu)
args+=(
'*-Bmin:birth time (minutes)'
- '*-Bnewer:file to compare (birth time):_files'
+ '!*-Bnewer:reference file:_files'
'*-newer'{a,B,c,m}{a,B,c,m}'[if [aBcm\]time is newer than [aBcm\]time of given file]:reference file:_files'
'*-newerat[if access time is newer than given timestamp]:timestamp: '
'*-newerBt[if birth time is newer than given timestamp]:timestamp: '
@@ -98,7 +102,7 @@ case $variant in
)
;|
freebsd*|dragonfly*) args+=( '*-sparse' ) ;|
- darwin*) args+=( '*-xattrname:name' ) ;|
+ darwin*|freebsd<15->.*) args+=( '*-xattrname:name' ) ;|
gnu)
args+=(
'(- *)-help' '(-)--help'
diff --git a/Completion/Unix/Command/_flac b/Completion/Unix/Command/_flac
index 0197aaf92..d7f3e801c 100644
--- a/Completion/Unix/Command/_flac
+++ b/Completion/Unix/Command/_flac
@@ -67,7 +67,6 @@ case $service in
- 'H' \
'(-)'{-v,--version}'[display version information]' \
'(-)'{-h,--help}'[display help information]' \
- '(-)'{-H,--explain}'[display detailed explanation of usage and options]' \
- encode \
'(-V --verify)'{-V,--verify}'[verify a correct encoding]' \
--lax --ignore-chunk-sizes '!--sector-align' --replay-gain \
@@ -88,6 +87,7 @@ case $service in
'(-p --qlp-coeff-precision-search -q --qlp-coeff-precision)'{-q,--qlp-coeff-precision=}'[specify precision]:precision (bits)' \
'(-r --rice-partition-order)'{-r,--rice-partition-order=}'[set min/max residual partition order]:order' \
"--limit-min-bitrate[don't allow frames consisting of only constant subframes]" \
+ '(-j --threads)'{-j+,--threads=}'[set number of encoding threads]:threads' \
'--endian=:byte order:(big little)' \
'--channels=:channels' \
'--bps=:bits per sample' \
@@ -102,6 +102,7 @@ case $service in
'(-F --decode-through-errors)'{-F,--decode-through-errors}'[continue decoding through stream errors]' \
'--apply-replaygain-which-is-not-lossless=:specification' \
'--cue=[set the beginning and ending cuepoints to decode]:cue point' \
+ '--decode-chained-stream[decode all links in a chained Ogg stream, not just the first one]' \
'(--force-raw-format --force-rf64-format --force-wave64-format --force-legacy-wave-format --force-extensible-wave-format --force-aiff-c-none-format --force-aiff-c-sowt-format)--force-aiff-format' \
'(--force-raw-format --force-aiff-format --force-wave64-format --force-legacy-wave-format --force-extensible-wave-format --force-aiff-c-none-format --force-aiff-c-sowt-format)--force-rf64-format' \
'(--force-raw-format --force-aiff-format --force-rf64-format --force-legacy-wave-format --force-extensible-wave-format --force-aiff-c-none-format --force-aiff-c-sowt-format)--force-wave64-format' \
@@ -112,6 +113,7 @@ case $service in
;;
metaflac)
_arguments -S $shared \
+ '(-o --output-name)'{-o+,--output-name=}'[write changes to a new file]:file:_files' \
'(--no-filename)--with-filename[prefix output with filename]' \
'(--with-filename)--no-filename' \
'--dont-use-padding[always rewrite the file]' \
diff --git a/Completion/Unix/Command/_fuser b/Completion/Unix/Command/_fuser
index 05de1c529..90124ea30 100644
--- a/Completion/Unix/Command/_fuser
+++ b/Completion/Unix/Command/_fuser
@@ -69,9 +69,12 @@ case $variant in
args+=(
'-n[list only processes with non-blocking mandatory locks]'
)
- ;;
+ ;|
solaris2.<10->)
args+=( '-d[report device usage for all minor nodes bound to same device]' )
+ ;|
+ solaris2.<11->)
+ args+=( "-l[don't resolve symlinks to target file]" )
;;
sysv4 )
(( $+words[(r)-k] )) && argf=( ':name: _alternative signals\:signal\:_signals\ -p files:file:_files' )
diff --git a/Completion/Unix/Command/_gcc b/Completion/Unix/Command/_gcc
index 03c3eb2f2..cf1cf7efa 100644
--- a/Completion/Unix/Command/_gcc
+++ b/Completion/Unix/Command/_gcc
@@ -1,10 +1,18 @@
-#compdef gcc g++ cc c++ llvm-gcc llvm-g++ clang clang++ -value-,LDFLAGS,-default- -value-,CFLAGS,-default- -value-,CXXFLAGS,-default- -value-,CPPFLAGS,-default- -P gcc-* -P g++-* -P c++-*
+#compdef gcc g++ cc c++ llvm-gcc llvm-g++ clang clang++ -value-,LDFLAGS,-default- -value-,CFLAGS,-default- -value-,CXXFLAGS,-default- -value-,CPPFLAGS,-default- -value-,CC,-default- -value-,CXX,-default- -P gcc-* -P g++-* -P c++-*
local curcontext="$curcontext" state line ret=1 expl i
local -a args args2 warnings arch
typeset -A opt_args
-if [[ "$service" = -value-* ]]; then
+if [[ "$service" = -value-,CC,* ]]; then
+ _description compilers expl compiler
+ compadd "$expl[@]" -M 'r:|-=* r:|=*' -k 'commands[(I)(clang|([ig]|sun|open)cc(|<->|-devel)|icx)]'
+ return
+elif [[ "$service" = -value-,CXX,* ]]; then
+ _description compilers expl compiler
+ compadd "$expl[@]" -M 'r:|-=* r:|=*' -k 'commands[(I)((clang|g)++(|<->|-devel)|(sun|open|)CC|icpx)]'
+ return
+elif [[ "$service" = -value-* ]]; then
compset -q
words=( fake "$words[@]" )
(( CURRENT++ ))
@@ -337,7 +345,7 @@ i[3456]86|x86_64)
'-mstack-arg-probe[enable stack probing]'
'-mstack-protector-guard=-[use given stack-protector guard]:guard:(global tls)'
'-mstackrealign[realign stack in prologue]'
- '-mstringop-strategy=-[chose strategy to generate stringop using]:stringop strategy:(byte_loop libcall loop rep_4byte rep_8byte rep_byte unrolled_loop)'
+ '-mstringop-strategy=-[choose strategy to generate stringop using]:stringop strategy:(byte_loop libcall loop rep_4byte rep_8byte rep_byte unrolled_loop)'
'-mstv[disable Scalar to Vector optimization pass transforming 64-bit integer computations into a vector ones]'
'-mtbm[support TBM built-in functions and code generation]'
'-mthreads[support thread-safe exception handling on MinGW]'
@@ -616,7 +624,6 @@ if [[ "$service" = clang* ]]; then
'-fconstexpr-steps=[constexpr steps]:arg'
'-fconvergent-functions[assume functions may be convergent]'
'-fconvert=[convert]:arg'
- '-fcoroutines-ts[enable support for the C++ Coroutines TS]'
'-fcoverage-compilation-dir=[the compilation directory to embed in the coverage mapping]:arg'
'-fcoverage-mapping[generate coverage mapping to enable code coverage analysis]'
'-fcoverage-prefix-map=[remap file source paths in coverage mapping]:arg'
@@ -1695,6 +1702,7 @@ args+=(
'-fcompare-elim[perform comparison elimination after register allocation has finished]'
'-fcond-mismatch[allow the arguments of the ? operator to have different types]'
'-fconserve-stack[do not perform optimizations increasing noticeably stack usage]'
+ '-fcoroutines[enable support for C++ Coroutines]'
'-fcprop-registers[perform a register copy-propagation optimization pass]'
'-fcrossjumping[perform cross-jumping optimization]'
'-fcse-follow-jumps[when running CSE, follow jumps to their targets]'
@@ -1837,6 +1845,8 @@ args+=(
'-fno-stack-limit[do not limit the size of the stack]'
'-fno-threadsafe-statics[do not generate thread-safe code for initializing local statics]'
'-fnothrow-opt[treat a throw() exception specification as noexcept to improve code size]'
+ '-foffload=[specify offloading targets]:target list'
+ '-foffload-options=:option list'
'-fomit-frame-pointer[when possible do not generate stack frames]'
'-fopenacc[enable OpenACC]'
'-fopenmp[enable OpenMP (implies -frecursive in Fortran)]'
diff --git a/Completion/Unix/Command/_gcore b/Completion/Unix/Command/_gcore
index ef3afd919..4e5041f3b 100644
--- a/Completion/Unix/Command/_gcore
+++ b/Completion/Unix/Command/_gcore
@@ -56,7 +56,7 @@ case $OSTYPE in
'-v[report progress on the dump as it proceeds]' \
'-b+[specify maximum size of core file]:size (MiB): ' \
'(-c)-o+[write core file to specified file]:file:_files' \
- '(-o)-c+[specify format of core file name]:format (%%N\:program name, %%U\:uid, %%P\:pid, %%T\:time stamp)' \
+ '(-o)-c+[specify format of core file name]:format (%N\:program name, %U\:uid, %P\:pid, %T\:time stamp)' \
'1:pid:_pids'
;;
*)
diff --git a/Completion/Unix/Command/_git b/Completion/Unix/Command/_git
index cbf577680..2b37ffa50 100644
--- a/Completion/Unix/Command/_git
+++ b/Completion/Unix/Command/_git
@@ -207,7 +207,8 @@ _git-archive () {
_git-backfill() {
_arguments -S \
'--min-batch-size=[specify minimum number of objects to request at a time]:number of objects' \
- '--sparse[only download objects at a path matching current sparse-checkout]'
+ '--sparse[only download objects at a path matching current sparse-checkout]' \
+ '--no-include-edges[exclude blobs from boundary commits in the backfill]'
}
(( $+functions[_git-bisect] )) ||
@@ -557,7 +558,7 @@ _git-checkout () {
elif [[ -n ${opt_args[(I)-b|-B|-t|--track|--orphan|--detach]} ]]; then
_nothing
- elif [[ -n $line[1] ]] && __git_is_treeish ${(Q)line[1]}; then
+ elif [[ -n $line[1] && $line[1] != (@|HEAD) ]] && __git_is_treeish ${(Q)line[1]}; then
__git_ignore_line __git_tree_files ${PREFIX:-.} ${(Q)line[1]} && ret=0
else
__git_ignore_line __git_modified_files && ret=0
@@ -698,7 +699,7 @@ _git-clone () {
'(--single-branch)--no-single-branch[clone history leading up to each branch]' \
"--no-tags[don't clone any tags and make later fetches not follow them]" \
'--shallow-submodules[any cloned submodules will be shallow]' \
- '(--recursive --recurse-submodules)'{--recursive,--recurse-submodules}'=-[initialize submodules in the clone]::file:__git_files' \
+ '(--recursive --recurse-submodules)'{--recursive,--recurse-submodules}'=-[initialize submodules in the clone]::file:_files' \
'--separate-git-dir[place .git dir outside worktree]:path to .git dir:_path_files -/' \
'--ref-format=[specify reference format to use]:format:(files reftable)' \
\*--server-option='[send specified string to the server when using protocol version 2]:option' \
@@ -2008,7 +2009,7 @@ _git-sparse-checkout() {
_git-stash () {
local curcontext=$curcontext state line ret=1
declare -A opt_args
- local -a save_arguments
+ local -a save_arguments args
save_arguments=(
'(-p --patch -a --all -u --include-untracked)'{-p,--patch}'[interactively select hunks from diff between HEAD and working tree to stash]'
@@ -2085,8 +2086,9 @@ _git-stash () {
'(-u --include-untracked)--only-untracked[show only the untracked files in the stash entry as part of the diff]' \
':: :__git_stashes' && ret=0
;;
- (pop|apply)
- _arguments -S $endopt \
+ apply) args=( '--label-'{ours,theirs,base}'=:label' ) ;&
+ pop)
+ _arguments -S $endopt $args \
'--index[try to reinstate the changes added to the index as well]' \
'(-q --quiet)'{-q,--quiet}'[suppress all output]' \
':: :__git_stashes' && ret=0
@@ -4427,7 +4429,8 @@ _git-repack () {
'--pack-kept-objects[repack objects in packs marked with .keep]' \
'--keep-pack=[ignore named pack]:pack' \
'(-g --geometric)'{-g+,--geometric=}'[find a geometric progression with specified factor]:factor' \
- '(-m --write-midx)'{-m,--write-midx}'[write a multi-pack index of the resulting packs]' \
+ '(--write-midx)-m[write a multi-pack index of the resulting packs]' \
+ '(-m)--write-midx=-[write a multi-pack index of the resulting packs]:mode:(default incremental)' \
'--expire-to=[pack prefix to store a pack containing pruned objects]:directory:_directories' \
'--filter-to=[pack prefix to store a pack containing filtered out objects]:directory:_directories'
}
@@ -4586,11 +4589,34 @@ _git-fsck () {
'*: :__git_objects'
}
+(( $+functions[_git-format-rev] )) ||
+_git-format-rev() {
+ _arguments -S $endopt \
+ '--format=[specify format]:format:__git_format_placeholders' \
+ '--stdin-mode=[specify stdin mode]:mode:(revs text)' \
+ '--notes=[display notes for pretty format]:reference' \
+ '(-z --null --null-input --null-output)'{-z,--null}'[use NUL for input and output termination]' \
+ '(-z --null)--null-input[use NUL for input termination]' \
+ '(-z --null)--null-output[use NUL for output termination]'
+}
+
(( $+functions[_git-get-tar-commit-id] )) ||
_git-get-tar-commit-id () {
_message 'no arguments allowed; accepts tar-file on standard input'
}
+(( $+functions[_git-last-modified] )) ||
+_git-last-modified() {
+ _arguments -s \
+ '(-r --recursive)'{-r,--recursive}'[recurse into subtrees]' \
+ '(-t --show-trees)'{-t,--show-trees}'[show tree entries when recursing into subtrees]' \
+ '--max-depth=[specify maximum tree depth to recurse]:depth [0]' \
+ '-z[separate lines with NUL character]' \
+ '1: :__git_commit_ranges' \
+ \!--{,end-of-options}':*: :__git_tree_files ${PREFIX:-.} HEAD' \
+ '*: :__git_tree_files ${PREFIX:-.} $line[1]'
+}
+
(( $+functions[_git-help] )) ||
_git-help () {
_arguments -S -s \
@@ -5499,7 +5525,7 @@ _git-mktree () {
(( $+functions[_git-multi-pack-index] )) ||
_git-multi-pack-index() {
- _arguments \
+ _arguments -S \
'--object-dir=[specify location of git objects]:directory:_directories' \
'(--progress)--no-progress[turn progress off]' '!(--no-progress)--progress' \
'--preferred-pack=[break ties in favor of specified pack]:pack' \
@@ -5508,7 +5534,11 @@ _git-multi-pack-index() {
'--refs-snapshot=[specify a file which contains a "refs snapshot" taken prior to repacking]:file:_files' \
'--incremental[write an incremental MIDX file]' \
'--batch-size=[during repack, select packs so as to have pack files of at least the specified size]:size' \
- '1:verb:(write compact verify expire repack)'
+ "--write-chain-file[write new MIDX layer but don't update multi-pack-index-chain file]" \
+ '--base=[specify checksum of MIDX layer to use as base]:checksum' \
+ '1:verb:(write compact verify expire repack)' \
+ '2:from (checksum)' \
+ '3:to (checksum)'
}
(( $+functions[_git-pack-objects] )) ||
@@ -6426,6 +6456,7 @@ _git-hook() {
'--allow-unknown-hook-name' \
'-z[terminate output lines with NUL instead of newlines]' \
'--show-scope[prefix each hook name with a config scope]' \
+ '(-j --jobs)'{-j+,--jobs=}'[allow specified number of simultaneous hooks]:jobs' \
'1:subcommand:(run list)' \
'2:hook name:compadd $gitdir/hooks/*(x\:t)'
}
@@ -6483,6 +6514,13 @@ _git-stripspace () {
'(-c --comment-lines -s --strip-comments)'{-c,--comment-lines}'[prepend comment character and blank to each line]'
}
+(( $+functions[_git-url-parse] )) ||
+_git-url-parse() {
+ _arguments -S $endopt \
+ '(-c --component)'{-c+,--component=}'[specific URL component]:component:(scheme user password host port path)' \
+ '*: :_guard "^-*" url'
+}
+
# INTERNAL GIT COMPLETION FUNCTIONS
# Generic Helpers
@@ -6769,13 +6807,16 @@ _git_commands () {
diff-tree:'compare content and mode of blobs found via two tree objects'
for-each-ref:'output information on each ref'
for-each-repo:'run a git command on a list of repositories'
+ format-rev:'pretty format revisions from stdin'
get-tar-commit-id:'extract commit ID from an archive created using git archive'
+ last-modified:'show when files were last modified'
ls-files:'information about files in index/working directory'
ls-remote:'show references in a remote repository'
ls-tree:'list contents of a tree object'
merge-base:'find as good a common ancestor as possible for a merge'
name-rev:'find symbolic names for given revisions'
pack-redundant:'find redundant pack files'
+ repo:'retrieve information about repository'
rev-list:'list commit object in reverse chronological order'
rev-parse:'pick out and massage parameters for other git commands'
show-index:'show packed archive index'
@@ -6811,8 +6852,10 @@ _git_commands () {
mailinfo:'extract patch and authorship from a single email message'
mailsplit:'split mbox file into a list of files'
merge-one-file:'standard helper-program to use with git merge-index'
- patch-id:'compute unique ID for a patch'
- stripspace:'filter out empty lines')
+ patch-id:'compute unique ID for patches'
+ stripspace:'filter out empty lines'
+ url-parse:'parse and extract git URL components'
+ )
zstyle -a :completion:$curcontext: user-commands user_commands
@@ -8714,11 +8757,13 @@ __git_setup_fetch_options () {
'(-q --quiet)--progress[force progress reporting]'
'--show-forced-updates[check for forced-updates on all updated branches]'
'--set-upstream[set upstream for git pull/fetch]'
- '--shallow-since=[deepen history of shallow repository based on time]:time' \
- '*--shallow-exclude=[deepen history of shallow clone by excluding ref]:reference' \
- '--deepen[deepen history of shallow clone]:number of commits' \
+ '--shallow-since=[deepen history of shallow repository based on time]:time'
+ '*--shallow-exclude=[deepen history of shallow clone by excluding ref]:reference'
+ '--deepen[deepen history of shallow clone]:number of commits'
\*{-o+,--server-option=}'[send specified string to the server when using protocol version 2]:option'
- '--negotiation-tip=[only report refs reachable from specified object to the server]:commit:__git_commits' \
+ '--negotiation-restrict=[only report refs reachable from specified object to the server]:commit:__git_commits'
+ '!--negotiation-tip=:commit:__git_commits'
+ '--negotiation-include=[report given commit as "have" in negotiation]:commit:__git_commits'
)
}
diff --git a/Completion/Unix/Command/_gnutls b/Completion/Unix/Command/_gnutls
index 4c1698857..c62269afc 100644
--- a/Completion/Unix/Command/_gnutls
+++ b/Completion/Unix/Command/_gnutls
@@ -182,7 +182,8 @@ case "$service" in
'--cprint[prints certain information is C-friendly format]'
'--null-password[enforce a NULL password]'
'--empty-password[enforce an empty password]'
- '--key-type=[specify the key type to use on key generation]:key type'
+ '--key-type=[specify key type to use on key generation]:key type'
+ '--key-format=[specify key format to use on key generation]:key format:(seed expanded both)'
'(-i --certificate-info)'{-i,--certificate-info}'[print information on a certificate]'
'(-l --crl-info)'{-l,--crl-info}'[print information on a CRL]'
'--crq-info[print information on a certificate request]'
diff --git a/Completion/Unix/Command/_gpg b/Completion/Unix/Command/_gpg
index ea0a452f2..d704af92f 100644
--- a/Completion/Unix/Command/_gpg
+++ b/Completion/Unix/Command/_gpg
@@ -95,7 +95,6 @@ fi
'(--encrypt-to)--no-encrypt-to[disable the use of all --encrypt-to keys]'
'--group[set up email aliases]:spec'
'-z[specify compression level]:compression level:((0\:no\ compression 1\:minimum 2 3 4 5 6\:default 7 8 9\:maximum))'
- '(-t --textmode)'{-t,--textmode}'[use canonical text mode]'
'(-n --dry-run)'{-n,--dry-run}"[don't make any changes]"
'(-i --interactive --batch)'{-i,--interactive}'[prompt before overwriting files]'
'(-i --interactive --no-batch)--batch[use batch mode]'
diff --git a/Completion/Unix/Command/_gphoto2 b/Completion/Unix/Command/_gphoto2
index df17aa111..4ff5ce1c1 100644
--- a/Completion/Unix/Command/_gphoto2
+++ b/Completion/Unix/Command/_gphoto2
@@ -72,6 +72,8 @@ _arguments -s -C \
'--get-all-raw-data[get all raw data from folder]' \
'--get-audio-data=[get audio data given in range]:range' \
'--get-all-audio-data[get all audio data from folder]' \
+ '--get-exif=[get files in given range]:range' \
+ '--get-all-exif[get all files from folder]' \
'(-d --delete-file)'{-d,--delete-file=}'[delete files in given range]:range' \
'(-D --delete-all-files)'{-D,--delete-all-files}'[delete all files in folder]' \
'(-u --upload-file)'{-u,--upload-file=}'[upload a file to camera]:file:_files' \
@@ -80,6 +82,7 @@ _arguments -s -C \
'(-f --folder)'{-f,--folder=}'[specify camera folder]:folder [/]' \
'(-R --recurse --no-recurse)'{-R,--recurse}'[recursion (default for download)]' \
'(-R --recurse)--no-recurse[no recursion (default for deletion)]' \
+ '--reverse[reverse order of file operations]' \
'--new[process new files only]' \
'--force-overwrite[overwrite files without asking]' \
'--skip-existing[skip files that already exist on local filesystem]' && ret=0
diff --git a/Completion/Unix/Command/_hardlink b/Completion/Unix/Command/_hardlink
new file mode 100644
index 000000000..8a62779aa
--- /dev/null
+++ b/Completion/Unix/Command/_hardlink
@@ -0,0 +1,43 @@
+#compdef hardlink
+
+local ign
+local -a args
+
+(( $#words > 2 )) && ign='!(- *)'
+
+if _pick_variant linux=util-linux jak -V; then
+ args=(
+ '(-c --content -p --ignore-mode -o --ignore-owner -t --ignore-time)'{-c,--content}'[compare only file contents, same as -pot]'
+ '(-b --io-size)'{-b+,--io-size=}'[specify I/O buffer size for file reading]: :_numbers "IO buffer size" K M G T P'
+ '(-d --respect-dir)'{-d,--respect-dir}'[directory names have to be identical]'
+ '(-F --prioritize-trees)'{-F,--prioritize-trees}'[keep files found in the earliest specified top-level]'
+ '(-l --list-duplicates)'{-l,--list-duplicates}"[just list paths of duplicates, don't link them]"
+ '--mount[stay within the same filesystem]'
+ '(-q --quiet)'{-q,--quiet}"[quiet mode - don't print anything]"
+ '(-r --cache-size)'{-r+,--cache-size=}'[specify memory limit for cached file content data]: :_numbers size K M G T P'
+ '(--skip-reflinks)--reflink=-[create clone/CoW copies]::when [auto]:(auto always never)'
+ '--skip-reflinks[skip already cloned files]'
+ '(-S --maximum-size)'{-S+,--maximum-size=}'[specify maximum size for files]: :_numbers -u bytes -d 0 size K M G T P E Z Y'
+ '--exclude-subtree[specify regular expression to exclude directories]:regex'
+ '(-X --respect-xattrs)'{-X,--respect-xattrs}'[respect extended attributes]'
+ '(-y --method)'{-y+,--method=}'[specify file content comparison method]:method [sha256]:(sha256 sha1 crc32c memcmp)'
+ '(-z --zero)'{-z,--zero}'[delimit output with NULs instead of newlines]'
+ )
+fi
+
+_arguments -S -s $args \
+ '(-f --respect-name)'{-f,--respect-name}'[filenames have to be identical]' \
+ '(-i --include)'{-i+,--include=}'[regular expression to include files/dirs]:regex' \
+ '(-m --maximize -M --minimize)'{-m,--maximize}'[keep the file with the most links]' \
+ '(-M --minimize -m --maximize)'{-M,--minimize}'[keep the file with the fewest links]' \
+ '(-n --dry-run)'{-n,--dry-run}"[don't actually link anything]" \
+ '(-o --ignore-owner -c --content)'{-o,--ignore-owner}'[ignore owner changes]' \
+ '(-O --keep-oldest)'{-O,--keep-oldest}'[keep the oldest file of multiple equal files]' \
+ '(-p --ignore-mode -c --content)'{-p,--ignore-mode}'[ignore changes of file mode]' \
+ '(-s --minimum-size)'{-s+,--minimum-size=}'[specify minimum size for files]: :_numbers -u bytes -d 1 size K M G T P E Z Y' \
+ '(-t --ignore-time -c --content)'{-t,--ignore-time}'[ignore timestamps (when testing for equality)]' \
+ \*{-v,--verbose}'[more verbose output]' \
+ '(-x --exclude)'{-x+,--exclude=}'[specify regular expression to exclude files]:regex' \
+ "$ign"{-h,--help}'[display usage information]' \
+ "$ign"{-V,--version}'[display version information]' \
+ '*:file or directory:_files'
diff --git a/Completion/Unix/Command/_imagemagick b/Completion/Unix/Command/_imagemagick
index 6553868d9..958b2741d 100644
--- a/Completion/Unix/Command/_imagemagick
+++ b/Completion/Unix/Command/_imagemagick
@@ -12,7 +12,7 @@ typeset -A opt_args
#
# and certainly many other things...
-formats=(jpg jpeg jp2 j2k jpc jpx jpf tif tiff miff ras bmp cgm dcx ps eps fig fits fpx gif mpeg pbm pgm ppm pcd pcl pdf pcx png rad rgb rgba rle sgi html shtml tga ttf uil xcf xwd xbm xpm yuv svg webp)
+formats=(jpg jpeg jp2 j2k jpc jpx jpf tif tiff miff ras bmp cgm dcx ps eps fig fits fpx gif heic mpeg pbm pgm ppm pcd pcl pdf pcx png rad rgb rgba rle sgi html shtml tga ttf uil xcf xwd xbm xpm yuv svg webp)
if (( $# )); then
_files "$@" -g "*.(#i)(${(j:|:)formats})(-.)"
diff --git a/Completion/Unix/Command/_ldd b/Completion/Unix/Command/_ldd
index 98ac41e14..bbac09225 100644
--- a/Completion/Unix/Command/_ldd
+++ b/Completion/Unix/Command/_ldd
@@ -26,6 +26,17 @@ else
'-s[display search path used]'
'-v[displays all dependency relationships]'
)
+ ;|
+ solaris2.<11->)
+ args+=(
+ '-c[disable configuration file used]'
+ '-D[skip deferred dependency loading]'
+ '-p[display unresolved parent and external references]'
+ '-S+[specify system root]:directory:_directories'
+ '-w[display unresolved weak references]'
+ '(- *)'{-\?,--help}'[display usage information]'
+ '(- *)'{-V,--version}'[display version information]'
+ )
;;
freebsd*)
args=(
diff --git a/Completion/Unix/Command/_less b/Completion/Unix/Command/_less
index b7e658d7e..f20a50818 100644
--- a/Completion/Unix/Command/_less
+++ b/Completion/Unix/Command/_less
@@ -88,17 +88,25 @@ _arguments -S -s -A "[-+]*" \
'(-\" --quotes)'{'-\"+',--quotes=}'[change quoting character]:quoting characters' \
'(-~ --tilde)'{-~,--tilde}"[don't display tildes after end of file]" \
'(-\# --shift)'{'-\#+',--shift=}"[specify amount to move when scrolling horizontally]:number of columns or fraction of screen width [.5]" \
+ '--autosave=[set additional actions which cause the history file to be saved]: : _values -s "" action
+ "(*)m[setting or clearing a mark]"
+ "(*)/[searching]"
+ "(*)\![running a shell command]"
+ "(m / !)\*[any action; same as m/!]"' \
+ '--emouse=[enable mouse features]:mouse feature:_sequence compadd - vscroll vdrag hscroll hdrag lclick rclick scroll drag hmove vmove move click all' \
+ '--end-prompt=[specify string to be printed after erasing the prompt]:string' \
'--exit-follow-on-close[exit F command on a pipe when writer closes pipe]' \
'--file-size[automatically determine the size of the input file]' \
'--follow-name[the F command changes file if the input file is renamed]' \
'--form-feed[stop scrolling when a form feed character (^L) is reached]' \
'--header=[set header size]:lines,columns,first-line' \
+ '--hilite-target=[highlight the target line]' \
'--incsearch[search file as each pattern character is typed in]' \
'--intr=[specify interrupt character instead of ^X]:char [^X]' \
'--line-num-width=[set the width of line number field]:width [7]' \
'--match-shift=[with -S, shift horizontally to make the match visible]:number of columns or fraction of screen width' \
'--modelines=[look for vim modelines]:number of lines to search' \
- '(--MOUSE)--mouse[enable mouse input]' \
+ '(--MOUSE)--mouse[enable mouse clicking and vertical scrolling]' \
'(--mouse)--MOUSE[enable mouse input, wheel down moves backwards in the file]' \
"--no-edit-warn[don't warn when using v command on a file opened by LESSOPEN]" \
'--no-histdups[remove duplicates from command history]' \
@@ -123,6 +131,7 @@ _arguments -S -s -A "[-+]*" \
"E[multi-file]" "F[from first line]" "K[highlight]"
"N[non-matching]" "R[literal]" "W[wrap]" -' \
'--show-preproc-errors[display a message if preprocessor exits with an error status]' \
+ '--past-eof[scrolling commands continue past end of file]' \
'--status-col-width=[set the width of the -J status column]:width [2]' \
'--status-line[highlight or color the entire line containing a mark]' \
'--use-backslash[subsequent options use backslash as escape char]' \
diff --git a/Completion/Unix/Command/_mpc b/Completion/Unix/Command/_mpc
index 45b181f55..83700d828 100644
--- a/Completion/Unix/Command/_mpc
+++ b/Completion/Unix/Command/_mpc
@@ -234,7 +234,7 @@ _mpc_play() {
}
_mpc_seek() {
- _message -e position 'position ([+-][HH:MM:SS]|<0-100>%%)'
+ _message -e position 'position ([+-][HH:MM:SS]|<0-100>%)'
}
_mpc_seekthrough() {
diff --git a/Completion/Unix/Command/_nano b/Completion/Unix/Command/_nano
index e2333b9f4..4f6bd8b0d 100644
--- a/Completion/Unix/Command/_nano
+++ b/Completion/Unix/Command/_nano
@@ -20,7 +20,7 @@ args=(
'(-N --noconvert -u --unix)'{-N,--noconvert}"[don't convert files from DOS/Mac format]"
'(-O --bookstyle)'{-O,--bookstyle}'[when justifying, leading whitespace means new paragraph]'
'(-P --positionlog)'{-P,--positionlog}'[remember cursor position]'
- '(-Q --quotestr)'{-Q+,--quotestr=}'[specify regular expression to match quoting]:quoting regex [^([ \t]*([!#%%\:;>|}]|//))+]'
+ '(-Q --quotestr)'{-Q+,--quotestr=}'[specify regular expression to match quoting]:quoting regex [^([ \t]*([!#%\:;>|}]|//))+]'
'(-R --restricted)'{-R,--restricted}'[restrict access to the file system]'
'(-S --softwrap)'{-S,--softwrap}'[soft-wrap long lines]'
'(-T --tabsize)'{-T+,--tabsize=}'[specify tab width]: :_numbers -u columns -l1 -d8 "tab width"'
diff --git a/Completion/Unix/Command/_ngrep b/Completion/Unix/Command/_ngrep
index 924597826..28d6ddc88 100644
--- a/Completion/Unix/Command/_ngrep
+++ b/Completion/Unix/Command/_ngrep
@@ -25,6 +25,8 @@ _arguments -s -S \
'-S+[set the upper limit on size of packets matched]:size (bytes)' \
'(-x)-W+[set the dump format]:packet display format:(normal byline single none)' \
'-c+[force the column width to the specified size]:columns' \
+ '-C[colorize matches in packet contents output]' \
+ '-u[show payload as UTF-8 characters]' \
'-P+[set the non-printable display char to what is specified]:character [.]' \
'-F+[read the bpf filter from the specified file]:file:_files' \
'-N[show sub protocol number]' \
diff --git a/Completion/Unix/Command/_nm b/Completion/Unix/Command/_nm
index a78eb7068..725ed3c39 100644
--- a/Completion/Unix/Command/_nm
+++ b/Completion/Unix/Command/_nm
@@ -69,7 +69,13 @@ if _pick_variant -r variant binutils=GNU elftoolchain=elftoolchain elfutils=elfu
'--special-syms[include special symbols in the output]'
'--synthetic[display synthetic symbols as well]'
"--target=[target object format]:target:(${${(@M)${(f)$(_call_program targets nm --help)}:#*supported targets:*}##*: })"
- '--unicode=[specify how to treat UTF-8 encoded unicode characters]:how_to_treat:(default show invalid hex escape highlight)'
+ '--unicode=[specify how to treat UTF-8 encoded unicode characters]: : _values "treatment [default]"
+ {d,default}"[no special treatment]"
+ {l,locale}"[convert to current locale]"
+ {i,invalid}"[not part of a valid string]"
+ {x,hex}"[<> enclosed hex byte sequences]"
+ {e,escape}"[escape sequences (\\\\uxxxx)]"
+ {h,highlight}"[escape sequences highlighted in red]"' \
'(-W --no-weak)'{-W,--no-weak}'[ignore weak symbols]'
'--with-symbol-versions[display version strings after symbol names]'
'--without-symbol-versions[not display of symbol version information]'
diff --git a/Completion/Unix/Command/_nmap b/Completion/Unix/Command/_nmap
index 2a507baa3..4325a5317 100644
--- a/Completion/Unix/Command/_nmap
+++ b/Completion/Unix/Command/_nmap
@@ -1,63 +1,125 @@
#compdef nmap
-local curcontext="$curcontext" state line suf ret=1
+local curcontext="$curcontext" ign dir ret=1
+local -a state line expl suf
+local -A opt_args
+local -aU scripts categories
-_arguments -C \
+(( $#words == 2 )) || ign='!(- *)'
+_arguments -s -S -C \
+ '!(-6)-4' \
'!-sI:zombie host:_hosts' \
- '!-P'{T,S,U}'+:port list' \
- '*-s-[specify scan type]:scan type:((S\:TCP\ SYN\ scan T\:TCP\ connect\(\)\ scan F\:stealth\ FIN\ scan X\:stealth\ Xmas\ tree\ scan N\:stealth\ null\ scan P\:ping\ scanning U\:UDP\ scan O\:IP\ protocol\ scan I\:idle\ scan A\:ACK\ scan W\:window\ scan R\:RPC\ scan L\:list\ scan V\:version\ detection))' \
- '-b[specify ftp relay host]:ftp relay host:_hosts' \
- '*-P-[specify probe types and options]:probe type/options:->probe-opts' \
- '-A[enable OS detection and version scanning]' \
- '-O[enable remote OS identification]' \
- '-6[enable IPv6 support]' \
- '-I[enable TCP reverse ident scanning]' \
- '-f[use tiny fragmented IP packets]' \
- '*-v[verbose mode]' \
- '-h[show help information]' \
- '*-o-[log results]:log format:->log-forms:log filename:_files' \
- '--resume[resume cancelled scan]:log filename:_files' \
- '--append-output[append results to any log files]' \
+ '!-P'{S,A,U,Y}'+:port list' \
+ '!-PO+:protocol list' \
+ '!(-F -p --exclude-ports)-sn' \
'-iL[read target specifications from file]:file:_files' \
'-iR[scan random hosts]:num hosts' \
- '-p[specify ports to try]:port numbers' \
+ '--exclude[specify hosts/networks to exclude]:host list:_sequence _hosts' \
+ '--excludefile[use exclude list from a file]:file:_files' \
+ '*-s-[specify scan type]:scan type:((S\:TCP\ SYN\ scan T\:TCP\ connect\(\)\ scan F\:stealth\ FIN\ scan X\:stealth\ Xmas\ tree\ scan N\:stealth\ null\ scan P\:ping\ scanning U\:UDP\ scan O\:IP\ protocol\ scan I\:idle\ scan A\:TCP\ ACK\ scan W\:TCP\ window\ scan M\:TCP\ Maimon\ scan R\:RPC\ scan L\:list\ scan Y\:SCTP\ INIT\ scan Z\:SCTP\ COOKIE-ECHO\ scan V\:version\ detection n\:no\ port\ scan C\:equivalent\ to\ --script=default))' \
+ '*-P-[specify probe types and options]:probe type/options:->probe-opts' \
+ '(-R --dns-servers --system-dns)-n[skip reverse DNS to speed things up]' \
+ '(-n)-R[always do reverse DNS on targets]' \
+ '--resolve-all[scan all addresses resolved via DNS]' \
+ '--unique[scan each address only once]' \
+ '(--dns-servers -n)--system-dns[use OS DNS resolver for reverse lookups]' \
+ '(--system-dns -n)--dns-servers[specify custom DNS servers for reverse lookups]:server:_sequence _hosts' \
+ "--disable-arp-ping[don't do ARP or IPv6 ND of locally connected ethernet hosts]" \
+ "--discovery-ignore-rst[don't treat RST replies as proof of a target being up]" \
+ '--traceroute[trace hop path to each host]' \
+ '--scanflags[customize TCP scan flags]:TCP flags:->tcp-flags' \
+ '-b[specify ftp relay host]:ftp relay host:_hosts' \
+ '-p+[specify ports to try]:port numbers' \
+ '--exclude-ports[exclude specified ports]:port numbers' \
'-F[scan only ports listed in services file]' \
- '-D[perform decoy scan]:host list:_sequence -s, _hosts' \
- '-S[specify source address]:address:_hosts' \
+ "-r[don't randomize order in which ports are scanned]" \
+ '--top-ports[scan most common ports]:number of ports' \
+ '--port-ratio[scan ports more common than specified ratio]: :_numbers -l 0.0 -m 1.0 ratio' \
+ "--allports[don't exclude any ports from version detection]" \
+ '(--version-light --version-all)--version-intensity[limit version probes to try]:level:((0\:light 1 2 3 4 5 6 7 8 9\:try\ all))' \
+ '(--version-intensity --version-all)--version-light[alias for --version-intensity 2]' \
+ '(--version-intensity --version-light)--version-all[alias for --version-intensity 9]' \
+ '--version-trace[show packets related to version scanning]' \
+ '-O[enable remote OS identification]' \
+ '--osscan-limit[limit OS detection to promising targets]' \
+ '(--osscan-guess --fuzzy)'{--osscan-guess,--fuzzy}'[guess OS more aggressively]' \
+ '--max-os-tries[set maximum number of OS detection tries against a target]:tries [5]' \
+ '--script=[specify Lua scripts]:script:->scripts' \
+ '--script-args[provide arguments to scripts]:arguments' \
+ '--script-args-file[provide script arguments in a file]:file:_files' \
+ '--script-trace[show all data sent and received]' \
+ '--script-updatedb[update the script database]' \
+ "$ign--script-help=[show help about scripts]:script:->scripts" \
+ --{min,max}-hostgroup'[set parallel scan group size]:size' \
+ --{min,max}-parallelism'[specify number of scans to perform in parallel]:number' \
+ --{min,max}-rtt-timeout'[set time to wait for a probe response]: :_numbers -u seconds time \:s ms m h' \
+ '--initial-rtt-timeout[specify initial probe timeout]: :_numbers -u seconds timeout \:s ms m h' \
+ '--max-retries[cap number of port scan probe retransmissions]:tries' \
+ '--host-timeout[specify maximum time for scanning a single host]: :_numbers -u seconds timeout \:s ms m h' \
+ '--script-timeout[set a ceiling on script execution time]:max time' \
+ '(--scan-delay --max-scan-delay)'--{max-,}'scan-delay[set amount of time between probes to a given host]: :_numbers -u seconds delay \:s ms m h' \
+ '--min-rate[send packets no slower than number per second]:packets' \
+ '--max-rate[send packets no faster than number per second]:packets' \
+ '--defeat-'{rst,icmp}'-ratelimit' \
+ '--nsock-engine:IO multiplexing engine:(iocp epoll kqueue poll select)' \
+ '-T[set a timing template]:timing policy:(paranoid sneaky polite normal aggressive insane)' \
+ '-f[fragment packets]' \
+ '--mtu=[specify MTU, with -f]:mtu' \
+ '-D[perform decoy scan]:host list:_sequence _hosts' \
+ '-S[spoof source address]:address:_hosts' \
'-e[specify interface to use]:network interface:_net_interfaces' \
- '-g[specify source port number]:port number' \
+ '(-g --source-port)'{-g,--source-port=}'[specify source port number]:port number' \
+ '--data=[append a custom payload to sent packets]:payload (hex string)' \
+ '--data-string=[append a custom ASCII string to sent packets]:string' \
'--data-length[add random data to packets]:data length' \
- '(-R)-n[skip reverse DNS to speed things up]' \
- '(-n)-R[always do reverse DNS on targets]' \
- "-r[don't randomize order in which ports are scanned]" \
- '-ttl[specify IPv4 time to live for sent packets]' \
+ '--ip-options=[send packets with specified IP options]:IP options:->ip-options' \
+ '--ttl[specify IPv4 time to live for sent packets]:time-to-live' \
'--randomize-hosts[scan hosts in random order]' \
- '-M[specify maximum number of parallel TCP connects]:maximum TCP connects' \
+ '--spoof-mac=[spoof your MAC address]:MAC address' \
+ '--proxies=[relay connections through HTTP/SOCKS4 proxies]:proxy:_sequence _urls' \
+ '--badsum[send packets with a bogus TCP/UDP/SCTP checksum]' \
+ '--adler32[use deprecated Adler32 instead of CRC32C for SCTP checksums]' \
+ '*-o-[log results]:log format:->log-forms: :{_files || _date_formats}' \
+ '*-v-[increase verbosity]::level' \
+ '*-d-[increase debugging level]::level' \
+ '--reason[show why a port is in a particular state]' \
+ '--stats-every=[print periodic timing stats]: :_numbers -u seconds interval \:s ms m h' \
+ '--open[only show open (or possibly open) ports]' \
'--packet-trace[show all packets sent in tcpdump-like format]' \
- '--version-trace[show packets related to version scanning]' \
- '--datadir[specify directory containing data files]:directory:_directories' \
- '-T[specify timing policy]:timing policy:(Paranoid Sneaky Polite Normal Aggressive Insane)' \
- '--host-timeout[specify maximum time for scanning a single host]:timeout (ms)' \
- '--max-rtt-timeout[maximum time for a probe response]:timeout (ms)' \
- '--min-rtt-timeout[minimum time to wait for a probe response]:time (ms)' \
- '--initial-rtt-timeout[specify initial probe timeout]:timeout (ms)' \
- '--max-parallelism[specify max number of scans to perform in parallel]:number' \
- '--min-parallelism[scan at least specified number of ports in parallel]:number' \
- '--scan-delay[specify minimum amount of time between probes]:delay (ms)' \
- '--interactive[go into interactive mode]' \
+ "$ign--iflist[list interfaces and routes]" \
+ '--append-output[append results to any log files]' \
+ "$ign--resume[resume aborted scan]:log filename:_files" \
+ '--noninteractive[disable runtime interactions via keyboard]' \
+ '(--webxml)--stylesheet[specify XSL stylesheet to transform XML output to HTML]:stylesheet:_urls' \
+ '(--stylesheet)--webxml[load stylesheet from Nmap.Org]' \
+ '--no-stylesheet[omit XSL stylesheet declaration from XML]' \
+ '-6[enable IPv6 scanning]' \
+ '(-O)-A[enable OS detection, version detection, script scanning and traceroute]' \
+ '--datadir=[specify custom Nmap data file location]:directory:_directories' \
+ '--servicedb=[specify custom services file]:services file:_files' \
+ '--versiondb=[specify custom service probes file]:service probes file:_files' \
+ '(--send-ip)--send-eth[send using raw ethernet frames]' \
+ '(--send-eth)--send-ip[send using raw IP packets]' \
+ '(--unprivileged)--privileged[assume user is fully privileged]' \
+ '(--privileged)--unprivileged[assume user lacks raw socket privileges]' \
+ '!--release-memory' \
+ "$ign"{-V,--version}'[print version number]' \
+ "$ign"{-h,--help}'[print help summary]' \
'*:host:_hosts' && ret=0
case $state in
probe-opts)
- _values -S '' 'probe type/option' \
- "0[don't try to ping hosts before scanning]" \
- 'T[use TCP "ping"]' \
- 'S[use SYN packets instead of ACK]' \
- 'U[send UDP probes]' \
- 'E[use a true ping]' \
- 'P[use an ICMP timestamp request]' \
- 'M[use a netmask request]' \
- 'B[use ACK and ICMP echo in parallel]' && ret=0
+ _values -S '' 'discovery probe type [R]' \
+ 'n[skip host discovery]' \
+ 'A[use TCP with ACK flag]' \
+ 'S[use TCP with SYN flag]' \
+ 'U[use UDP discovery probe]' \
+ 'Y[use SCTP discovery probe]' \
+ 'E[use ICMP echo request ]' \
+ 'P[use ICMP timestamp request]' \
+ 'M[use ICMP netmask request]' \
+ 'O[IP protocol ping]' \
+ 'R[use ARP]' && ret=0
;;
log-forms)
_values 'log format' \
@@ -65,13 +127,50 @@ case $state in
'X[XML]' \
'G[grepable]' \
'A[all]' \
- 'S[S|<ipT kiDdI3]' && ret=0
+ 'S[S|<rIpt kIddi3]' && ret=0
;;
- host-list)
- suf=()
- compset -P '*,'
+ tcp-flags)
+ compset -P '(URG|ACK|PSH|RST|SYN|FIN)#'
+ _wanted tcp-flags expl 'TCP flag' compadd -S '' \
+ URG ACK PSH RST SYN FIN && ret=0
+ ;;
+ ip-options)
+ _values -S ' ' "IP option" \
+ 'R[record route (9 slots available)]' \
+ 'T[record internet timestamps (9 slots)]' \
+ 'U[record timestamps and ip addresses (4 slots)]' \
+ 'L[loose source routing (8 slots)]:hop ip' \
+ 'S[strict source routing (8 slots)]:hop ip' && ret=0
+ ;;
+ scripts)
+ compset -P '*,(|+)'
compset -S ',*' || suf=(-qS ,)
- _hosts "$suf[@]" && ret=0
+
+ if [[ $PREFIX$SUFFIX = */* ]]; then
+ _files -g "*.nse(-.)"
+ return
+ fi
+
+ categories=( all )
+ for dir in \
+ ${opt_args[--datadir]:+${~opt_args[--datadir]}/scripts(/N)} \
+ $NMAPDIR/scripts(/N) \
+ ${${commands[$words[1]]:-$words[1]}:P:h:h}/share/nmap/scripts(/N) \
+ ~/.nmap/scripts(/N) \
+ ../share/nmap/scripts(/N) \
+ $NMAPDATADIR/scripts(/N) \
+ .
+ do
+ if [[ -r $dir/script.db ]]; then
+ scripts+=( ${${${(SM)${(f)"$(<$dir/script.db)"}#filename = \"[^.]##.}%.}#*\"} )
+ categories+=( ${${(s.,.)${(SM)${(f)"$(<$dir/script.db)"}##categories = [^\}]#}#*\{}//[ \"]/} )
+ else
+ scripts+=( $dir/*.nse(N:t:r) )
+ fi
+ done
+ _alternative \
+ 'categories:category:compadd $suf -a categories' \
+ 'scripts:script:compadd -M "r:|-=* r:|=*" $suf -a scripts' && ret=0
;;
esac
diff --git a/Completion/Unix/Command/_numfmt b/Completion/Unix/Command/_numfmt
index 999c412a1..dd8f6182f 100644
--- a/Completion/Unix/Command/_numfmt
+++ b/Completion/Unix/Command/_numfmt
@@ -15,6 +15,7 @@ _arguments -S \
'(H)--padding=[pad the output to specified width]:width; positive - right-align; negative - left-align' \
'(H)--round=[use specified method for rounding when scaling]:method [from-zero]:(up down from-zero towards-zero nearest)' \
'(H)--suffix=[add suffix to output numbers and accept optional suffix in input numbers]:suffix' \
+ '(H)--unit-separator=[insert separator between number and unit on output]:separator' \
"(H)--to=[auto-scale output numbers to specified unit]:unit:$units" \
'(H)--to-unit=[specify output unit size]:unit size [1]' \
'(H -z --zero-terminated -d --delimiter)'{-z,--zero-terminated}'[line delimiter is NUL, not newline]' \
diff --git a/Completion/Unix/Command/_objdump b/Completion/Unix/Command/_objdump
index 71a615c97..0a8820327 100644
--- a/Completion/Unix/Command/_objdump
+++ b/Completion/Unix/Command/_objdump
@@ -67,8 +67,13 @@ case $variant in
'!(--no-recurse-limit)--recurse-limit'
'--no-recurse-limit[disable demangling recursion limit]'
'(-w --wide)'{-w,--wide}'[format output for more than 80 columns]'
- '-U+[specify how to display unicode characters]:method:(d l e x h i)'
- '--unicode=[specify how to display unicode characters]:method:(default locale escape hex highlight invalid)'
+ '(-U --unicode)'{-U+,--unicode=}'[specify how to treat UTF-8 encoded unicode characters]: : _values "treatment [default]"
+ {d,default}"[no special treatment]"
+ {l,locale}"[convert to current locale]"
+ {i,invalid}"[not part of a valid string]"
+ {x,hex}"[<> enclosed hex byte sequences]"
+ {e,escape}"[escape sequences (\\\\uxxxx)]"
+ {h,highlight}"[escape sequences highlighted in red]"' \
'(-z --disassemble-zeroes)'{-z,--disassemble-zeroes}"[don't skip blocks of zeroes when disassembling]"
'--start-address=[only process data whose address is >= ADDR]:address'
diff --git a/Completion/Unix/Command/_opustools b/Completion/Unix/Command/_opustools
index 1fd97798a..c860a170f 100644
--- a/Completion/Unix/Command/_opustools
+++ b/Completion/Unix/Command/_opustools
@@ -14,7 +14,7 @@ case $service in
'--cvbr[use constrained variable bitrate encoding]' \
'--downmix-mono[downmix to mono]' \
'--downmix-stereo[downmix to stereo (if >2 channels)]' \
- '--expect-loss[set expected packet loss]:expected packet loss (%%) (0-100) [0]' \
+ '--expect-loss[set expected packet loss]:expected packet loss (%) (0-100) [0]' \
'--framesize[set maximum frame size]:maximum frame size (milliseconds) [20]:(2.5 5 10 20 40 60)' \
'--hard-cbr[use hard constant bitrate encoding]' \
'--max-delay[set maximum container delay]:maximum container delay (milliseconds) (0-1000) [1000]' \
@@ -57,7 +57,7 @@ case $service in
'--no-dither[do not dither 16-bit output]' \
'--float[output 32-bit floating-point samples]' \
'--force-wav[force RIFF wav header on output]' \
- '--packet-loss[simulate random packet loss]:packet loss probability (%%) (0-100)' \
+ '--packet-loss[simulate random packet loss]:packet loss probability (%) (0-100)' \
'--save-range[save check values for every frame to a file]:output for check values:_files'
;;
opusinfo)
diff --git a/Completion/Unix/Command/_pandoc b/Completion/Unix/Command/_pandoc
index 243b1ac8b..0bf017882 100644
--- a/Completion/Unix/Command/_pandoc
+++ b/Completion/Unix/Command/_pandoc
@@ -214,6 +214,7 @@ _arguments -s \
'--highlight-style=[specify coloring style to be used in highlighted source code]: :_pandoc_highlight_style' \
'(- :)--print-highlight-style=[prints a JSON version of a highlighting style]: :_pandoc_highlight_style' \
'--syntax-definition=[load a KDE XML syntax definition file]:file:_files -g "*.xml(-.)"' \
+ '--syntax-highlighting=[specify method to use for syntax highlighting]:method' \
\*{-H+,--include-in-header=}'[include contents of file, verbatim, at the end of the header, implies --standalone]:file:_files' \
\*{-B+,--include-before-body=}'[include contents of file, verbatim, at the beginning of the document body, implies --standalone]:file:_files' \
\*{-A+,--include-end-body=}'[include contents of file, verbatim, at the end of the document body, implies --standalone]:file:_files' \
diff --git a/Completion/Unix/Command/_patchutils b/Completion/Unix/Command/_patchutils
index a5f6441b1..83bf1d67f 100644
--- a/Completion/Unix/Command/_patchutils
+++ b/Completion/Unix/Command/_patchutils
@@ -13,6 +13,9 @@ case $service in
'(-z --decompress)'{-z,--decompress}'[decompress .gz and .bz2 files]'
)
;|
+ (combine|inter|filter|flip)diff)
+ args+=( '--in-place[write output to original input files]' )
+ ;|
interdiff|combinediff|flipdiff)
args+=(
'(-q --quiet)'{-q,--quiet}'[quieter output]'
@@ -22,6 +25,7 @@ case $service in
'(-B --ignore-blank-lines)'{-B,--ignore-blank-lines}'[ignore changes whose lines are all blank]'
'(-i --ignore-case)'{-i,--ignore-case}'[ignore case differences]'
'(-b --ignore-space-change)'{-b,--ignore-space-change}'[ignore changes in the amount of whitespace]'
+ '--color=-[colorize the output]::when [auto]:(never always auto)'
'!(--in-place)--interpolate' '!-h'
'!(--no-revert-omitted --in-place)--combinediff'
'!(--no-revert-omitted)--flip'
@@ -33,7 +37,6 @@ case $service in
"--no-revert-omitted[don't revert files changed in only the first patch]"
)
;;
- flipdiff) args+=( '--in-place[write output to original input files]' ) ;;
filterdiff|grepdiff|lsdiff)
args+=(
'(-i --include)'{-i,--include}'[include only files matching pattern]:pattern:_files'
@@ -42,6 +45,8 @@ case $service in
'--lines=[only list hunks containing lines within specified range]:range'
'(-F --files)'{-F+,--files=}'[only list files within specified range]:range'
'--strip=[remove specified number of pathname components before displaying]:components'
+ '--git-prefixes=[specify handling of a/ and b/ prefixes in git diffs]:handling:(strip keep)'
+ '--git-extended-diffs=[process git diffs without hunks]:action [include]:(exclude include)'
'--addprefix=[insert specified path prefix before displaying path names]:prefix:_directories'
'*:diff file:_files'
)
@@ -68,7 +73,7 @@ case $service in
'--format=[use specified output format]:format:(unified context)'
'--addnewprefix=[insert specified path prefix before new file path names]:prefix:_directories'
'--addoldprefix=[insert specified path prefix before original file path names]:prefix:_directories'
- '--as-numbered-lines=[display lines of selected hunks]:line numbers:(before after)'
+ '--as-numbered-lines=[display lines of selected hunks]:line numbers:(before after original-before original-after)'
"--remove-timestamps[don't include timestamps in output]"
)
;|
@@ -103,5 +108,6 @@ case $service in
;;
esac
+
_arguments -s $args
diff --git a/Completion/Unix/Command/_pgrep b/Completion/Unix/Command/_pgrep
index b7009eafb..b3ef86223 100644
--- a/Completion/Unix/Command/_pgrep
+++ b/Completion/Unix/Command/_pgrep
@@ -1,8 +1,7 @@
-#compdef pgrep pkill
+#compdef pgrep pkill pidwait
# Notes:
-# - We assume that Linux systems use procps-ng - specifically, procps-ng >=3.3.4
-# (which changed the behaviour of -f and added -a)
+# - We assume that Linux systems use procps-ng
# - We don't really need to keep pgopts and pkopts separate, but it seems like
# it should make things a bit easier to follow
@@ -17,13 +16,13 @@ typeset -a arguments sig_arguments aopts
arguments=(
'-a[include process ancestors in match list]'
'-c+[match only on specified login class]:login class:_login_classes'
- '(-F --pidfile)'{-F+,--pidfile=}'[match only processes in specified PID file]:PID file:_files'
+ '(-F --pidfile -p --pid)'{-F+,--pidfile=}'[match only processes in specified PID file]:PID file:_files'
'(-f --full)'{-f,--full}'[match against full command line]'
'(-G --group)'{-G+,--group=}'[match only on specified real group IDs]: :_sequence _groups'
'(-g --pgroup)'{-g+,--pgroup=}'[match only on specified process group IDs]: :->pgid'
'(: * -)'{-h,--help}'[display help information]'
'-I[request confirmation before signalling each process]'
- '-i[ignore case distinctions]'
+ '(-i --ignore-case)'{-i,--ignore-case}'[ignore case distinctions]'
'-j+[match only on specified jail IDs]:jail:_sequence _jails -0 -o jid'
'(-L --logpidfile)'{-L,--logpidfile}'[fail if PID file not locked (with -F)]'
'(-N)-M+[extract name list from specified core]:core file:_files'
@@ -67,15 +66,25 @@ arguments=(
case $OSTYPE in
linux*)
# Note: We deliberately exclude -v but not --inverse from pkill
- pgopts=AacdFfGghLlnoOPrstUuVvwx-
- pkopts=AceFfGgHhLnoOPstUuVx-
+ pgopts=AacdFfGghLlnopOPQrstUuVvwx-
+ pkopts=AceFfGgHhLmnoOPstUuVx-
+ pwopts=AceFfGghiLnOoPpQrstUuVx-
arguments=(
${arguments:#((#s)|*\))(\*|)-[acl]*}
'(-c --count)'{-c,--count}'[display count of matching processes]'
+ '(-p --pid -F --pidfile)'{-p+,--pid=}'[match process PIDs]: :_sequence _pids'
+ '(-Q --shell-quote)'{-Q,--shell-quote}'[output the command line in shell-quoted form]'
+ )
+ [[ $service == pkill ]] && arguments+=(
+ '(-m --mrelease)'{-m,--mrelease}'[release process memory immediately after kill]'
)
[[ $service == pgrep ]] && arguments+=(
'(-a -l --list-full --list-name)'{-a,--list-full}'[display full command line]'
'(-a -l --list-full --list-name)'{-l,--list-name}'[display process name]'
+ '--quiet[suppress all normal output]'
+ )
+ [[ $service == pidwait ]] && arguments+=(
+ '(-e --echo)'{-e,--echo}'[display PIDs before waiting]'
)
;;
dragonfly*|freebsd*)
@@ -110,7 +119,9 @@ case $OSTYPE in
;;
esac
-if [[ $service == pgrep ]]; then
+if [[ $service == pidwait ]]; then
+ arguments=( ${(M)arguments:#((#s)|*\))(\*|)-[$pwopts]*} )
+elif [[ $service == pgrep ]]; then
arguments=( ${(M)arguments:#((#s)|*\))(\*|)-[$pgopts]*} )
else
arguments=( ${(M)arguments:#((#s)|*\))(\*|)-[$pkopts]*} )
@@ -140,7 +151,7 @@ fi
arguments+=( $sig_arguments + o '*: :->pname' )
-[[ $OSTYPE == linux* ]] || aopts+=( -A '*-' )
+[[ $OSTYPE == linux* ]] || aopts+=( -A '-?*' )
_arguments -C -s -S $aopts : $arguments && ret=0
# complete comma-separated list of various IDs
diff --git a/Completion/Unix/Command/_pmap b/Completion/Unix/Command/_pmap
index 5fd92ab9e..2226d3329 100644
--- a/Completion/Unix/Command/_pmap
+++ b/Completion/Unix/Command/_pmap
@@ -1,11 +1,11 @@
#compdef pmap
if _pick_variant procps=procps-ng unix -V 2>/dev/null; then
- # based on procps-ng-3.3.15
_arguments -s \
'(exit -A --range)'{-A+,--range}'[limit results to the specified address range]:low,high: ' \
'(exit -q --quiet)'{-q,--quiet}'[do not display some header or footer lines]' \
'(exit -p --show-path)'{-p,--show-path}'[show full path to files in the mapping column]' \
+ '(exit -k --use-kernel-name)'{-k,--use-kernel-name}'[use names provided by kernel]' \
'(exit)*: :_pids' \
+ '(format)' \
'(exit)'{-d,--device}'[show the device format]' \
diff --git a/Completion/Unix/Command/_postfix b/Completion/Unix/Command/_postfix
index 006c950e3..8c172b424 100644
--- a/Completion/Unix/Command/_postfix
+++ b/Completion/Unix/Command/_postfix
@@ -67,7 +67,7 @@ case $service in
'-d[delete]:queue id:_postfix_queue_id' \
'-h[hold]:queue id:_postfix_queue_id' \
'-H[release]:queue id:_postfix_queue_id' \
- '*-r[requeue]:queue id, or "ALL":_postfix_queue_id' \
+ '*-r[requeue]:queue id:_phony ALL _postfix_queue_id' \
'1:queue:(hold incoming active deferred)'
;;
(postqueue)
diff --git a/Completion/Unix/Command/_ps b/Completion/Unix/Command/_ps
index 57fee983c..7e3db03a7 100644
--- a/Completion/Unix/Command/_ps
+++ b/Completion/Unix/Command/_ps
@@ -206,6 +206,7 @@ case $OSTYPE in
'-M[show security data]'
'(--forest -H)'{--forest,-H}'[show process hierarchy]'
'-P[add psr column]'
+ '--delimiter=[specify column delimiter]:string'
'--headers[repeat header lines, one per page of output]'
'(--cols --columns --width)'{--cols,--columns,--width}'[set screen width]:width'
'(--lines --rows)'{--lines,--rows}'[set screen height]'
diff --git a/Completion/Unix/Command/_rar b/Completion/Unix/Command/_rar
index d1d381974..27120dfa5 100644
--- a/Completion/Unix/Command/_rar
+++ b/Completion/Unix/Command/_rar
@@ -15,17 +15,19 @@ common=(
'-dh[open shared files]'
'-ep[exclude paths from name]'
'-f[freshen files]'
- '-idn[hide archived names]'
- '-idp[disable percentage display]'
+ '-id-[disable messages]: : _values -s "" message
+ "c[copyright]" "d[done]" "n[archived names]" "p[percentage indicator]" "q[quiet]"' \
'-ierr[send all messages to stderr]'
'-inul[disable all messages]'
'-kb[keep broken extracted files]'
'-o\+[overwrite existing files]'
'-o\-[do not overwrite existing files]'
+ '-ol-[save symbolic links as the link instead of the file]:: :((a\:absolute s\:skip))' \
'-ow[save or restore file owner and group]'
'-p+:password'
'-p\-[do not query password]'
'-r[recurse subdirectories]'
+ '-si-[read data from standard input]::name'
'-ta+[process files modified after a date]:date (YYYYMMDDHHMMSS)'
'-tb+[process files modified before a date]:date (YYYYMMDDHHMMSS)'
'-tn+[process files newer than a specified time]:time'
@@ -56,9 +58,8 @@ case $service in
else
_arguments -S \
'-ep3[expand paths to full including the drive letter]' \
- '-idc[disable ___ display]' \
- '-idd[disable ___ display]' \
- '-idq[disable ___ display]' \
+ '-mes[skip encrypted files]' \
+ '-op-[set output path for extracted files]:path:_directories' \
'-n+:file to include:_files' \
'-n@+:file of files to include:_files' \
"$common[@]" \
@@ -106,6 +107,7 @@ case $service in
'-en[do not put end of archive block]' \
'-ep1[exclude base directory from names]' \
'-ep2[expand paths to full]' \
+ '-ep4-[exclude path prefix from names]:prefix' \
'-hp[encrypt both file data and headers]' \
'-ilog[log errors to file (registered versions only)]' \
'-isnd[enable sound]' \
@@ -113,7 +115,6 @@ case $service in
'-m+[set compression level]:compression level:(( 0\:store 1\:fastest 2\:fast 3\:normal 4\:good 5\:maximal ))' \
'-md+[dictionary size]:dictionary size (KB):( 64 128 256 512 1024 2048 4096 a b c d e f g )' \
'-ms[specify file types to store]' \
- '-ol[save symbolic links as the link instead of the file]' \
'-p[set password]' \
'-r0[recurse subdirectories for wildcard names only]' \
'-rr[add data recovery record]' \
diff --git a/Completion/Unix/Command/_readelf b/Completion/Unix/Command/_readelf
index 43cbc81c6..a0ecdaf2a 100644
--- a/Completion/Unix/Command/_readelf
+++ b/Completion/Unix/Command/_readelf
@@ -2,11 +2,11 @@
local variant args sections
-sections=( .bss .data .dynamic .dynsym .got .interp .shstrtab .symtab .text )
+sections=( .bss .comment .data .dynamic .dynsym .got .interp .shstrtab .symtab .text )
_pick_variant -r variant elftoolchain=elftoolchain elfutils=elfutils binutils --version
args=(
- '(-a --all)'{-a,--all}'[show all tables]'
+ '(-a --all -h --file-header -l --program-headers --segments -S --section-headers --sections -r --relocs -d --dynamic -V --version-info -A --arch-specific -I --histogram --got-contents)'{-a,--all}'[show all tables]'
'(-g --section-groups)'{-g,--section-groups}'[show section groups]'
'(-h --file-header)'{-h,--file-header}'[show file header]'
'(-l --program-headers --segments)'{-l,--program-headers,--segments}'[show program headers]'
@@ -57,8 +57,12 @@ case $variant in
'(-C)--demangle=-[decode symbol names]::style [auto]:(none auto gnu-v3 java gnat dlang rust)'
'!(--no-recurse-limit)--recurse-limit'
'--no-recurse-limit[disable demangling recursion limit]'
- '-U+[specify how to display unicode characters]:method:(d l e x h i)'
- '--unicode=[specify how to display unicode characters]:method:(default locale escape hex highlight invalid)'
+ '(-U --unicode)'{-U+,--unicode=}'[specify how to treat UTF-8 encoded unicode characters]: : _values "treatment [locale]"
+ {l,locale,d,default}"[convert to current locale]"
+ {i,invalid}"[not part of a valid string]"
+ {x,hex}"[<> enclosed hex byte sequences]"
+ {e,escape}"[escape sequences (\\\\uxxxx)]"
+ {h,highlight}"[escape sequences highlighted in red]"' \
'(-X --extra-sym-info)'{-X,--extra-sym-info}'[display extra information when showing symbols]'
'!(-X --extra-sym-info)--no-extra-sym-info'
'(-L --lint --enable-checks)'{-L,--lint,--enable-checks}'[display warning messages for possible problems]'
@@ -71,6 +75,7 @@ case $variant in
'--ctf-symbols=[use specified section as the CTF external symbol table]:section'
'--ctf-strings=[use specified section as the CTF external string table]:section'
'--sframe=-[display SFrame info from section]::section name [.sframe]'
+ '(-a --all)--got-contents[display GOT section contents]'
'(-T --silent-truncation)'{-T,--silent-truncation}"[if a symbol name is truncated, don't add ... suffix]"
)
;;
diff --git a/Completion/Unix/Command/_ruby b/Completion/Unix/Command/_ruby
index 82111b455..eebf6c25f 100644
--- a/Completion/Unix/Command/_ruby
+++ b/Completion/Unix/Command/_ruby
@@ -1,8 +1,8 @@
#compdef ruby irb erb ruby-mri -P (ruby|[ei]rb)[0-9.]# -value-,RUBY(LIB|OPT|PATH),-default-
-local curcontext="$curcontext" state line expl desc RUBY ret=1
+local curcontext="$curcontext" state line expl desc RUBY variant ret=1
typeset -A opt_args
-local -a opts irb erb all common charsets suf
+local -a opts irb erb all common charsets suf jit_opts
all=(
'*-r+[require the library before executing your script]:library name:->library'
@@ -47,23 +47,112 @@ opts=(
'--backtrace-limit=[limit the maximum length of backtrace]:number'
'!'{-y,--yydebug}
'!--dump=:target:(version copyright usage yydebug syntax parsetree parsetree_with_comment insns)'
- '(--mjit --yjit)--jit[enable jit for the platform]'
- '(--jit --yjit)--mjit[enable C compiler-based JIT compiler]'
- '(--jit --mjit)--yjit[enable in-process JIT compiler]'
- '--mjit-warnings[enable printing JIT warnings]'
- '--mjit-debug[enable JIT debugging (very slow)]'
- '--mjit-wait[wait until JIT compilation finishes every time (for testing)]'
- '--mjit-save-temps[save JIT temporary files]'
- '--mjit-verbose=-[print JIT logs of level num or less to stderr]:maximum log level [0]'
- '--mjit-max-cache=-[specify max number of methods to be JIT-ed in a cache]:number [100]'
- '--mjit-min-calls=-[specify number of calls to trigger JIT]:calls [10000]'
- '--yjit-stat[enable collecting YJIT statistics]'
- '--yjit-exec-mem-size=-[size of executable memory block in MiB]:mem size'
- '--yjit-call-threshold=-[number of calls to trigger JIT]:number'
- '--yjit-max-versions=-[maximum number of versions per basic block]:versions'
- '--yjit-greedy-versioning[greedy versioning mode]'
)
+if [[ $service == ruby[0-9.]# ]]; then
+ _pick_variant -r variant -c "$service --version" \
+ ruby_no_jit='ruby ([01].|2.[0-5])' \
+ ruby_experimental_jit='ruby (2.[67]|3.0)' \
+ ruby31='ruby 3.1' ruby32='ruby 3.2' ruby33='ruby 3.3' ruby34='ruby 3.4' \
+ ruby40='ruby 4.0' ruby41_higher
+
+ if [[ $variant != "ruby_no_jit" ]]; then
+ jit_opts=('(--jit --mjit --yjit --rjit --zjit)--jit[enable default JIT for the platform]')
+ fi
+
+ case "$variant" in
+ (ruby_experimental_jit|ruby31)
+ jit_opts+=(
+ '--jit-warnings[enable printing JIT warnings]'
+ '--jit-debug[enable JIT debugging (very slow)]'
+ '--jit-wait[wait until JIT compilation finishes every time (for testing)]'
+ '--jit-save-temps[save JIT temporary files]'
+ '--jit-verbose=-[print JIT logs of level num or less to stderr]:log level'
+ '--jit-max-cache=-[specify max number of methods to be JIT-ed in a cache]:num'
+ '--jit-min-calls=-[specify number of calls to trigger JIT]:num'
+ )
+ ;|
+ (ruby31|ruby32)
+ jit_opts+=(
+ '(--jit --mjit --yjit)--mjit[enable C compiler-based JIT compiler]'
+ '(--jit --mjit --yjit)--yjit[enable in-process JIT compiler]'
+ )
+ ;|
+ (ruby31|ruby32)
+ jit_opts+=(
+ '--mjit-warnings[enable printing JIT warnings]'
+ '--mjit-debug[enable JIT debugging (very slow)]'
+ '--mjit-wait[wait until JIT compilation finishes every time (for testing)]'
+ '--mjit-save-temps[save JIT temporary files]'
+ '--mjit-verbose=-[print JIT logs of level num or less to stderr]:log level'
+ '--mjit-max-cache=-[specify max number of methods to be JIT-ed in a cache]:num'
+ '--mjit-min-calls=-[specify number of calls to trigger JIT]:num'
+ '--yjit-max-versions=[Maximum number of versions per basic block (default: 4)]:num'
+ '--yjit-greedy-versioning[Greedy versioning mode (default: disabled)]'
+ )
+ ;|
+ (ruby32|ruby33|ruby34|ruby40|ruby41_higher)
+ jit_opts+=(
+ '--yjit-stats[Enable collecting YJIT statistics]'
+ '--yjit-exec-mem-size=[Hard limit on executable memory block in MiB]:mem size'
+ '--yjit-call-threshold=[Number of calls to trigger JIT]:num'
+ )
+ ;|
+ (ruby33|ruby34|ruby40|ruby41_higher)
+ # mjit was removed since Ruby 3.3
+ jit_opts+=(
+ '--yjit-cold-threshold=[Global calls after which ISEQs not compiled (default: 200K)]:num'
+ '--yjit-disable[Disable YJIT for lazily enabling it with RubyVM::YJIT.enable]'
+ '--yjit-code-gc[Run code GC when the code size reaches the limit]'
+ '--yjit-perf[Enable frame pointers and perf profiling]'
+ '--yjit-trace-exits[Record Ruby source location when exiting from generated code]'
+ '--yjit-trace-exits-sample-rate=[Trace exit locations only every Nth occurrence]:num'
+ )
+ ;|
+ (ruby34|ruby40|ruby41_higher)
+ jit_opts+=(
+ '--yjit-mem-size=[Soft limit on YJIT memory usage in MiB (default: 128)]:mem size'
+ "--yjit-log=[Enable logging of YJIT's compilation activity]: :_files"
+ )
+ ;|
+ (ruby33|ruby34)
+ # ruby 3.3 and 3.4 provide rjit
+ jit_opts+=(
+ '(--jit --yjit --rjit)--yjit[Enable in-process JIT compiler]'
+ '--rjit-exec-mem-size=[Size of executable memory block in MiB (default: 64)]:mem size'
+ '--rjit-call-threshold=[Number of calls to trigger JIT (default: 10)]:num'
+ '--rjit-stats[Enable collecting RJIT statistics]'
+ '--rjit-disable[Disable RJIT for lazily enabling it with RubyVM::RJIT.enable]'
+ '--rjit-trace[Allow TracePoint during JIT compilation]'
+ '--rjit-trace-exits[Trace side exit locations]'
+ )
+ ;|
+ (ruby40|ruby41_higher)
+ # zjit was introduced since ruby 4
+ jit_opts+=(
+ '(--jit --yjit --zjit)--yjit[Enable in-process JIT compiler]'
+ '(--jit --yjit --zjit)--zjit[enable method-based JIT compiler]'
+ '--zjit-mem-size=[Max amount of memory that ZJIT can use in MiB (default: 128)]:mem size'
+ '--zjit-call-threshold=[Number of calls to trigger JIT (default: 30)]:num'
+ '--zjit-num-profiles=[Number of profiled calls before JIT (default: 5)]:num'
+ '--zjit-stats-quiet[Collect ZJIT stats and suppress output]'
+ '--zjit-stats=-[Collect ZJIT stats]: :_files'
+ '--zjit-disable[Disable ZJIT for lazily enabling it with RubyVM::ZJIT.enable]'
+ '--zjit-perf[Dump ISEQ symbols into /tmp/perf-{}.map for Linux perf]'
+ '--zjit-log-compiled-iseqs=[Log compiled ISEQs to the file. The file will be truncated]: :_files'
+ '--zjit-trace-exits=-[Record source on side-exit]:counter'
+ '--zjit-trace-exits-sample-rate=[Frequency at which to record side exits]:frequency'
+ )
+ ;|
+ (ruby41_higher)
+ jit_opts+=(
+ '--zjit-trace-compiles[Record compilation phases as Perfetto trace events]'
+ '--zjit-trace-invalidation[Record invalidation events as Perfetto trace events]'
+ )
+ ;|
+ esac
+fi
+
irb=(
'-f[suppress read of ~/.irbrc]'
$opts[(r)*-d\[*]
@@ -121,7 +210,7 @@ case "$service" in
;;
ruby[0-9.]#)
RUBY=$words[1]
- _arguments -C -s -S : $opts $all $common && ret=0
+ _arguments -C -s -S : $opts $all $common $jit_opts && ret=0
;;
irb[0-9.]#)
RUBY=${words[1]/irb/ruby}
diff --git a/Completion/Unix/Command/_screen b/Completion/Unix/Command/_screen
index 9336ae82d..65cb63e31 100644
--- a/Completion/Unix/Command/_screen
+++ b/Completion/Unix/Command/_screen
@@ -76,6 +76,7 @@ _arguments -C \
'-m[ignore $STY variable, do create a new screen session]' \
'-O[choose optimal output rather than exact vt100 emulation]' \
'-p[preselect the named window]:window number or name:((\=\:windowlist -\:blank\ window \:window\ number))' \
+ '-P[enable authentication]' \
'-q[quiet startup, exit with non-zero return code if unsuccessful]' \
'-Q[send response to stdout of command query process]:screen command:(echo info lastmsg number select time title windows)' \
'-r[reattach to a detached screen process]: :->detached-sessions' \
diff --git a/Completion/Unix/Command/_script b/Completion/Unix/Command/_script
index 25f8ea35f..431a112e1 100644
--- a/Completion/Unix/Command/_script
+++ b/Completion/Unix/Command/_script
@@ -30,7 +30,7 @@ case $OSTYPE in
"(-T --log-timing -t --timing $hlp)"{-T+,--log-timing=}'[log timing information to file]:file:_files'
"(-m --logging-format $hlp)"{-m+,--logging-format=}'[specify log file format]:format:(classic advanced)'
"(-a --append $hlp)"{-a,--append}'[append to the log file]'
- "(-c --command $hlp)"{-c,--command=}'[run specified command instead of a shell]:command:_cmdstring'
+ "(-c --command $hlp --)"{-c,--command=}'[run specified command instead of a shell]:command:_cmdstring'
"(-e --return $hlp)"{-e,--return}'[return exit status of the child process]'
"(-f --flush $hlp)"{-f,--flush}'[flush output after each write]'
"(-E --echo $hlp)"{-E+,--echo=}'[echo input]:when:(auto always never)'
@@ -40,6 +40,7 @@ case $OSTYPE in
"(-t --timing $hlp)"{-t-,--timing=-}'[output timing data]::timing file:_files'
'(- 1)'{-h,--help}'[display help information]'
'(- 1)'{-V,--version}'[display version information]'
+ '!--:*::: : _normal $service'
)
;;
darwin*|dragonfly*|netbsd*|freebsd*)
diff --git a/Completion/Unix/Command/_sh b/Completion/Unix/Command/_sh
index f0f18d4bb..d50b81ccc 100644
--- a/Completion/Unix/Command/_sh
+++ b/Completion/Unix/Command/_sh
@@ -1,36 +1,151 @@
-#compdef sh ash csh dash ksh ksh88 ksh93 mksh oksh pdksh rc tcsh yash
+#compdef sh ash csh dash ksh ksh88 ksh93 lksh mksh oksh osh pdksh posh rc rksh rksh93 tcsh yash ysh
-local bourne argv0
-local -a args all_opts=( -{{0..9},{A..Z},{a..z}} )
+(( $+functions[_sh_set_options] )) ||
+_sh_set_options() {
+ local MATCH MBEGIN MEND k_ v_
+ local -a opts_ tmp_ expl_
-[[ $service == (csh|?csh|fish|rc) ]] || bourne=1
+ tmp_=( ${(f)"$( _call_program options $words[1] -c '"set -o"' )"} )
-# Bourne-style shells support +x variants
-# @todo Uncomment when workers/45422 is fixed
-# (( bourne )) && all_opts+=( ${all_opts/#-/+} )
-# Bourne-style shells take argv[0] as the second argument to -c
-(( bourne )) && argv0=':argv[0]:'
+ # remove heading
+ [[ $tmp_[1] == (#i)*'current option'* ]] && tmp_=( $tmp_[2,-1] )
+ # convert osh/ysh syntax
+ [[ $tmp_[1] == set\ [+-]o\ * ]] && {
+ tmp_=( ${(@)tmp_##set [+-]o } )
+ tmp_=( ${tmp_:^tmp_} )
+ }
+ # loop since some shells arrange the options in columns
+ for k_ v_ in $=tmp_; do
+ opts_+=( $k_ )
+ done
-# All of the recognised shells support at least these arguments
-args=(
- "(1 -)-c[execute specified command string]: :_cmdstring$argv0"
- '-e[exit immediately on non-zero return]'
- '-i[act as interactive shell]'
- '-l[act as login shell]'
- '-x[print command trace]'
- '1:script file:_files'
- '*:: :_files'
-)
-# Bourne-style shells support -o/+o option. Not all of them support -ooption in
-# the same argument, but we'll allow it here for those that do
-(( bourne )) && args+=(
- '-o+[set specified option]:option:'
- '+o+[unset specified option]:option:'
-)
-# Since this is a generic function we don't know what other options these shells
-# support, but we don't want them to break the ones listed above, so we'll just
-# ignore any other single-alphanumeric option. Obviously this doesn't account
-# for long options
-args+=( '!'${^${all_opts:#(${(~j<|>)${(@M)${(@M)args#(*[\*\)]|)[+-]?}%[+-]?}})}} )
+ _wanted set-options expl_ 'set option' compadd -a "$@" - opts_
+}
-_arguments -s -S -A '-*' : $args
+local variant apat='[+-]?*'
+local -a args oopts
+
+case ${${(Q)words[1]}:t} in
+ r#ksh)
+ _pick_variant -r variant \
+ ksh93=showme \
+ mksh='utf8-#mode' \
+ oksh='csh-#history' \
+ '' \
+ -c '"set -o"'
+ ;;
+ sh)
+ _pick_variant -r variant \
+ zsh=junkie \
+ bash=onecmd \
+ ksh93=showme \
+ mksh='utf8-#mode' \
+ oksh='csh-#history' \
+ ksh=keyword \
+ dash=debug \
+ '' \
+ -c '"set -o"'
+ ;;
+esac
+case $variant in
+ bash|zsh) _$variant "$@"; return ;;
+ ?*) service=$variant ;;
+esac
+
+# bourne/ksh/posix-style shells. not meant to be totally accurate, but mostly
+if [[ $service != (csh|?csh|rc) ]]; then
+ args=(
+ # invocation options
+ '(1 -)-c[execute specified command string]: :_cmdstring:argv[0]:'
+ '-i[act as interactive shell]'
+ '-l[act as login shell]' # not defined by posix but very widely supported
+ '-o+[set specified option]: :_sh_set_options'
+ '+o+[unset specified option]: :_sh_set_options'
+ '(-c)-s[read commands from standard input]'
+ # set options. these are all defined by posix
+ '(-a +a)'{'-a[',"+a[don't "}'mark all variables for export]'
+ '(-b +b)'{'-b[',"+b[don't "}'report status of terminated background jobs immediately]'
+ '(-C +C)'{'-C[',"+C[don't "}'prevent output redirection from overwriting existing files]'
+ '(-e +e)'{'-e[',"+e[don't "}'exit immediately on non-zero return]'
+ '(-f +f)'{'-f[',"+f[don't "}'disable file globbing]'
+ '(-h +h)'{'-h[',"+h[don't "}'hash commands]'
+ '(-m +m)'{'-m[',"+m[don't "}'enable job control]'
+ '(-n +n)'{'-n[',"+n[don't "}'read (syntax-check) commands only]'
+ '(-u +u)'{'-u[',"+u[don't "}'treat unset variables as an error during parameter expansion]'
+ '(-v +v)'{'-v[',"+v[don't "}'print shell input lines as they are read]'
+ '(-x +x)'{'-x[',"+x[don't "}'print command trace]'
+ )
+
+ case $service in
+ dash)
+ args=(
+ ${args:#\(*\)[+-]h\[*}
+ '(-E +E -V +V)'{'-E[',"+E[don't "}'use emacs-style command-line editing]'
+ '(-I +I)'{'-I[',"+I[don't "}'ignore EOF]'
+ '(-E +E -V +V)'{'-V[',"+V[don't "}'use vi-style command-line editing]'
+ )
+ ;;
+ yash)
+ PREFIX= _sh_set_options -O oopts
+ oopts=( ${oopts:#cmdline} )
+ args+=(
+ '(- : *)--help[display help information]'
+ '(- : *)'{-V,--version}'[display version information]'
+ "(--profile)--noprofile[don't load ~/.yash_profile]"
+ "(--rcfile)--norcfile[don't load ~/.yashrc]"
+ '(--noprofile)--profile=[load specified file instead of ~/.yash_profile]:.yash_profile file:_files'
+ '(--norcfile)--rcfile=[load specified file instead of ~/.yashrc]:.yashrc file:_files'
+ ${${(M)args:#\(*\)-c\[*}/-c/--cmdline}
+ --$^oopts
+ ++$^oopts
+ )
+ ;;
+ *ksh*)
+ args+=(
+ '(-k +k)'{'-k[',"+k[don't "}'recognise parameter assignments anywhere in a command]'
+ '(-p +p)'{'-p[',"+p[don't "}'enable privileged mode]'
+ '(-r +r)'{'-r[',"+r[don't "}'enable restricted mode]'
+ )
+ ;|
+ oksh|r#[lm]ksh)
+ args+=(
+ '(-X +X)'{'-X[',"+X[don't "}'mark directories with trailing / when globbing]'
+ )
+ ;|
+ ksh93)
+ PREFIX= _sh_set_options -O oopts
+ oopts=( ${${oopts:#rc}//[_-]/} )
+ args+=(
+ '(-B +B)'{'-B[',"+B[don't "}'enable brace expansion]'
+ '(-D +D)'{'-D[',"+D[don't "}'display strings subject to language translation]'
+ '(-E +E --rc)'{'--rc[','-E[',"+E[don't "}'load $ENV or ~/.kshrc]'
+ '(-G +G)'{'-G[',"+G[don't "}'enable ** pattern (globstar)]'
+ '(-H +H)'{'-H[',"+H[don't "}'enable history expansion]'
+ '(-t +t)'{'-t[',"+t[don't "}'read one command and exit]'
+ --$^oopts
+ )
+ [[ $PREFIX == --n* ]] && args+=( --no$^oopts )
+ ;;
+ r#[lm]ksh)
+ args+=(
+ '(-U +U)'{'-U[',"+U[don't "}'enable UTF-8 support]'
+ '-T+[spawn on specified tty]:tty:_files -g "*(%c)"'
+ )
+ ;;
+ esac
+
+# others. these options are common to all of those currently enumerated
+else
+ apat='-?*'
+ args=(
+ '(1 -)-c[execute specified command string]: :_cmdstring'
+ '-e[exit immediately on non-zero return]'
+ '-i[act as interactive shell]'
+ '-l[act as login shell]'
+ '-x[print command trace]'
+ )
+fi
+
+args+=( '1:script file:_files' '*:: :_files' )
+
+_arguments -s -S -A $apat : $args
diff --git a/Completion/Unix/Command/_shutdown b/Completion/Unix/Command/_shutdown
index a237b14e0..fdadd3b12 100644
--- a/Completion/Unix/Command/_shutdown
+++ b/Completion/Unix/Command/_shutdown
@@ -1,35 +1,39 @@
#compdef shutdown
-local -a args
+local curcontext="$curcontext" variant="$OSTYPE" ret=1
+local -a state line args suffixes
-if [[ -d /etc/systemd ]]; then
- _arguments \
- '--help[display usage information]' \
- '(-H --halt)'{-H,--halt}'[halt the machine]' \
- '(-P --poweroff -h)'{-P,--poweroff,-h}'[power-off the machine (default)]' \
- '(-r --reboot)'{-r,--reboot}'[reboot the machine]' \
- "(--no-wall)-k[don't shutdown, just write wall message]" \
- "(-k)--no-wall[don't send a wall message]" \
- '-c[cancel pending shutdown]' \
- '1: :_guard "^-*" "time (now/hh\:mm/+mins)"' \
- '*:warning message'
- return
-fi
+[[ -d /run/systemd/system ]] && variant=systemd
-case $OSTYPE in
+case $variant in
+ systemd)
+ args=(
+ "(-k)--no-wall[don't send a wall message]"
+ '1: :->times'
+ '*:warning message'
+ + '(action)'
+ '(* : -)--help[display usage information]'
+ "(--no-wall)-k[don't shutdown, just write wall message]"
+ {-H,--halt}'[halt the machine]'
+ {-P,--poweroff,-h}'[power-off the machine (default)]'
+ {-r,--reboot}'[reboot the machine]'
+ '-c[cancel pending shutdown]'
+ )
+ ;;
*bsd*|dragonfly*|linux*|darwin*)
args=(
- '-h[halt the system after shutdown]'
- '-r[reboot the system]'
+ '(-p -r -c)-h[halt the system after shutdown]'
+ '(-p -h -c)-r[reboot the system]'
'-k[kick everybody off]'
'-n[prevent file system cache from being flushed]'
- '1: :_guard "^-*" "time (now/hh\:mm/+mins)"'
+ '1: :->times'
+ '(*)-[read warning message from standard input]' \
'*:warning message'
)
;|
*bsd*|dragonfly*)
args+=(
- '-p[turn off power after shutdown]'
+ '(-h -r -c)-p[turn off power after shutdown]'
)
;|
(net|open)bsd*)
@@ -39,13 +43,14 @@ case $OSTYPE in
)
;|
freebsd*|dragonfly*)
+ suffixes=( s:seconds :m:minutes h:hours )
args+=(
'-o[execute halt or reboot instead of sending a signal to init]'
)
;|
freebsd<12->.*)
args+=(
- '-c[power cycle the system instead of halting if possible]'
+ '(-h -r -p)-c[power cycle the system instead of halting if possible]'
)
;;
netbsd*)
@@ -74,4 +79,16 @@ case $OSTYPE in
;;
esac
-_arguments $args
+_arguments -C $args && ret=0
+
+if [[ -n $state ]]; then
+ if compset -P '+'; then
+ _numbers -u minutes "grace period" $suffixes
+ else
+ _alternative \
+ 'relative-times:relative time:{ compadd "$expl[@]" -S "" +; compadd "$expl[@]" now }' \
+ 'absolute-times: :_guard "^-*" "time ([yymmdd]hhmm)"' && ret=0
+ fi
+fi
+
+return ret
diff --git a/Completion/Unix/Command/_sleep b/Completion/Unix/Command/_sleep
new file mode 100644
index 000000000..677062ab9
--- /dev/null
+++ b/Completion/Unix/Command/_sleep
@@ -0,0 +1,25 @@
+#compdef sleep
+
+local sum inf fraction
+local -a expl units
+
+case $OSTYPE in
+ linux-gnu)
+ args=(
+ -S
+ '--help[display help information]'
+ '--version[display version information]'
+ )
+ ;& # fall-through
+ solaris*)
+ inf="_phony infinity --"
+ ;& # fall-through
+ darwin*|freebsd*)
+ units=( :s:seconds m:minutes h:hours d:days )
+ sum='*'
+ fraction='-f'
+ ;;
+esac
+
+_arguments $args \
+ "${sum}:interval:$inf _numbers $fraction -u seconds interval $units"
diff --git a/Completion/Unix/Command/_sqlite b/Completion/Unix/Command/_sqlite
index 218b92b4a..9b8431248 100644
--- a/Completion/Unix/Command/_sqlite
+++ b/Completion/Unix/Command/_sqlite
@@ -50,18 +50,21 @@ options+=(
$^dashes'-escape[set rendering of control characters in output]:escape [ascii]:(symbol ascii off)'
'(-*batch -*interactive)'$^dashes'-batch[force batch I/O]'
'(-*batch -*interactive)'$^dashes'-interactive[force interactive I/O]'
+ $^dashes'-ifexists[only open if database already exists]'
$^dashes'-lookaside[specify size and number of entries for lookaside memory]:size (bytes): :entries'
$^dashes'-maxsize[specify maximum size for a --deserialize database]:size'
$^dashes'-memtrace[trace all memory allocations and deallocations]'
$^dashes'-mmap[set default mmap size]:size'
$^dashes'-newline[set output row separator]:separator [\n]'
$^dashes'-nofollow[refuse to open symbolic links to database files]'
+ $^dashes"-noinit[don't read ~/.sqliterc file at startup]"
$^dashes'-nonce[set the safe-mode escape nonce]:string'
$^dashes'-no-rowid-in-view[disable rowid-in-view using sqlite3_config()]'
$^dashes'-pagecache[specify size and number of slots for page cache memory]:size (bytes): :slots'
$^dashes'-pcachetrace[trace all page cache operations]'
$^dashes'-readonly[open the database read-only]'
$^dashes'-safe[enable safe-mode]'
+ $^dashes'-screenwidth[use specified default screen width]:width'
$^dashes'-stats[print memory stats before each finalize]'
$^dashes'-unsafe-testing[allow unsafe commands and modes for testing]'
$^dashes'-vfs[use specified default VFS]:vfs:(unix-dotfile unix-excl unix-none unix-namedsem)'
diff --git a/Completion/Unix/Command/_ssh b/Completion/Unix/Command/_ssh
index 9ab1a1139..c95849e84 100644
--- a/Completion/Unix/Command/_ssh
+++ b/Completion/Unix/Command/_ssh
@@ -13,7 +13,7 @@ _ssh () {
'-A[enable forwarding of the authentication agent connection]'
'-C[compress data]'
'-c+[select encryption cipher]:encryption cipher:->ciphers'
- '-F+[specify alternate config file]:config file:_files'
+ '-F+[specify alternate config file]:config file:_phony none _files'
'*-i+[select identity file]:SSH identity file:_files -g "*(-.^AR)"'
'*-o+[specify extra options]:option string:->option'
)
@@ -41,7 +41,7 @@ _ssh () {
'-B+[bind to specified interface before attempting to connect]:interface:_net_interfaces' \
'(-P)-b+[specify interface to transmit on]:bind address:_bind_addresses' \
'-D+[specify a dynamic port forwarding]:dynamic port forwarding:->dynforward' \
- '-e+[set escape character]:escape character (or `none'\''):' \
+ '-e+[set escape character]:escape character:_phony none' \
'-E+[append log output to file instead of stderr]:log file:_files' \
'(-n)-f[go to background]' \
'-g[allow remote hosts to connect to local forwarded ports]' \
@@ -61,7 +61,7 @@ _ssh () {
'-p+[specify port on remote host]:port number on remote host' \
'(-v)*-q[quiet operation]' \
'*-R+[specify remote port forwarding]:remote port forwarding:->forward' \
- '-S+[specify location of control socket for connection sharing]:path to control socket:_files' \
+ '-S+[specify location of control socket for connection sharing]:path to control socket:_phony none _files' \
'(- 1 *)-Q+[query parameters]:query option:((cipher\:"supported symmetric ciphers" cipher-auth\:"supported symmetric ciphers that support authenticated encryption" compression mac\:"supported message integrity codes" kex\:"key exchange algorithms" kex-gss\:"GSSAPI key exchange algorithms" key\:"key types" key-cert\:"certificate key types" key-plain\:"non-certificate key types" key-sig\:"all key types and signature algorithms" protocol-version\:"supported SSH protocol versions" sig\:"supported signature algorithms" help\:"show supported queries" HostbasedAcceptedAlgorithms HostKeyAlgorithms KexAlgorithms MACs PubkeyAcceptedAlgorithms))' \
'-s[invoke subsystem]' \
'(-t)-T[disable pseudo-tty allocation]' \
@@ -263,7 +263,7 @@ _ssh () {
"$p1($cmn -f -k -u -D)-U[indicate that CA key is held by ssh-agent]" \
"$p1($cmn -f -k -u -U)-D+[indicate the CA key is stored in a PKCS#11 token]:PKCS11 shared library:_files -g '*.(so|dylib)(|.<->)(-.)'" \
"$p1($cmn -f -k -u)-n+[specify user/host principal names to include in certificate]:principals" \
- "$p1($cmn -f -u)-V+[specify certificate validity interval]:interval" \
+ "$p1($cmn -f -u)-V+[specify certificate validity interval]:interval:_phony -S\: always" \
"($cmn -I -h -n -D -O -U -V)-k[generate a KRL file]" \
"$p1($cmn -I -h -n -D -O -U -V)-u[update a KRL]" \
- signature \
@@ -402,8 +402,8 @@ _ssh () {
'values:truth value:(yes no)' && ret=0
;;
(#i)escapechar=*)
- _message -e 'escape character (or `none'\'')'
- ret=0
+ _description escape-characters expl 'escape character'
+ _phony "$expl[@]" none && ret=0
;;
(#i)fingerprinthash=*)
_values 'fingerprint hash algorithm' \
diff --git a/Completion/Unix/Command/_strings b/Completion/Unix/Command/_strings
index 685daa286..774399328 100644
--- a/Completion/Unix/Command/_strings
+++ b/Completion/Unix/Command/_strings
@@ -18,6 +18,13 @@ if _pick_variant -r variant binutils=GNU elftoolchain=elftoolchain elfutils=elfu
l\:16-bit\ little-endian
B\:32-bit\ big-endian
L\:32-bit\ little-endian))'
+ '(-U --unicode -e --encoding)'{-U+,--unicode=}'[specify how to treat UTF-8 encoded unicode characters]: : _values "treatment [default]"
+ {d,default}"[rely on --encoding]"
+ {l,locale}"[convert to current locale]"
+ {i,invalid}"[not part of a valid string]"
+ {x,hex}"[<> enclosed hex byte sequences]"
+ {e,escape}"[escape sequences (\\\\uxxxx)]"
+ {h,highlight}"[escape sequences highlighted in red]"' \
'(-f --print-file-name)'{-f,--print-file-name}'[print name of the file before each string]'
'(-n --bytes)'{-n+,--bytes=}"$bytes"
'(-d -t --radix)'{-t+,--radix=}"$format"
diff --git a/Completion/Unix/Command/_strip b/Completion/Unix/Command/_strip
index 59cb537b9..930080f89 100644
--- a/Completion/Unix/Command/_strip
+++ b/Completion/Unix/Command/_strip
@@ -49,7 +49,9 @@ if _pick_variant -r variant gnu=GNU elftoolchain=elftoolchain $OSTYPE --version;
'(*)-o+[output file]:output file:_files'
'--keep-section-symbols[retain section symbols]'
'--keep-file-symbols[retain symbols specifying source file names]'
- '(-v --verbose)'{-v,--verbose}'[list all object files modified or members of archives]')
+ '(-v --verbose)'{-v,--verbose}'[list all object files modified or members of archives]'
+ '--plugin=[load specified plugin]:plugin'
+ )
;;
elftoolchain)
args+=(
diff --git a/Completion/Unix/Command/_tcpdump b/Completion/Unix/Command/_tcpdump
index 7047b2d34..25605875f 100644
--- a/Completion/Unix/Command/_tcpdump
+++ b/Completion/Unix/Command/_tcpdump
@@ -94,9 +94,6 @@ _data_link_types () {
fi
}
-_bpf_filter () {
-}
-
args=(
'-A[print each packet in ASCII]'
'-c+[exit after receiving specified number of packets]:number of packets'
diff --git a/Completion/Unix/Command/_texinfo b/Completion/Unix/Command/_texinfo
index 2f5d0f91f..a37bc8ae9 100644
--- a/Completion/Unix/Command/_texinfo
+++ b/Completion/Unix/Command/_texinfo
@@ -123,13 +123,16 @@ case $service in
'--conf-dir=[specify additional directory for configuration files]:directory:_directories' \
'--init-file=[specify initialisation file]:file:_files' \
\*{-c+,--set-customization-variable=}'[set customization variable]:variable' \
+ '--trace-includes[print names of included files]' \
'(-v --verbose)'{-v,--verbose}'[explain what is being done]' \
'(* -)--version[display version info]' \
- '(--html --xml --plaintext)--docbook[output in DocBook XML format]' \
- '(--docbook --xml --plaintext)--html[output in HTML format]' \
+ '(--html --xml --epub3 --latex --plaintext)--docbook[output in DocBook XML format]' \
+ '(--docbook --xml --epub3 --latex --plaintext)--html[output in HTML format]' \
'--no-headers[suppress node separators and menus]' \
- '(--docbook --html --plaintext)--xml[output in XML (TexinfoML) format]' \
- '(--docbook --html --xml)--plaintext[output in plain text format]' \
+ '(--docbook --html --epub3 --latex --plaintext)--xml[output in XML (TexinfoML) format]' \
+ '(--docbook --html --xml --latex --plaintext)--epub3[output in EPUB 3 format]' \
+ '(--docbook --html --xml --epub3 --plaintext)--latex[output in LaTeX format]' \
+ '(--docbook --html --xml --epub3 --latex)--plaintext[output in plain text format]' \
'--dvi[output in dvi format]' \
'--dvipdf[output in pdf format]' \
'--ps[output in ps format]' \
@@ -138,11 +141,13 @@ case $service in
'(--docbook --xml)--no-split[suppress splitting of output]' \
'--no-number-sections[output chapter and section numbers]' \
'!(--no-number-sections)--number-sections' \
+ '--no-number-footnotes[number footnotes sequentially]' \
+ '!(--no-number-footnotes)--number-footnotes' \
'(-o --output=)'{-o,--output}'[specify output file]:output file:_files' \
'(--docbook --html --xml)--disable-encoding[output special characters]' \
'!(--disable-encoding)--enable-encoding' \
'(--docbook --html --xml)--fill-column=[specify width to break lines at]:width [72]' \
- '(--docbook --html --xml)--footnote-style=[specify style for output of footnotes]:((separate\:in\ own\ node end\:at\ end\ of\ node))' \
+ '(--docbook --html --xml)--footnote-style=[specify style for output of footnotes]:style [end]:((separate\:in\ own\ node end\:at\ end\ of\ node))' \
'(--docbook --html --xml)--paragraph-indent=[specify spaces to indent paragraphs by]:indent [3]' \
'(--docbook --html --xml)--split-size=[split Info files at specified size]:size [300000]' \
'(--docbook --xml --plaintext)--css-include=[specify file in include in HTML <style> output]:file:_files' \
@@ -151,7 +156,7 @@ case $service in
'(--docbook --xml --plaintext)--split=[split output at specified boundary]:split boundary:(chapter section node)' \
'(--docbook --xml --plaintext)--transliterate-file-names[produce file names in ASCII transliteration]' \
'(--docbook --xml --plaintext)--node-files[produce redirection files for nodes]' \
- '-Xopt=[specify option to texi2dvi]:options' \
+ '*-Xopt=[pass option to texi2dvi]:option' \
'-D[define variable]:variable' \
'-I[specify directory to append to @include search path]:directory:_files -/' \
'-P[specify directory to prepend to @include search path]:directory:_files -/' \
diff --git a/Completion/Unix/Command/_tiff b/Completion/Unix/Command/_tiff
index 1aeff3ff7..f8c4a1164 100644
--- a/Completion/Unix/Command/_tiff
+++ b/Completion/Unix/Command/_tiff
@@ -157,7 +157,8 @@ tiffinfo)
'-s[display offsets and byte counts for all data strips]' \
'-i[ignore read errors]' \
'-f+[force fill order]:fill order:(lsb2msb msb2lsb)' \
- '-w[display raw data in words]' \
+ '-w[show image data as 16-bit words]' \
+ '-W[warn about unknown tags]' \
'-z[enable strip chopping]' \
'-M+[set the memory allocation limit]:limit (MiB), 0 for unlimited' \
'*:input TIFF file:_files -g "*.(#i)tif(|f)(-.)"' && ret=0
@@ -235,6 +236,7 @@ pal2rgb)
*)
_description files expl 'picture file'
_files "$expl[@]" -g "$pat" && ret=0
+;;
esac
if [[ -n "$state" ]]; then
@@ -265,7 +267,7 @@ if [[ -n "$state" ]]; then
while _tags; do
while _next_label values expl 'compression scheme'; do
compadd "$expl[@]" - none jbig g4 packbits sgilog && ret=0
- compadd "$expl[@]" -qS: - lzw zip lzma zstd webp jpeg g3 && ret=0
+ compadd "$expl[@]" -qS: - lzw zip lerc lzma zstd webp jpeg g3 && ret=0
done
(( ret )) || return 0
done
diff --git a/Completion/Unix/Command/_w b/Completion/Unix/Command/_w
index 2da57a8f6..b63018024 100644
--- a/Completion/Unix/Command/_w
+++ b/Completion/Unix/Command/_w
@@ -9,6 +9,7 @@ case $OSTYPE in
'(-c --container)'{-c,--container}'[show container uptime]'
'(H -h)--no-header[suppress the heading]'
'(H -i --ip-addr)'{-i,--ip-addr}'[display IP address instead of hostname]'
+ '(H -t --terminal)'{-t,--terminal}'[scan terminal devices to locate user sessions]'
'(H -o --old-style -s --short)'{-o,--old-style}'[old style output format]'
'(H -s --short -o --old-style)'{-s,--short}'[use short output format]'
'(H -u --no-current)'{-u,--no-current}'[ignore the username while figuring out the current process and cpu times]'
@@ -41,12 +42,18 @@ case $OSTYPE in
'-A[sort tty names alphabetically instead of utmp or utmpx order]'
)
;|
- solaris*)
+ aix*|solaris*)
args+=( '!(-s -w -l)'{-l,-w}
'-s[short output form]'
'(-)-u[produce only the heading line]'
)
;|
+ aix*)
+ args+=(
+ "-X[don't truncate user names]"
+ '-@[tag system activity with workload partition name]:wpar'
+ )
+ ;;
esac
_arguments -S -s \
diff --git a/Completion/Unix/Command/_w3m b/Completion/Unix/Command/_w3m
index de425cfb1..65c150590 100644
--- a/Completion/Unix/Command/_w3m
+++ b/Completion/Unix/Command/_w3m
@@ -14,6 +14,8 @@ _arguments -C \
'(-e -s )-j[JIS]' \
'(-v *)-B[load bookmark]' \
'-bookmark[specify bookmark file]:bookmark file:_files' \
+ '-R[restore from session file]' \
+ '-session[specify session file]:session file:_files' \
'-T[specify content-type]:content type:_mime_types' \
'-m[internet message mode]' \
'(-B *)-v[visual startup mode]' \
@@ -36,9 +38,11 @@ _arguments -C \
"-no-proxy[don't use proxy]" \
'(-6)-4[IPv4 only (-o dns_order=4)]' \
'(-4)-6[IPv6 only (-o dns_order=6)]' \
+ '-insecure[use insecure SSL config options]' \
"-no-mouse[don't use mouse]" \
'(-no-cookie)-cookie[use cookie]' \
"(-cookie)-no-cookie[don't use cookie]" \
+ '-cookie-jar[use specified cookie file]:file:_files' \
'(-no-graph)-graph[use DEC special graphics for border of table and menu]' \
'(-graph)-no-graph[use ASCII character for border of table and menu]' \
'-S[squeeze multiple blank lines]' \
@@ -86,13 +90,13 @@ case "$state" in
'history:history:compadd -a w3mhistory' && ret=0
;;
option)
- local -a options
- options=( ${${(M)${(f)"$(_call_program options $words[1] -show-option 2>/dev/null)"}:# -o *}/(#b) -o (*)=[^ ]#[[:blank:]]##(*)/$match[1]:${match[2]:l}} )
+ local -a wopts
+ wopts=( ${${(M)${(f)"$(_call_program options $words[1] -show-option)"}:# -o *}/(#b) -o (*)=[^ ]#[[:blank:]]##(*)/$match[1]:${match[2]:l}} )
if compset -P 1 '*='; then
_message -e values 'value'
else
compset -S '=*' || suf=( -S '=' )
- _describe -t options 'option' options "$suf[@]" && ret=0
+ _describe -t config-options 'option' wopts "$suf[@]" && ret=0
fi
;;
esac
diff --git a/Completion/Unix/Command/_xmlsoft b/Completion/Unix/Command/_xmlsoft
index b8cf92700..aefb0e978 100644
--- a/Completion/Unix/Command/_xmlsoft
+++ b/Completion/Unix/Command/_xmlsoft
@@ -37,9 +37,8 @@ case $service in
'--novalid[skip the DTD loading phase]' \
'--nodtdattr[do not default attributes from the DTD]' \
'--noout[do not dump the result]' \
- '--maxdepth[increase the maximum depth]:depth' \
- '--maxvars[increase the maximum variables]:variables' \
- '--maxparserdepth[increase the maximum parser depth]:depth' \
+ '--maxdepth[increase the maximum depth]:depth [3000]' \
+ '--maxvars[increase the maximum variables]:variables [15000]' \
'--huge[relax hardcoded limits of the parser]' \
'--seed-rand[initialise random number generator]:seed' \
'--html[input document is an HTML file]' \
@@ -64,7 +63,6 @@ case $service in
'--version[display the version of the XML library used]' \
'--debug[dump a debug tree of the in-memory document]' \
'--shell[run a navigating shell]' \
- '--debugent[debug the entities defined in the document]' \
'--copy[used to test the internal copy implementation]' \
'--recover[output what was parsable on broken XML documents]' \
'--huge[remove any internal arbitrary parser limits]' \
@@ -75,8 +73,6 @@ case $service in
'--load-trace[print trace of all external entities loaded]' \
'--nonet[refuse to fetch DTDs or entities over network]' \
'--nocompact[do not generate compact text nodes]' \
- '--htmlout[output results as HTML]' \
- '--nowrap[do not put HTML doc wrapper]' \
'--valid[validate the document in addition to std well-formed check]' \
'(--dtdvalid --relaxng --schema)--postvalid[do a posteriori validation, i.e after parsing]' \
'(--postvalid --relaxng --schema --dtdvalidfpi)--dtdvalid[do a posteriori validation against a given DTD]:DTD:_webbrowser' \
@@ -86,17 +82,19 @@ case $service in
'(--noout --output -o)'{--output,-o}'[save to a given file]:output file:_files' \
'--repeat[repeat 100 times, for timing or profiling]' \
'--insert[ad-hoc test for valid insertions]' \
+ '--strict-namespace[return failure if document has namespace errors]' \
'--compress[turn on gzip compression of output]' \
'--html[use the HTML parser]' \
'--xmlout[use the XML serializer when using --html]' \
'--nodefdtd[do not default HTML doctype]' \
'--push[use the push mode of the parser]' \
- '--pushsmall[use the push mode of the parser using tiny increments]' \
'--memory[parse from memory]' \
- '--maxmem[limit memory allocation]:bytes' \
+ '--maxmem[limit memory allocation]:maximum (bytes)' \
'--nowarning[do not emit warnings from parser/validator]' \
'--noblanks[drop (ignorable?) blanks spaces]' \
'--nocdata[replace cdata section with text nodes]' \
+ '--nodict[create document without dictionary]' \
+ '--pedantic[enable additional warnings]' \
'--format[reformat/reindent the input]' \
'--encode[output in the given encoding]:encoding:(${encoding[@]})' \
'--dropdtd[remove the DOCTYPE of the input docs]' \
@@ -124,6 +122,8 @@ case $service in
'--sax[do not build a tree but work just at the SAX level]' \
'--oldxml10[use XML-1.0 parsing rules before the 5th edition]' \
'(--noout)--xpath[evaluate the XPath expression, implies --noout]:XPath expression' \
+ '(--noout)--xpath0[evaluate the XPath expression separating results by NUL, implies --noout]:XPath expression' \
+ '--max-ampl[set maximum amplification factor]:factor [5]' \
'*:XML file:_webbrowser' && return
;;
*XML_CATALOG_FILES*)
diff --git a/Completion/Unix/Command/_xxd b/Completion/Unix/Command/_xxd
index e9015a081..f56590915 100644
--- a/Completion/Unix/Command/_xxd
+++ b/Completion/Unix/Command/_xxd
@@ -22,13 +22,14 @@ local arguments
arguments=(
# output options
- '(-b -bits -i -include -p -postscript -plain -ps -r -revert -u -uppercase)'{-b,-bits}'[output in binary digits, rather than hex]'
- '( -E -EBCDIC -i -include -p -postscript -plain -ps -r -revert )'{-E,-EBCDIC}'[print human-readable part in EBCDIC rather than ASCII]'
- '(-i -include -p -postscript -plain -ps -r -revert)-e[little-endian dump]'
- '(-b -bits -E -EBCDIC -i -include -p -postscript -plain -ps -r -revert )'{-i,-include}'[output in C include file style]'
- '(-b -bits -E -EBCDIC -i -include -p -postscript -plain -ps -C -capitalize )'{-p,-postscript,-plain,-ps}'[read or write a plain hexdump (no line numbers or ASCII rendering)]'
+ '(-b -bits -i -include -t -p -postscript -plain -ps -r -revert -u -uppercase)'{-b,-bits}'[output in binary digits, rather than hex]'
+ '(-E -EBCDIC -i -include -t -p -postscript -plain -ps -r -revert)'{-E,-EBCDIC}'[print human-readable part in EBCDIC rather than ASCII]'
+ '(-i -include -t -p -postscript -plain -ps -r -revert)-e[little-endian dump]'
+ '(-E -EBCDIC -i -include -p -postscript -plain -ps -r -revert)'{-i,-include}'[output in C include file style]'
+ '(-E -EBCDIC -p -postscript -plain -ps -r -revert)-t[append terminating zero to C include output]'
+ '(-b -bits -E -EBCDIC -i -include -t -p -postscript -plain -ps -C -capitalize)'{-p,-postscript,-plain,-ps}'[read or write a plain hexdump (no line numbers or ASCII rendering)]'
- '(-b -bits -E -EBCDIC -i -include -r -revert -u -uppercase)'{-r,-revert}'[reverse mode\: read a hex dump and output binary data]'
+ '(-b -bits -E -EBCDIC -i -include -t -r -revert -u -uppercase)'{-r,-revert}'[reverse mode\: read a hex dump and output binary data]'
'(-b -bits -r -revert -u -uppercase)'{-u,-uppercase}'[output upper-case hex digits]'
'(- :)'{-h,-help}'[display usage message]'
@@ -42,7 +43,7 @@ arguments=(
'(-o -offset)'{-o+,-offset}'[add specified offset to displayed file position]:offset'
'-d[show offset in decimal instead of hex]'
'-R+[colorize the output]:when:(always auto never)'
- '(-s -skip -seek)'{-s+,-skip,-seek}'[specify file offset to dump from]: :_guard "(0x|)[0-9a-fA-F]#" "file offset to dump from (absolute or relative)"'
+ '(-s -skip -seek)'{-s+,-skip,-seek}'[specify file offset to dump from]: :_guard "([+-]|)(0x|)[0-9a-fA-F]#" "file offset to dump from (bytes, absolute or +/- relative)"'
': :_files'
)
diff --git a/Completion/Unix/Command/_xz b/Completion/Unix/Command/_xz
index 6e68e0f69..d441a6545 100644
--- a/Completion/Unix/Command/_xz
+++ b/Completion/Unix/Command/_xz
@@ -18,12 +18,13 @@ case "$service" in
'(I -k --keep)'{-k,--keep}"[keep (don't delete) input files]" \
'(I -f --force)'{-f,--force}'[force overwrite]' \
'(I -c --stdout)'{-c,--stdout}'[write on standard output]' \
+ "(I)--no-sync[don't flush writes before removing input file]" \
'(I)*'{-q,--quiet}'[suppress all warnings]' \
'(I)*'{-v,--verbose}'[verbose mode]' \
'(I * --files --files0)--files=-[read list of files to process from file]::file:_files' \
'(I * --files --files0)--files0=-[read null terminated list of files to process from file]::file:_files' \
'(I -F --format)'{-F+,--format=}'[specify file format]:format:(auto xz lzma lzip raw)' \
- '(I -T --threads)'{-T+,--threads=}'[use specified number of threads]:threads [1]' \
+ '(I -T --threads)'{-T+,--threads=}'[use specified number of threads]:threads [0]' \
'(I -M --memlimit --memory)'{-M+,--memlimit=,--memory=}'[set memory usage limit]: :_numbers -u bytes "memory limit" KiB MiB GiB %\:percentage\ of\ available\ RAM' \
'(I)--no-adjust[give error if settings exceed memory limit]' \
'(I -Q --no-warn)'{-Q,--no-warn}'[make warnings not affect exit status]' \
@@ -49,11 +50,14 @@ case "$service" in
'(* comp decomp level filters common)--info-memory[display amount of RAM and memory usage limits]' \
'(- *)'{-h,--help}'[display help message]' \
'(- *)'{-H,--long-help}'[display the long help (lists also the advanced options)]' \
+ '(- *)--filters-help[display liblzma filter string syntax information]' \
'(* comp decomp level filters common)'{-V,--version}'[display version number]' \
+ '(level)' \
'(I filters decomp)-'{-best,-fast,1,2,3,4,5,6,7,8,9} \
+ filters \
- '(I level decomp --extreme)'--{x86,powerpc,ia64,arm,armthumb,arm64,sparc}=-'[add a branch/call/jump filter]::option:->bcj-options' \
+ '(I level decomp --extreme)'--{x86,powerpc,ia64,arm,armthumb,arm64,sparc,riscv}=-'[add a branch/call/jump filter]::option:->bcj-options' \
+ '(I level decomp --extreme)--filters=[set filter chain using liblzma filter string]:filter string' \
+ '!(I level decomp --extreme)--filters'{1..9}'=:filter string' \
'(I level decomp --extreme)'--lzma{1,2}=-'[add lzma filter]::option:->lzma-options' \
'(I level decomp --extreme)--delta=-[add delta filter]::option:->delta-options' && ret=0
;;
diff --git a/Completion/Unix/Command/_zfs b/Completion/Unix/Command/_zfs
index 3a884439b..47e60ec66 100644
--- a/Completion/Unix/Command/_zfs
+++ b/Completion/Unix/Command/_zfs
@@ -169,8 +169,8 @@ case $service:$implementation in
'userobjquota@'
'vscan:value:(on off)'
'xattr:value:(on off dir sa)'
- "filesystem_limit: :{if [[ -prefix [0-9]## ]]; then _message -e 'number'; elif [[ -prefix n ]]; then compadd none; else _message -e limits 'number or none'; fi}"
- "snapshot_limit: :{if [[ -prefix [0-9]## ]]; then _message -e 'number'; elif [[ -prefix n ]]; then compadd none; else _message -e limits 'number or none'; fi}"
+ "filesystem_limit:unlimited:_phony none _numbers limit"
+ "snapshot_limit:unlimited:_phony none _numbers limit"
'volmode:mode:((
default\:use\ system-wide\ tunable
full\:expose\ as\ block\ devices
@@ -477,9 +477,11 @@ case $service:$words[1] in
;;
zfs:clone)
- [[ $implementation = solaris ]] && args+=(
- '-K[create encryption key]'
- )
+ if [[ $implementation = solaris ]]; then
+ args+=( '-K[create encryption key]' )
+ else
+ args+=( "-u[don't mount newly created dataset]" )
+ fi
_arguments -C -A "-*" -S $args \
'-p[create parent datasets]' \
'*-o+[set property]:property:->create-properties' \
@@ -1023,7 +1025,7 @@ case $service:$words[1] in
'-f[force use of in-use devices]' \
'-n[display configuration without creating pool]' \
'-R+[use alternate root]:alternate root:_directories' \
- '-m+[set mountpoint for root dataset]:mountpoint' \
+ '-m+[set mountpoint for root dataset]:mountpoint:_phony none _path_files -/ -P / -W /' \
'-t+[use a temporary pool name]:pool name' \
':pool :_guard "^-*" "pool name"' \
'*: :->virtual-devices'
diff --git a/Completion/Unix/Command/_zip b/Completion/Unix/Command/_zip
index cfa51be36..29c242caa 100644
--- a/Completion/Unix/Command/_zip
+++ b/Completion/Unix/Command/_zip
@@ -166,7 +166,7 @@ case $state in
elif [[ -f $testfile.ZIP ]]; then
zipfile=$testfile.ZIP
else
- return 1
+ return ret
fi 2>/dev/null
if [[ $zipfile != $_zip_cache_name ]]; then
_zip_cache_name="$zipfile"
diff --git a/Completion/Unix/Command/_zstd b/Completion/Unix/Command/_zstd
index 92c4a8e41..db23e541b 100644
--- a/Completion/Unix/Command/_zstd
+++ b/Completion/Unix/Command/_zstd
@@ -52,6 +52,7 @@ elif (( $words[(I)(-d|--decompress|--uncompress|-l|--list|-t|--test)] )); then
'(--sparse)-o[specify output file]:file:_files -g "^*.(|t)zst(-.)"'
"(M)--no-check[ignore checksums in compressed frame]"
'!(M --no-check)'{-C,--check}
+ '--pass-through[pass through uncompressed files as-is]'
'*:files:_files -g "*.(|t)zst(-.)"'
)
else
@@ -108,6 +109,7 @@ _arguments -s -S : $args \
'--filelist=[read list of files to operate upon from file]: :_files' \
'--output-dir-flat=[store processed files in directory]: :_directories' \
'--output-dir-mirror=[store processed files in directory respecting original structure]: :_directories' \
+ '--no-asyncio[disable asynchronous IO]' \
'--trace=[log tracing information to file]: :_files' \
+ '(M)' \
\!{-z,--compress,--uncompress} \
diff --git a/Completion/Unix/Type/_date_formats b/Completion/Unix/Type/_date_formats
index 0527d706c..2b7139492 100644
--- a/Completion/Unix/Type/_date_formats
+++ b/Completion/Unix/Type/_date_formats
@@ -107,6 +107,6 @@ done
_describe -t date-format-specifier 'date format specifier' specs \
-p "${(Q)PREFIX:-%}" -S '' && ret=0
-[[ $1 == zsh ]] && _message -e date-format-precision 'precision for %%. (1-9)'
+[[ $1 == zsh ]] && _message -e date-format-precision 'precision for %. (1-9)'
return ret
diff --git a/Completion/Unix/Type/_diff_options b/Completion/Unix/Type/_diff_options
index 03ea1d7fe..ba3f02c8f 100644
--- a/Completion/Unix/Type/_diff_options
+++ b/Completion/Unix/Type/_diff_options
@@ -26,7 +26,7 @@ _diff_palette() {
}
if _pick_variant -r variant -c $cmd gnu=GNU unix -v ||
- [[ $OSTYPE = (freebsd<12->|darwin<22->).* ]]; then
+ [[ $OSTYPE = (freebsd<12->.|darwin<22->.|netbsd)* ]]; then
(( $#words > 2 )) && ign='!'
# output formats