PATCH: completion option updates

Oliver Kiddle <[email protected]>
Newsgroups gmane.comp.shells.zsh.devel
Message-ID <[email protected]>
These are mostly based on diff of --help output with some assorted
random updates or cleanup. This is not as extensive as some past similar
updates. Relevant versions are:

  ansible 2.19.8
  attr 2.5.2
  diffstat 1.68
  dig 9.20.16
  entr 5.7
  git 2.54
  gphoto2 2.5.28
  jq 1.8.1
  mtr 0.96
  pv 1.9.31
  sqlite 3.50.2
  strace 6.12
  pandoc - use of _call_program, add typst and minor cleanup
  pdftk - minor cleanup
  selinux - not sure which package is affected but change is minor
  valgrind - add callgrind options
  ip - still very much out-of-date but this does add a few missing options

Oliver

diff --git a/Completion/Linux/Command/_selinux b/Completion/Linux/Command/_selinux
index da2c4e5ee..1b2c25468 100644
--- a/Completion/Linux/Command/_selinux
+++ b/Completion/Linux/Command/_selinux
@@ -148,6 +148,7 @@ case $service in
       '(-o --output -M --module-package)'{-o+,--output=}'[append output to file]:file:_files'
       '(-D --dontaudit)'{-D,--dontaudit}'[generate policy with dontaudit rules]'
       '(-R --reference)'{-R,--reference}'[use installed macros in generated policy]'
+      '(-C --cil)'{-C,--cil}'[generate CIL output]'
       '!(-R --reference -N --noreference)'{-N,--noreference}
       '(-v --verbose)'{-v,--verbose}'[explain generated output]'
       '(-e --explain)'{-e,--explain}'[fully explain generated output]'
@@ -196,7 +197,7 @@ case $service in
     args+=(
       "${ign}(-)"{-V,--version}'[show policy versions created by this program]'
       '-m[build a policy module instead of a base module]'
-      '-c+[build a policy module targeting a modular policy version]:version (4-21)'
+      '-c+[build a policy module targeting a modular policy version]:version (4-22)'
     )
   ;;
 
diff --git a/Completion/Linux/Command/_strace b/Completion/Linux/Command/_strace
index 37e14b6d6..6f42c4ae0 100644
--- a/Completion/Linux/Command/_strace
+++ b/Completion/Linux/Command/_strace
@@ -24,7 +24,9 @@ _arguments -C -s \
   '(-z -Z --successful-only --failed-only)'{-Z,--failed-only}'[trace only system calls that return an error]' \
   '(-a --columns)'{-a+,--columns=}'[align return values in a specific column]:column number [40]' \
   '(-i --instruction-pointer -c --summary-only)'{-i,--instruction-pointer}'[print instruction pointer at time of syscall]' \
-  '(-c --summary-only -k --stack-traces)'{-k,--stack-traces}'[obtain stack trace between each syscall]' \
+  '(-c --summary-only)*-k[obtain stack trace between each syscall]' \
+  '(-c --summary-only -k)--stack-trace=-[obtain stack trace between each syscall]::symbol' \
+  '(-c --summary-only)--stack-trace-frame-limit=[specify limit on stack trace frames to print]:frames [256]' \
   '(-n --syscall-number)'{-n,--syscall-number}'[print syscall number]' \
   '(-o --output)'{-o+,--output=}'[send trace output to the specified file]:output file:->file-pipe' \
   '(-A --output-append-mode)'{-A,--output-append-mode}'[open the file provided with the -o option in append mode]' \
@@ -51,11 +53,12 @@ _arguments -C -s \
   '(-X --const-print-style)'{-X+,--const-print-style=}'[set the format for printing of named constants and flags]:format:(raw abbrev verbose)' \
   '(-c --summary-only -yy --decode-fds)-y[print paths associated with file descriptor arguments]' \
   '(-c --summary-only -y --decode-fds)-yy[print protocol specific information associated with socket file descriptors]' \
-  '(-c --summary-only -y -yy)--decode-fds=-[print information associated with file descriptors]::information [none]:_sequence compadd - none all path socket dev pidfd signalfd' \
+  '(-c --summary-only -y -yy)--decode-fds=-[print information associated with file descriptors]::information [none]:_sequence compadd - none all path socket dev eventfd pidfd signalfd' \
   '(-c --summary-only -Y)--decode-pids=[print information associated with process IDs]:information [none]:_sequence compadd - none comm pidns' \
   '!(-c --summary-only -Y --decode-pids)--pidns-translation' \
   '(-c --summary-only --decode-pids)-Y[print command names for PIDs]' \
-  '(-c --summary-only -C --summary -i --instruction-pointer -k --stack-traces -r --relative-timestamps -ff -t -tt -ttt --absolute-timestamps -T --syscall-times -y -yy --decode-fds)'{-c,--summary-only}'[count time, calls, and errors for each system call and report a summary]' \
+  '--always-show-pid' \
+  '(-c --summary-only -C --summary -i --instruction-pointer -k --stack-trace --stack-trace-frame-limit -r --relative-timestamps -ff -t -tt -ttt --absolute-timestamps -T --syscall-times -y -yy --decode-fds)'{-c,--summary-only}'[count time, calls, and errors for each system call and report a summary]' \
   '(-c --summary-only -C --summary)'{-C,--summary}'[count time, calls, and errors for each system call and report a summary in addition to regular output]' \
   '(-O --summary-syscall-overhead)'{-O+,--summary-syscall-overhead=}'[specify overhead for tracing system calls]:overhead (microseconds)' \
   '(-S --summary-sort-by)'{-S+,--summary-sort-by=}'[sort the output of the histogram (-c option) by the specified criterion]:sort criterion [time]:(time min-time max-time avg-time calls errors name nothing)' \
@@ -66,6 +69,11 @@ _arguments -C -s \
   '(-d --debug)'{-d,--debug}'[show debug output of strace itself on standard error]' \
   '(- 1 *)'{-h,--help}'[display help information]' \
   '--seccomp-bpf[enable seccomp-bpf filtering]' \
+  '--secontext=[print SELinux contexts]: : _values -s, format
+    "(none mismatch full)all[equivalent to full,mismatch]"
+    "(all none)full[print the full context instead of the type only]"
+    "(all none)mismatch[print expected context when actual is not matching]"
+    "(all none mismatch full)none[equivalent to not specifying the option at all]"' \
   '--tips=-[show strace tips, tricks, and tweaks before exit]:tip [id\:random,format\:compact]' \
   '(- 1 *)'{-V,--version}'[display version information]' \
   '(-):command name: _command_names -e' \
@@ -87,7 +95,8 @@ case $state in
       'status[trace system calls with given return status]:status:->status' \
       'quiet[suppress various information messages]:message [none]:_sequence compadd - none attach exit path-resolution personality thread-execve superseded' \
       'kvm[print the exit reason of kvm vcpu]: :(vcpu)' \
-      'decode-fds[print information associated with file descriptors]:information [none]:_sequence compadd - none all path socket dev pidfd signalfd' \
+      'decode-fds[print information associated with file descriptors]:information [none]:_sequence compadd - none all path socket dev eventfd pidfd signalfd' \
+      'secontext' \
       'decode-pids[print information associated with process IDs]:information [none]:_sequence compadd - none comm pidns' && ret=0
     if [[ $state = status ]]; then
       _values -s , 'return status [all]' \
diff --git a/Completion/Linux/Command/_valgrind b/Completion/Linux/Command/_valgrind
index 6bf0e4450..47fced1fd 100644
--- a/Completion/Linux/Command/_valgrind
+++ b/Completion/Linux/Command/_valgrind
@@ -2,7 +2,7 @@
 
 local curcontext="$curcontext" state line
 local -a cmd common_{own_malloc,read_varinfo,report_errors,partial}
-local -a args args_{addrcheck,drd,memcheck,cachegrind,helgrind,lackey,massif,none,exp_{bbv,dhat,sgcheck}}
+local -a args args_{{addr,mem}check,drd,{cache,call,hel}grind,lackey,massif,none,exp_{bbv,dhat,sgcheck}}
 
 cmd=(
   '1: : _command_names -e'
@@ -127,6 +127,38 @@ args_cachegrind=(
   '--cachegrind-out-file=-[specify output file name]:file name [cachegrind.out.%%p]:_files'
 )
 
+args_callgrind=(
+  '--callgrind-out-file=-[specify output file name]:file name [callgrind.out.%%p]:_files'
+  '--dump-line=-[perform event counting at source line granularity]:enable [yes]:(yes no)'
+  '--dump-instr=-[perform event counting at instruction granularity]:enable [no]:(yes no)'
+  '--compress-strings=-[identify file and function names by numbers]:enable [yes]:(yes no)'
+  '--compress-pos=-[compress positions in profile dump]:enable [yes]:(yes no)'
+  '--compress-dumps=-[concatenate all dumps into same file]:enable [no]:(yes no)'
+  '--dump-every-bb=-[specify dump period in basic blocks]:blocks [0, never]'
+  '*--dump-before=-[dump when entering specified function]:function'
+  '*--zero-before=-[zero all costs when entering specified function]:function'
+  '*--dump-after=-[dump when leaving specified function]:function'
+  '--instr-atstart=-[do instrumentation at callgrind start]:enable [yes]:(yes no)'
+  '--collect-atstart=-[collect at process/thread start]:enable [yes]:(yes no)'
+  '*--toggle-collect=-[toggle collection on enter/leave specified function]:function'
+  '--collect-jumps=-[collect jumps]:enable [no]:(yes no)'
+  '--collect-bus=-[collect global bus events]:enable [no]:(yes no)'
+  '--collect-systime=-[collect system call time info]:enable [no]:(no yes msec usec nsec)'
+  '--separate-threads=-[separate data per thread]:enable [no]:(yes no)'
+  '--separate-callers=-[separate functions by call chain length]:length [0]'
+  '--separate-recs=-[separate function recursions up to level]:level [2]'
+  '--skip-plt=-[ignore calls to/from PLT sections]:enable [yes]:(yes no)'
+  '--skip-direct-rec=-[ignore direct recursio]:enable [yes]:(yes no)'
+  '*--fn-skip=-[ignore calls to/from specified function]:function'
+  '--branch-sim=-[collect branch prediction stats]:enable [no]:(yes no)'
+  '--cache-sim=-[collect cache stats]:enable [no]:(yes no)'
+  '--simulate-wb=-[count write-back events]:enable [no]:(yes no)'
+  '--simulate-hwpref=-[simulate hardware prefetch]:enable [no]:(yes no)'
+  '--cacheuse=-[collect cache block use]:enable [no]:(yes no)'
+  '--I1=-[set I1 cache manually]:size,assoc,line_size'
+  '--D1=-[set D1 cache manually]:size,assoc,line_size'
+)
+
 args_helgrind=(
   $common_own_malloc
   $common_read_varinfo
@@ -217,7 +249,8 @@ _arguments -C ${(P)args} $cmd \
   '--vgdb=-[activate gdbserver]:enable [yes]:(yes no full)' \
   '--vgdb-error=-[invoke gdbserver after specified number of errors]:errors [999999999]:errors' \
   '--vgdb-stop-at=-[invoke gdbserver for given events]:event:_sequence compadd - startup exit abexit valgrindabexit all none' \
-  '--track-fds=-[track open file descriptors]:enable [no]:(yes no all)' \
+  '--track-fds=-[track open file descriptors]:enable [no]:(yes no all bad)' \
+  '--modify-fds=-[modify newly open file descriptors]:enable:(yes no high)' \
   '--time-stamp=-[add timestamps to log messages]:enable:(yes no)' \
   '--log-fd=-[log messages to specified file descriptor]:file descriptor:_file_descriptors' \
   '--log-file=-[log messages to specified file with pid appended]:file:_files' \
diff --git a/Completion/Unix/Command/_ansible b/Completion/Unix/Command/_ansible
index ab0cdee6c..c1db8de45 100644
--- a/Completion/Unix/Command/_ansible
+++ b/Completion/Unix/Command/_ansible
@@ -50,11 +50,12 @@ case $service in
     args+=(
       '(-J --ask-vault-pass --ask-vault-password)'{-J,--ask-vault-pass{,word}}'[ask for vault password]'
       \*{-e+,--extra-vars=}'[set additional variables]:key=value, YAML/JSON or @file:->extra-vars'
+      '--flush-cache[clear fact cache for every host in inventory]'
       '*--vault-id=[specify vault identity to use]:vault identity'
       --vault-pass{,word}-file='[specify vault password file]:vault password file:_files'
       \*{-i+,--inventory=}'[specify inventory host file or host list]: : _alternative "files\:inventory file\:_files"
 	"hosts\:host\: _sequence _hosts"'
-      '!(-i --inventory)--inventory-file=:inventory file:_files'
+      '!*--inventory-file=:inventory file:_files'
       '(-l --limit --host --graph)'{-l+,--limit=}'[further limit hosts to an additional pattern]:host subset:->hosts'
     )
   ;|
diff --git a/Completion/Unix/Command/_attr b/Completion/Unix/Command/_attr
index efa7c5c4f..58fd8837e 100644
--- a/Completion/Unix/Command/_attr
+++ b/Completion/Unix/Command/_attr
@@ -2,11 +2,9 @@
 
 case $service in
   attr)
-    local -a list
-    [[ $OSTYPE = irix* ]] &&
-        list=( '(-g -s -r -V)-l[list extended attributes associated with file]' )
     _arguments -s -S "$list[@]" \
       '(-l -r -s -V)-g[get extended attribute for file]:attribute name' \
+      '(-g -s -r -V)-l[list extended attributes associated with file]' \
       '(-l -g -s -q -V)-r[remove given attribute from file]:attribute name' \
       '(-l -g -r)-s[set named attribute for file]:attribute name' \
       '(-r)-q[quiet output]' \
diff --git a/Completion/Unix/Command/_diffstat b/Completion/Unix/Command/_diffstat
index 9e7bf779b..068ec4c1e 100644
--- a/Completion/Unix/Command/_diffstat
+++ b/Completion/Unix/Command/_diffstat
@@ -17,6 +17,7 @@ _arguments -s -S \
   '-n+[specify minimum width for filenames]:width [auto]' \
   '-N+[specify maximum width for filenames]:width [auto]' \
   '-o+[redirect standard output to specified file]:output file:_files' \
+  '-O[inspect only files listed in diff for -S/-D options]' \
   '-p+[specify number of path separators to strip]:path components [common]' \
   '-q[suppress "0 files changed" message for empty diffs]' \
   '-r+[specify rounding for histogram]:rounding:((0\:none 1\:simple 2\:simple+adjustment))' \
diff --git a/Completion/Unix/Command/_dig b/Completion/Unix/Command/_dig
index 440c5de90..893f187d6 100644
--- a/Completion/Unix/Command/_dig
+++ b/Completion/Unix/Command/_dig
@@ -17,15 +17,16 @@ local -a alts args
   '*+'{no,}'badcookie[retry BADCOOKIE responses]'
   '*+'{no,}'cdflag[set the CD (checking disabled) bit in the query]'
   '*+'{no,}'class[display the CLASS whening printing the record]'
+  '*+'{no,}'coflag[set compact denial of existence ok flag in query]'
   '*+'{no,}'cookie[add a COOKIE option to the request]'
   '*+'{no,}'crypto[display cryptographic fields in DNSSEC records]'
   '*+'{no,}'dns64prefix[get the DNS64 prefixes from ipv4only.arpa]'
-  '*+edns=-[specify EDNS version for query]:version (0-255)'
+  '*+edns=-[specify EDNS version for query]:version (0-255) [0]'
   '*+noedns[clear EDNS version to be sent]'
-  '*+ednsflags=-[set EDNS flags bits]:flags'
+  '*+ednsflags=-[set undefined EDNS flags bits]:flags'
   '*+'{no,}'ednsnegotiation[set EDNS version negotiation]'
   '*+ednsopt=-[specify EDNS option]:code point'
-  '*+noedns[clear EDNS options to be sent]'
+  '*+noednsopt[clear EDNS options to be sent]'
   '*+'{no,}'expandaaaa[expand AAAA records]'
   '*+'{no,}'expire[send an EDNS Expire option]'
   '*+'{no,}'header-only[send query without a question section]'
@@ -45,6 +46,7 @@ local -a alts args
   '*+'{no,}'cmd[print initial comment in output]'
   '*+'{no,}'short[print terse output]'
   '*+'{no,}'showbadcookie[show BADCOOKIE message]'
+  '*+'{no,}'showbadvers[show BADVERS message]'
   '*+'{no,}'identify[print IP and port of responder]'
   '*+'{no,}'comments[print comment lines in output]'
   '*+'{no,}'stats[print statistics]'
diff --git a/Completion/Unix/Command/_entr b/Completion/Unix/Command/_entr
index 438ab179a..4fb984af2 100644
--- a/Completion/Unix/Command/_entr
+++ b/Completion/Unix/Command/_entr
@@ -11,6 +11,7 @@ _arguments -s -S \
   '-p[postpone first execution of the utility]' \
   '(-a)-r[reload a persistent child process]' \
   '(*)-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]' \
   '(-): :->command' \
   '*::arguments:_normal' && ret=0
diff --git a/Completion/Unix/Command/_git b/Completion/Unix/Command/_git
index e9f72799c..675170f6e 100644
--- a/Completion/Unix/Command/_git
+++ b/Completion/Unix/Command/_git
@@ -70,6 +70,7 @@ _git-add () {
     '(-f --force)'{-f,--force}'[allow adding otherwise ignored files]' \
     '(-i --interactive : -)'{-i,--interactive}'[add contents interactively to index]' \
     '(-p --patch)'{-p,--patch}'[like -i but go directly into patch mode for specified files]' \
+    "--no-auto-advance[don't advance to next file when selecting hunks interactively]" \
     '(-U --unified)'{-U+,--unified=}'[generate diff with given lines of context]:number of lines' \
     '--inter-hunk-context=[combine patch hunks closer than specified number of lines]:number of lines' \
     '(-e --edit)'{-e,--edit}'[open diff against index in editor]' \
@@ -515,6 +516,7 @@ _git-checkout () {
     "--ignore-other-worktrees[don't check if another worktree is using this branch]" \
     '--recurse-submodules=-[control recursive updating of submodules]::checkout:__git_commits' \
     '--no-overlay[remove files from index or working tree that are not in the tree-ish]' \
+    "--no-auto-advance[don't advance to next file when selecting hunks interactively]" \
     '(-q --quiet --progress)--no-progress[suppress progress reporting]' \
     '--progress[force progress reporting]' \
     '(*)--pathspec-from-file=[read pathspec from file]:file:_files' \
@@ -1011,6 +1013,7 @@ _git-format-patch () {
     '--from=[add From: header to email headers]: :_email_addresses' \
     '*--add-header=[add an arbitrary header to email headers]:header' \
     '--cover-letter[generate a cover letter template]' \
+    '(--cover-letter)--commit-list-format=[format commit list in the cover letter]:format:(short-log modern)' \
     '--notes=[append notes for the commit after the three-dash line]:: :__git_notes_refs' \
     '(            --no-signature --signature-file)--signature=[add a signature]:signature' \
     '(--signature                --signature-file)--no-signature[do not add a signature]' \
@@ -1219,6 +1222,49 @@ _git-gui () {
   return ret
 }
 
+(( $+functions[_git-history] )) ||
+_git-history() {
+  local curcontext=$curcontext ret=1
+  local -a state line common
+  declare -A opt_args
+
+  _arguments -C \
+    ': :->command' \
+    '*:: :->option-or-argument' && ret=0
+
+  case $state in
+    (command)
+      declare -a commands
+
+      commands=(
+        'reword:rewrite commit message of specified commit'
+        'split:interactively split up commit'
+      )
+
+      _describe -t commands command commands && ret=0
+    ;;
+    (option-or-argument)
+      curcontext=${curcontext%:*}-$line[1]:
+      common=(
+        "--dry-run[don't update any references]"
+        '--update-refs=[control which references will be updates]:references [branches]:(branches head)'
+        ':commit:__git_commits'
+      )
+
+      case $line[1] in
+        reword) _arguments -S -s $endopt $common && ret=0 ;;
+        split)
+          _arguments -S -s $endopt $common \
+            '*: :__git_ignore_line_inside_arguments __git_tree_files ${PREFIX:-.} ${(Q)line[1]}' && ret=0
+        ;;
+        *) _default && ret=0 ;;
+      esac
+    ;;
+  esac
+
+  return ret
+}
+
 (( $+functions[_git-init] )) ||
 _git-init () {
   _arguments -S -s $endopt \
@@ -1300,7 +1346,8 @@ _git-log () {
 
 (( $+functions[_git-maintenance] )) ||
 _git-maintenance() {
-  local curcontext="$curcontext" state state_descr line ret=1
+  local curcontext="$curcontext" ret=1
+  local -a state state_descr line args
   local -A opt_args
 
   _arguments -C \
@@ -1324,16 +1371,27 @@ _git-maintenance() {
     (option-or-argument)
       curcontext=${curcontext%:*}-$line[1]:
       case $line[1] in
-        (run)
+        run)
           _arguments -S $endopt \
             '--auto[run tasks based on the state of the repository]' \
+            '--detach[perform maintenance in the background]' \
             '--schedule=[run tasks based on frequency]:frequency (seconds)' \
             "--quiet[don't report progress or other information to stderr]" \
             '*--task=[run a specific task]:task:(gc commit-graph prefetch loose-objects incremental-repack pack-refs)' && ret=0
         ;;
-        (start)
+        start)
           _arguments \
-            '--scheduler=:scheduler:(auto crontab systemd-timer launchctl schtasks)'
+            '--scheduler=:scheduler:(auto crontab systemd-timer launchctl schtasks)' && ret=0
+        ;;
+        unregister)
+          args=( '(-f --force)'{-f,--force}'[return success even if repository was not registered]' )
+        ;&
+        register)
+          _arguments -S $endopt $args \
+            '--config-file=[use given config file]:config file:_files' && ret=0
+        ;;
+        stop) _message 'no more arguments' ;;
+        *) _default && ret=0 ;;
       esac
     ;;
   esac
@@ -1591,6 +1649,7 @@ _git-range-diff () {
     '(--right-only)--left-only[only emit output related to the first range]' \
     '(--left-only)--right-only[only emit output related to the second range]' \
     '(--remerge-diff)--diff-merges=[specify diff format to be used for merge commits]:format [m]:(off none 1 first-parent separate c combined cc dense-combined r remerge m on)' \
+    '--max-memory=[specify maximum memory for cost matrix]:memory [4G]' \
     '(--diff-merges -p --patch -u)--remerge-diff[produce remerge-diff output for merge commits]' \
     $diff_options \
     '1:range 1:__git_commit_ranges' \
@@ -1638,6 +1697,7 @@ _git-rebase () {
     "(--autostash --no-autostash)--no-autostash[don't stash uncommitted changes before rebasing and apply them afterwards]" \
     '(--root)--fork-point[use merge-base --fork-point to refine upstream]' \
     '--signoff[add Signed-off-by: trailer to the commit message]' \
+    '(--force-rebase)*--trailer=[add custom trailer to every rebased commit]:trailer:__git_trailers_tokens' \
     '--no-ff[cherry-pick all rebased commits with --interactive, otherwise synonymous to --force-rebase]' \
     '(--keep-base)--onto=[start new branch with HEAD equal to given revision]:newbase:__git_revisions' \
     "(--apply --whitespace -C)--reschedule-failed-exec[automatically re-schedule any 'exec' that fails]" \
@@ -1661,6 +1721,7 @@ _git-reset () {
       '(--soft --mixed --hard --merge        -p --patch -U --unified --inter-hunk-context -- *)--keep[like --hard, but keep local working tree changes]' \
       '--recurse-submodules=-[control recursive updating of submodules]::reset:__git_commits' \
       '(-p --patch --soft --mixed -N --intent-to-add --hard --merge --keep)'{-p,--patch}'[select diff hunks to remove from the index]' \
+    "--no-auto-advance[don't advance to next file when selecting hunks interactively]" \
       '(-U --unified --soft --mixed -N --intent-to-add --hard --merge --keep)'{-U+,--unified=}'[generate diff with given lines of context]:number of lines' \
       '(--soft --mixed -N --intent-to-add --hard --merge --keep)--inter-hunk-context=[combine patch hunks closer than specified number of lines]:number of lines' \
       '(-N --intent-to-add --soft --mixed --hard --merge --keep -p --patch -U --unified --inter-hunk-context -- *)'{-N,--intent-to-add}'[record only the fact that removed paths will be added later]' \
@@ -1903,6 +1964,7 @@ _git-sparse-checkout() {
         reapply:'reapply the sparsity pattern rules to paths in the working tree'
         disable:'disable the config setting, and restore all files in the working directory'
         check-rules:'check whether sparsity rules match one or more paths'
+        clean:'remove files outside of the sparse-checkout definition'
       )
 
       _describe -t commands command commands && ret=0
@@ -1910,7 +1972,7 @@ _git-sparse-checkout() {
     (option-or-argument)
       curcontext=${curcontext%:*}-$line[1]:
       case $line[1] in
-        init)
+        init|reapply)
           _arguments \
             '--cone[allow for better performance with a limited set of patterns]' \
             '--no-sparse-index[rewrite index to not be sparse]' && ret=0
@@ -1929,6 +1991,12 @@ _git-sparse-checkout() {
            '--cone[interpret rules file patterns as cone mode patterns]' \
            '--rules-file=[use patterns in specified file]:file:_files' && ret=0
         ;;
+        clean)
+          _arguments \
+            '(-f --force)'{-f,--force}'[remove files]' \
+            '--dry-run[list the directories that would be removed without deleting them]' \
+            '--verbose[list every file considered for removal]'
+        ;;
       esac
     ;;
   esac
@@ -2237,12 +2305,16 @@ _git-submodule () {
 _git-subtree () {
   local curcontext="$curcontext" state state_descr line ret=1
   declare -A opt_args
+  local -a common=(
+    '(-q --quiet)'{-q,--quiet}'[suppress progress output]'
+    '(-d --debug)'{-d,--debug}'[show debug messages]'
+    '(-P --prefix)'{-P+,--prefix=}'[the path to the subtree in the repository to manipulate]: :_directories'
+    '(-S --gpg-sign --no-gpg-sign)'{-S-,--gpg-sign=-}'[GPG-sign the commit]::key id'
+    "(-S --gpg-sign --no-gpg-sign)--no-gpg-sign[don't GPG-sign the commit]"
+  )
 
   # TODO: -P should only complete paths inside the current repository.
-  _arguments -C \
-    '(-q --quiet)'{-q,--quiet}'[suppress progress output]' \
-    '(-P --prefix)'{-P+,--prefix=}'[the path to the subtree in the repository to manipulate]: :_directories' \
-    '(-d --debug)'{-d,--debug}'[show debug messages]' \
+  _arguments -C $common \
     ': :->command' \
     '*::: := ->option-or-argument' && ret=0
 
@@ -2263,7 +2335,7 @@ _git-subtree () {
       curcontext=${curcontext%:*}-$line[1]:
       case $line[1] in
         (add)
-          _arguments \
+          _arguments $common \
             '(-q --quiet)'{-q,--quiet}'[suppress progress output]' \
             '(-m --message)'{-m+,--message=}'[use the given message as the commit message for the merge commit]:message' \
             '(-P --prefix)'{-P+,--prefix=}'[the path to the subtree in the repository to manipulate]: :_directories' \
@@ -2276,35 +2348,27 @@ _git-subtree () {
           # __git_ref_specs.
 	;;
         (merge)
-          _arguments -S \
-            '(-q --quiet)'{-q,--quiet}'[suppress progress output]' \
-            '(-P --prefix)'{-P+,--prefix=}'[the path to the subtree in the repository to manipulate]: :_directories' \
+          _arguments -S $common \
             '(-m --message)'{-m+,--message=}'[use the given message as the commit message for the merge commit]:message' \
             '--squash[import only a single commit from the subproject]' \
             ': :__git_references' && ret=0
 	;;
         (pull)
-          _arguments -S \
-            '(-q --quiet)'{-q,--quiet}'[suppress progress output]' \
-            '(-P --prefix)'{-P+,--prefix=}'[the path to the subtree in the repository to manipulate]: :_directories' \
+          _arguments -S $common \
             '(-m --message)'{-m+,--message=}'[use the given message as the commit message for the merge commit]:message' \
             '--squash[import only a single commit from the subproject]' \
             ': :__git_any_repositories' \
             ':: :__git_ref_specs' && ret=0
 	;;
         (push)
-          _arguments -S \
-            '(-q --quiet)'{-q,--quiet}'[suppress progress output]' \
-            '(-P --prefix)'{-P+,--prefix=}'[the path to the subtree in the repository to manipulate]: :_directories' \
+          _arguments -S $common \
             '(-m --message)'{-m+,--message=}'[use the given message as the commit message for the merge commit]:message' \
             ': :__git_any_repositories' \
             ':: :__git_ref_specs' && ret=0
 	;;
         (split)
-          _arguments -S \
+          _arguments -S $common \
 	    '--annotate[add a prefix to commit message of new commits]:prefix' \
-            '(-q --quiet)'{-q,--quiet}'[suppress progress output]' \
-            '(-P --prefix)'{-P+,--prefix=}'[specify path to the subtree in the repository to manipulate]: :_directories' \
             '(-b --branch)'{-b,--branch=}'[create a new branch]' \
             '--onto=[try connecting new tree to an existing one]: :__git_ref_specs' \
             '(-m --message)'{-m+,--message=}'[specify commit message for the merge]:message' \
@@ -2472,12 +2536,12 @@ _git-worktree() {
           _arguments -s -S $endopt \
 	    '(-n --dry-run)'{-n,--dry-run}"[don't remove, show only]" \
 	    '(-v --verbose)'{-v,--verbose}'[report pruned objects]' \
-            '--expire=[expire objects older than specified time]: :_git_approxidates' && ret=0
+            '--expire=[prune missing working trees older than specified time]: :_git_approxidates' && ret=0
 	;;
         (list)
           _arguments -S $endopt \
             '(-v --verbose --porcelain -z)'{-v,--verbose}'[output additional information about worktrees]' \
-            "--expire=[add 'prunable' annotation to worktrees older than specified time]: :_git_approxidates" \
+            "--expire=[add 'prunable' annotation to missing worktrees older than specified time]: :_git_approxidates" \
             '(-v)--porcelain[machine-readable output]' \
             '(-v)-z[terminate each line with a NUL rather than a newline]' && ret=0
 	;;
@@ -2810,7 +2874,7 @@ __git_config_option-or-value () {
     'diff.*.textconv:command to generate the text-converted version of a file::_cmdstring'
     'diff.*.wordregex:regular expression that the diff driver should use to split words in a line:regular expression:->string'
     'diff.*.xfuncname:regular expression that the diff driver should use to recognize the hunk header:regular expression:->string'
-    diff.algorithm:'default diff algorithm::->diff.algorithm:default'
+    diff.algorithm:"default diff algorithm::_git_diff_algorithms"
     diff.autorefreshindex:'run git update-index --refresh before git diff::->bool:true'
     diff.colorMoved:"color moved lines in diffs::__git_color_moved"
     diff.colorMovedWS:"ignore whitespace when detecting moved lines::__git_color_movedws"
@@ -3689,14 +3753,6 @@ __git_config_option-or-value () {
                 __git_guard_number 'number of days'
               fi
               ;;
-            (diff.algorithm)
-              __git_config_values -- "$current" "$parts[5]" \
-                default:'basic greedy diff algorithm' \
-                myers:'basic greedy diff algorithm' \
-                minimal:'spend extra time to make sure the smallest possible diff is produced' \
-                patience:'generate diffs with patience algorithm' \
-                histogram:'generate diffs with histogram algorithm' && ret=0
-              ;;
             (diff.renames)
               __git_config_booleans "$current" "$parts[5]" "$parts[2]" \
                 {copies,copy}:'try to detect both renames and copies' && ret=0
@@ -4072,6 +4128,7 @@ _git-reflog () {
           'show:show log of ref'
           'drop:remove reflog for specified references'
           'exists:check whether a ref has a reflog'
+          'write:write reflog entry for a reference'
 	)
 
         _alternative \
@@ -4114,7 +4171,10 @@ _git-reflog () {
           ;;
 	  (exists)
 	    __git_references && ret=0
-	    ;;
+	  ;;
+          write)
+            _arguments ': :__git_references' ':old oid' ':new oid' ':message' && ret=0
+	  ;;
         esac
     esac
 
@@ -4138,6 +4198,9 @@ _git-refs() {
       commands=(
         'migrate:migrate ref store between different formats'
         'verify:verify reference database consistency'
+        'list:list references in the repository, alias for git-for-each-ref'
+        'exists:check whether given reference exists'
+        'optimize:optimize references to improve repository performance, alias for git-pack-refs'
       )
 
       _describe -t commands command commands && ret=0
@@ -4157,6 +4220,9 @@ _git-refs() {
             '--strict[enable stricter error checking]' \
             '--verbose[when verifying the reference database consistency, be chatty]' && ret=0
         ;;
+        list) _git-for-each-ref && ret=0 ;;
+        exists) __git_references && ret=0 ;;
+        optimize) _git-pack-refs && ret=0 ;;
         *) _default && ret=0 ;;
       esac
     ;;
@@ -4363,6 +4429,7 @@ _git-blame () {
     '(-n --show-number)'{-n,--show-number}'[show the line number in the original commit]' \
     '-s[suppress author name and timestamp]' \
     '-w[ignore whitespace when finding lines]' \
+    '--diff-algorithm=[choose a diff algorithm to use when computing blame]: :_git_diff_algorithms' \
     '--ignore-rev=[ignore specified revision when blaming]:revision:__git_revisions' \
     '--ignore-revs-file=[ignore revisions from file]:file:_files' \
     '(--color-by-age)--color-lines[color redundant metadata from previous line differently]' \
@@ -4841,10 +4908,14 @@ _git-send-email () {
     '--smtp-server-port=[specify port to connect to SMTP server on]:smtp port:_ports' \
     '--smtp-server-option=[specify the outgoing SMTP server option to use]:SMTP server option' \
     '--smtp-ssl-cert-path=[path to ca-certificates (directory or file)]:ca certificates path:_files' \
+    '--smtp-ssl-client-cert=[path to client certificate file]: :_files' \
+    '--smtp-ssl-client-key=[path to the private key file for the client certificate]: :_files' \
     '--smtp-user=[specify user to use for SMTP-AUTH]:smtp user:_users' \
     '(--no-smtp-auth)--smtp-auth=[specify allowed AUTH mechanisms]:space-separated list of mechanisms' \
     '(--smtp-auth)--no-smtp-auth[disable SMTP authentication]' \
     '--smtp-debug=[enable or disable debug output]:smtp debug:((0\:"disable" 1\:"enable"))' \
+    '--imap-sent-folder=[IMAP folder where a copy of the emails should be sent]:IMAP folder' \
+    '--use-imap-only[only copy emails instead of actually sending them]' \
     '--batch-size=[specify maximum number of messages per connection]:number' \
     '--relogin-delay=[specify delay between successive logins]:delay (seconds)' \
     '--cc-cmd=[specify command to generate Cc\: header with]:Cc\: command:_cmdstring' \
@@ -5328,11 +5399,7 @@ _git-merge-file () {
     '(       --theirs --union)--ours[resolve conflicts favoring our side of the lines]' \
     '(--ours          --union)--theirs[resolve conflicts favoring their side of the lines]' \
     '(--ours --theirs        )--union[resolve conflicts favoring both sides of the lines]' \
-    '--diff-algorithm=[choose a diff algorithm]:diff algorithm:((default\:"basic greedy diff algorithm"
-      myers\:"basic greedy diff algorithm"
-      minimal\:"spend extra time to make sure the smallest possible diff is produced"
-      patience\:"generate diffs with patience algorithm"
-      histogram\:"generate diffs with histogram algorithm"))' \
+    '--diff-algorithm=[choose a diff algorithm]: :_git_diff_algorithms' \
     '--marker-size[specify length of conflict markers]: :__git_guard_number "marker length"' \
     '--object-id[use object IDs instead of filenames]' \
     '(--zdiff3)--diff3[show conflicts in "diff3" style]' \
@@ -5377,10 +5444,13 @@ _git-multi-pack-index() {
   _arguments \
     '--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' \
+    '--bitmap[write a multi-pack bitmap]' \
     '--stdin-packs[write a multi-pack index containing only pack index basenames provided on stdin]' \
     '--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 verify expire repack)'
+    '1:verb:(write compact verify expire repack)'
 }
 
 (( $+functions[_git-pack-objects] )) ||
@@ -5494,6 +5564,21 @@ _git-read-tree () {
     '3::third tree-ish to be read/merged:__git_tree_ishs'
 }
 
+(( $+functions[_git-replay] )) ||
+_git-replay() {
+  _arguments -S $endopt \
+    '(--advance --revert)--contained[update all branches that point to commits in given range]' \
+    '(--advance --revert)--onto=[replay onto given commit]: :__git_revisions' \
+    '(--onto --revert)--advance=[advance given branch]: :__git_branches' \
+    '(--onto --advance)--revert=[revert commits onto given branch]: :__git_branches' \
+    '--ref=[specify reference to update with result]: :__git_ref_specs' \
+    '--ref-action=[control ref update behavior]:behavior:((
+      update\:"update directly using atomic transaction"
+      print\:"output update-ref commands for pipeline use"
+    ))' \
+    ':revision range:__git_commit_ranges'
+}
+
 (( $+functions[_git-symbolic-ref] )) ||
 _git-symbolic-ref () {
   _arguments -S -s \
@@ -6280,7 +6365,10 @@ _git-hook() {
   _arguments $args \
     '--ignore-missing[ignore any missing hook by quietly returning zero]' \
     "--to-stdin=[specify file which will be redirected to hook's stdin]:file:_files" \
-    '1:subcommand:(run)' \
+    '--allow-unknown-hook-name' \
+    '-z[terminate output lines with NUL instead of newlines]' \
+    '--show-scope[prefix each hook name with a config scope]' \
+    '1:subcommand:(run list)' \
     '2:hook name:compadd $gitdir/hooks/*(x\:t)'
 }
 
@@ -6523,6 +6611,7 @@ _git_commands () {
     gc:'cleanup unnecessary files and optimize local repository'
     grep:'print lines matching a pattern'
     gui:'run portable graphical interface to git'
+    history:'rewrite history'
     init:'create empty git repository or re-initialize an existing one'
     log:'show commit logs'
     maintenance:'run tasks to optimize Git repository data'
@@ -6533,7 +6622,7 @@ _git_commands () {
     push:'update remote refs along with associated objects'
     range-diff:'compare two commit ranges'
     rebase:'forward-port local commits to the updated upstream head'
-    reset:'reset current HEAD to specified state'
+    reset:'reset HEAD or the index to a known state'
     restore:'restore working tree files'
     revert:'revert existing commits'
     rm:'remove files from the working tree and from the index'
@@ -6545,7 +6634,7 @@ _git_commands () {
     submodule:'initialize, update, or inspect submodules'
     subtree:'split repository into subtrees and merge them'
     switch:'switch branches'
-    tag:'create, list, delete or verify tag object signed with GPG'
+    tag:'create, list, delete or verify tags'
     worktree:'manage multiple working dirs attached to the same repository'
   )
   ancillary_manipulator_commands=(
@@ -6606,6 +6695,7 @@ _git_commands () {
     pack-objects:'create packed archive of objects'
     prune-packed:'remove extra objects that are already in pack files'
     read-tree:'read tree information into directory index'
+    replay:'replay commits on a new base, works with bare repos too'
     symbolic-ref:'read and modify symbolic references'
     unpack-objects:'unpack objects from packed archive'
     update-index:'register file contents in the working directory to the index'
@@ -6779,6 +6869,17 @@ __git_date_formats () {
   _describe -t date-formats 'date format' date_formats -- '( format\:custom\ format )' -S :
 }
 
+(( $+functions[_git_diff_algorithms] )) ||
+_git_diff_algorithms() {
+  _describe -t diff-algorithms 'diff algorithm' '(
+    default\:"basic greedy diff algorithm"
+    myers\:"basic greedy diff algorithm"
+    minimal\:"spend extra time to produce smallest possible diff"
+    patience\:"generate diffs with patience algorithm"
+    histogram\:"generate diffs with histogram algorithm"
+  )'
+}
+
 (( $+functions[_git_diff_filters] )) ||
 _git_diff_filters() {
   local sep
@@ -6849,7 +6950,7 @@ _git_strategy_options() {
     renormalize no-renormalize \
     'find-renames::similarity threshold' \
     subtree:path \
-    'diff-algorithm:algorithm:(patience minimal histogram myers)'
+    'diff-algorithm:algorithm:_git_diff_algorithms'
 }
 
 (( $+functions[__git_encodings] )) ||
@@ -8172,11 +8273,7 @@ __git_setup_diff_options () {
     '(--minimal --patience --histogram --diff-algorithm)--patience[generate diffs with patience algorithm]'
     '(--minimal --patience --histogram --diff-algorithm)--histogram[generate diffs with histogram algorithm]'
     '(--minimal --patience --histogram --diff-algorithm)*--anchored=[generate diffs using the "anchored diff" algorithm]:text'
-    '(--minimal --patience --histogram --diff-algorithm)--diff-algorithm=[choose a diff algorithm]:diff algorithm:((default\:"basic greedy diff algorithm"
-                                                                                                                    myers\:"basic greedy diff algorithm"
-                                                                                                                    minimal\:"spend extra time to make sure the smallest possible diff is produced"
-                                                                                                                    patience\:"generate diffs with patience algorithm"
-                                                                                                                    histogram\:"generate diffs with histogram algorithm"))'
+    '(--minimal --patience --histogram --diff-algorithm)--diff-algorithm=[choose a diff algorithm]: :_git_diff_algorithms' \
     '--stat=-[generate diffstat instead of patch]:: :__git_guard_diff-stat-width'
     '--stat-width=-[generate diffstat with a given width]:width'
     '--stat-graph-width=-[generate diffstat with a given graph width]:width'
@@ -8208,6 +8305,7 @@ __git_setup_diff_options () {
     "(--color-moved-ws)--no-color-moved-ws=[don't ignore whitespace when performing move detection]"
     "--ita-invisible-in-index[hide 'git add -N' entries from the index]"
     "!(--ita-invisible-in-index)--ita-visible-in-index"
+    '--max-depth=[specify maximum tree depth to recurse]:depth'
     '--no-renames[turn off rename detection]'
     $exclusive_diff_options'--check[warn if changes introduce trailing whitespace or space/tab indents]'
     '--full-index[show full object name of pre- and post-image blob]'
@@ -8225,7 +8323,7 @@ __git_setup_diff_options () {
     '--diff-filter=-[select certain kinds of files for diff]: :_git_diff_filters'
     '-S-[look for differences that add or remove the given string]:string'
     '-G-[look for differences whose added or removed line matches the given regex]:pattern'
-    '--pickaxe-all[when -S finds a change, show all changes in that changeset]'
+    '--pickaxe-all[when -G or -S find a change, show all changes in that changeset]'
     '--pickaxe-regex[treat argument of -S as regular expression]'
     '-O-[output patch in the order of glob-pattern lines in given file]: :_files'
     '--rotate-to=[show the change in specified path first]:path:_directories'
diff --git a/Completion/Unix/Command/_gphoto2 b/Completion/Unix/Command/_gphoto2
index 788c9702f..df17aa111 100644
--- a/Completion/Unix/Command/_gphoto2
+++ b/Completion/Unix/Command/_gphoto2
@@ -11,6 +11,7 @@ _arguments -s -C \
   '--debug-loglevel=[set debug level]:debug level:(error debug data all)' \
   '--debug-logfile=[name of file to write debug info to]:file:_files' \
   '(-q --quiet)'{-q,--quiet}'[quiet output]' \
+  '(-q --quiet)--parsable[simple parsable output]' \
   '--hook-script=[hook script to call after downloads, captures, etc.]:file:_files' \
   '--stdout[send file to stdout]' \
   '--stdout-size[print filesize before data]' \
@@ -41,8 +42,8 @@ _arguments -s -C \
   '--keep[keep images on camera after capturing]' \
   '--keep-raw[keep the RAW images on the camera with --capture-image-and-download]' \
   '--no-keep[remove images from camera after capturing]' \
-  '--wait-event=-[wait for event from camera]::count' \
-  '--wait-event-and-download=-[wait for event from camera and download new images]::count' \
+  '--wait-event=-[wait for event from camera]:: :_numbers -u events -d forever wait\ time s\:seconds ms\:milliseconds' \
+  '--wait-event-and-download=-[wait for event from camera and download new images]:: :_numbers -u events -d forever wait\ time s\:seconds ms\:milliseconds' \
   '--capture-preview[capture a quick preview]' \
   '--show-preview[capture a quick preview and display using ASCII art]' \
   '(-B --bulb)'{-B,--bulb=}'[set bulb exposure time]:exposure time (seconds)' \
@@ -54,7 +55,7 @@ _arguments -s -C \
   '--capture-image-and-download[capture an image and download it]' \
   '--capture-movie=-[capture a movie]:count or seconds' \
   '--capture-sound[capture an audio clip]' \
-  '--capture-tethered=-[wait for shutter release on the camera and download]::count' \
+  '--capture-tethered=-[wait for shutter release on the camera and download]:: :_numbers -u events wait\ time s\:seconds ms\:milliseconds' \
   '(-l --list-folders)'{-l,--list-folders}'[list folders in folder]' \
   '(-L --list-files)'{-L,--list-files}'[list files in folder]' \
   '(-m --mkdir)'{-m,--mkdir=}'[create a directory]:directory' \
@@ -75,6 +76,7 @@ _arguments -s -C \
   '(-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' \
   '--filename=[specify pattern to save file as]:pattern:_date_formats' \
+  '--filenumber=[specify the number %n in the filename pattern starts at]:starting number [1]' \
   '(-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)]' \
diff --git a/Completion/Unix/Command/_ip b/Completion/Unix/Command/_ip
index 0dde5e5f0..2d6774768 100644
--- a/Completion/Unix/Command/_ip
+++ b/Completion/Unix/Command/_ip
@@ -21,12 +21,12 @@ local -a subcmd_string
 subcmd_string=(/$'[^\0]#\0'/ ':string:arbitrary string:( )')
 
 local -a subcmd_number
-subcmd_number=(/$'[0-9]##\0'/ ':number:decimal number:( )')
+subcmd_number=(/$'[0-9]##\0'/ ': _message -e numbers "decimal number"')
 
 local xp='[[:xdigit:]][[:xdigit:]]'
 local -a subcmd_lladdr
 subcmd_lladdr=(/"${xp}:${xp}:${xp}:${xp}:${xp}:${xp}"$'\0'/ 
-':lladdress:link layer (MAC) address:( )')
+  ': _message -e lladdresses "link layer (MAC) address"')
 
 local -a subcmd_ipaddr
 subcmd_ipaddr=(
@@ -57,7 +57,7 @@ _regex_words scope "IP address scope" \
 subcmd_scope=("$reply[@]")
 
 local -a subcmd_nud
-_regex_words nud "Neighbour Unreachability Detection state" \
+_regex_words nud "neighbour unreachability detection state" \
   'permanent:valid forever' \
   'noarp:valid, not validated, removed if expired' \
   'reachable:valid until reachability timeout' \
@@ -65,7 +65,7 @@ _regex_words nud "Neighbour Unreachability Detection state" \
 subcmd_nud=("$reply[@]")
 
 local -a subcmd_rttype
-_regex_words route-type "Route type" \
+_regex_words route-type "route type" \
   'unicast:real point-to-point route' \
   'unreachable:generate Host Unreachable messages' \
   'blackhole:silently discard' \
@@ -85,12 +85,12 @@ local -a subcmd_route
 subcmd_route=("(" $subcmd_rttype "|" ")" $subcmd_ipaddr)
 
 local -a subcmd_tos
-_regex_words tos "type of service" \
+_regex_words tos "service type" \
   'lowdelay:low latency' \
   'throughput:high bulk throughput' \
   'reliability:high reliability'
 subcmd_tos=("(" "$reply[@]" "|"
-  /$'(|0x)[[:xdigit:]]##\0'/ ":hex-number:8-bit hex number:( )" ")")
+  /$'(|0x)[[:xdigit:]]##\0'/ ":hex-numbers:8-bit hex number:( )" ")")
 
 local -a subcmd_lockmtu
 subcmd_lockmtu=("(" /$'lock\0'/ ":lock:lock:(lock)" "|" ")" $subcmd_number )
@@ -123,7 +123,7 @@ local -a subcmd_rtrealm subcmd_rtrealms
 _regex_words -t / rtrealm 'routing realm' \
   'cosmos:everywhere'
 subcmd_rtrealms=("(" "$reply[@]" "|" /$'[0-9]##/'/
-  ':number:decimal number:( )' ")")
+  ':numbers:decimal number:( )' ")")
 
 _regex_words rtrealm 'routing realm' \
   'cosmos:everywhere'
@@ -160,22 +160,46 @@ _regex_words tunnelmode 'tunnel mode' \
   'gre:Generic Route Encapsulation - IPv4/IPv6 in IPv4 tunnel'
 subcmd_tunnelmode=("$reply[@]")
 
-local -a subcmd_files
-subcmd_files=(/$'[^\0]##\0'/ ':file:file name:_files')
+local -a subcmd_linktype
+subcmd_linktype=(/$'[^\0]##\0'/ ':link-types:link type:(bridge bond dummy hsr ifb ipoib macvlan macvtap vcan veth vlan vxlan ip6tnl ipip sit gre gretap ip6gre ip6gretap vti nlmon ipvlan lowpan geneve macsec vrf)')
 
+local -a subcmd_files
+subcmd_files=(/$'[^\0]##\0'/ ':files:file:_files')
 
 #
 # The ip top-level commands.  First link
 #
+
+local -a link_common_cmds
+link_common_cmds=(
+  'txq*ueuelen:specify length of transmit queue:$subcmd_number' \
+  'ad*dress:specify unicast link layer (MAC) address:$subcmd_lladdr' \
+  'br*oadcast:specify broadcast link layer (MAC) address:$subcmd_lladdr' \
+  'm*tu:specify maximum transmit unit:$subcmd_number'
+)
+local -a link_add_cmds
+_regex_words \
+  link-add-commands 'link add command' $link_common_cmds \
+    'link:specify device:$subcmd_dev' \
+    'name:specify name' \
+    'type:specify type:$subcmd_linktype' \
+    'numtxqueues:specify number of transmit queues:$subcmd_number' \
+    'numrxqueues:specify number of receive queues:$subcmd_number' \
+    'index:specify desired index' \
+    'group:multicast IP address to join:$subcmd_lladdr'
+link_add_cmds=( "$reply[@]" "#" )
+
 local -a link_set_cmds
 _regex_words \
-  link-set-commands 'link set commands' \
+  link-set-commands 'link set command' \
   'dev:specify device:$subcmd_dev' \
   'u*p:change state to up' \
   'do*wn:change state to down' \
   'ar*p:change ARP flag on device:$subcmd_onoff' \
   'mu*lticast:change MULTICAST flag on device:$subcmd_onoff' \
+  'allmulticast:change allmulticast flag on device:$subcmd_onoff' \
   'pr*omisc:set promiscuous mode:$subcmd_onoff' \
+  'protodown:change the PROTODOWN state on the device:$subcmd_onoff' \
   'dy*namic:change DYNAMIC flag on device:$subcmd_onoff' \
   'n*ame:change name of device:$subcmd_string' \
   'txq*ueuelen:specify length of transmit queue:$subcmd_number' \
@@ -189,7 +213,7 @@ _regex_words \
 link_set_cmds=("(" $subcmd_dev "|" ")" "$reply[@]" "#" )
 
 local -a link_show_cmds
-_regex_words link-show-commands 'link show commands' \
+_regex_words link-show-commands 'link show command' \
   'dev:specify device:$subcmd_dev' \
   'up:limit display to running devices'
 link_show_cmds=("(" $subcmd_dev "|" ")" "$reply[@]" "#" )
@@ -197,15 +221,16 @@ link_show_cmds=("(" $subcmd_dev "|" ")" "$reply[@]" "#" )
 local -a link_cmds
 _regex_words \
   link-commands "link command" \
+  'a*dd:add virtual link:$link_add_cmds' \
   'h*elp:show help for command' \
   'se*t:change device attributes:$link_set_cmds' \
   'sh*ow:display device attributes:$link_show_cmds'
 link_cmds=("$reply[@]")
 
-
 #
 # addr
 #
+
 local -a addr_add_cmds
 # TODO: broadcast can take + or =
 _regex_words addr-add-commands "addr add/remove/change/replace commands" \
@@ -214,7 +239,12 @@ _regex_words addr-add-commands "addr add/remove/change/replace commands" \
   'p*eer:specify peer IP address (point-to-point):$subcmd_ipaddr' \
   'b*roadcast:specify broadcast IP address:$subcmd_ipaddr' \
   'la*bel:specify tag for device:$subcmd_string' \
-  's*cope:specify scope for address:$subcmd_scope'
+  's*cope:specify scope for address:$subcmd_scope' \
+  'valid_lft:specify valid lifetime of this address' \
+  'preferred_lft:specify valid lifetime of this address' \
+  'home:designate this address as the "home address" (IPv6)' \
+  'mngtmpaddr:manage temporary addresses created from this one as template on behalf of Privacy Extensions'
+
 # can complete IP address with no keyword
 addr_add_cmds=("(" $subcmd_ipaddr "|" ")" "$reply[@]" "#" )
 
@@ -282,6 +312,7 @@ addrlabel_cmds=("$reply[@]")
 #
 # neigh
 #
+
 local -a neigh_add_cmds
 _regex_words neigh-add-commands "neighbour add command" \
   't*o:add new neighbour IP address:$subcmd_ipaddr' \
@@ -321,6 +352,7 @@ neigh_cmds=("$reply[@]")
 #
 # route
 #
+
 local -a route_add_cmds
 _regex_words route-add-commands "route add/change/replace command" \
   'to:route destination prefix:$subcmd_route' \
@@ -393,10 +425,10 @@ _regex_words \
   'g*et:get a single network route:$route_get_cmds'
 route_cmds=("$reply[@]")
 
-
 #
 # rule
 #
+
 local -a rule_add_cmds
 _regex_words rule-add-commands 'ip rule add/delete commands' \
   'ty*xpe:type of rule:$subcmd_ruletypes' \
@@ -423,10 +455,10 @@ _regex_words \
   's*how:list routing rules'
 rule_cmds=("$reply[@]")
 
-
 #
 # tunnel
 #
+
 local -a tunnel_add_cmds
 _regex_words tunnel-add-commands 'tunnel add/change/delete commands' \
   'na*me:select tunnel device name:$subcmd_dev' \
@@ -461,10 +493,10 @@ _regex_words \
   's*how:list IP tunnels'
 tunnel_cmds=("$reply[@]")
 
-
 #
 # maddr
 #
+
 local -a maddr_add_cmds
 _regex_words maddr-add-commands "maddr add/delete command" \
   'a*ddress:select link layer (MAC) address:$subcmd_lladdr' \
@@ -486,10 +518,10 @@ _regex_words \
   's*how:list multicast addresses:$maddr_show_cmds'
 maddr_cmds=("$reply[@]")
 
-
 #
 # mroute
 #
+
 local -a mroute_show_cmds
 _regex_words mroute-show-commands "mroute show command" \
   'to:select destination prefix:$subcmd_ipaddr' \
@@ -504,10 +536,10 @@ _regex_words \
   's*how:list multicast routing cache entries:$mroute_show_cmds'
 mroute_cmds=("$reply[@]")
 
-
 #
 # monitor
 #
+
 local -a monitor_cmds
 _regex_words \
   monitor-commands "monitor command" \
@@ -519,7 +551,6 @@ _regex_words \
   'file:read rtmon-generated log:$subcmd_files'
 monitor_cmds=("$reply[@]")
 
-
 #
 # Global argument handling
 #
@@ -531,20 +562,18 @@ args=(
     /$'[^\0]#\0'/
 )
 
-# TODO:
-# -b*atch <FILENAME>
-# -force (for batch mode)
-# -l*oops <COUNT>
-# -n*etns <NETNS>
-# -rc, -rcvbuf<SIZE>
-_regex_words options "ip options" \
-  '-h*uman:output statistics with human readable values' \
+_regex_words options "ip option" \
+  '-V*ersion:display version information' \
+  '-h*uman-readable:output statistics with human readable values' \
+  '-b*atch:read commands from specified file:$subcmd_files' \
+  '-force:do not terminate on errors in batch mode' \
   '-i*ec:print human readable rates in IEC units (ie. 1K = 1024)' \
   '-s*tatistics:output statistics' \
   '-d*etails:output more detailed information' \
   '-c*olor:color output' \
   '-br*ief:brief output' \
   '-a*ll:executes specified command over all objects' \
+  '-l*oops:specify maximum loops ip address flush logic will attempt:$subcmd_number' \
   '-f*amily:select protocol family:$subcmd_family' \
   '-4:IPv4' \
   '-6:IPv6' \
@@ -556,9 +585,17 @@ _regex_words options "ip options" \
   '-o*neline:output one record per line' \
   '-j*son:output results in JSON' \
   '-p*retty:pretty print JSON' \
+  '-r*esolve:use system resolver for DNS names' \
+  '-n*etns:switch to specified network namespace:$subcmd_string' \
+  '-N*umeric:print numbers instead of converting to text forms' \
+  '-a*ll:execute specified command over all objects' \
+  '-c*olor:use color output' \
   '-t*imestamp:display current time when using monitor option' \
-  '-ts*hort:display current time in shorter format when using monitor option' \
-  '-r*esolve:use system resolver for DNS names'
+  '-ts*hort:like -timestamp, but use shorter format' \
+  '-rc*vbuf:set the netlink socket receive buffer size:$subcmd_number' \
+  '-iec:print human readable rates in IEC units' \
+  '-j*son:output results in JSON format' \
+  '-echo:request the kernel to send applied changes back'
 args+=("$reply[@]" "#")
 
 _regex_words \
@@ -569,10 +606,23 @@ _regex_words \
   'r*oute:manage routing table:$route_cmds' \
   'ru*le:manage routing policy database:$rule_cmds' \
   'n*eigh:manage neighbour/ARP tables:$neigh_cmds' \
+  'nt*able:manage the neighbor cache operation' \
   't*unnel:configure tunnel:$tunnel_cmds' \
+  'net*ns:manage network namespaces' \
+  'l2*tp:tunnel ethernet over IP (L2TPv3)' \
+  'f*ou:UDP receive port configuration' \
+  'mac*sec:MACsec device configuration' \
+  'tcp_metrics:manage TCP metrics' \
+  'token:manage tokenized interface identifiers' \
+  'netc*onf:network configuration monitoring' \
+  ila ioam mptcp nexthop vrf sr stats \
   'm*addr:manage multicast addresses:$maddr_cmds' \
   'mr*oute:manage multicast routing cache:$mroute_cmds' \
-  'mo*nitor:monitor state:$monitor_cmds'
+  'mru*le:multicast routing policy database' \
+  'mo*nitor:monitor state:$monitor_cmds' \
+  'tunt*ap:manage TUN/TAP devices' \
+  'x*frm:manage IPSec policies' \
+  'help'
 args+=("$reply[@]")
 
 _regex_arguments _ip "${args[@]}"
diff --git a/Completion/Unix/Command/_jq b/Completion/Unix/Command/_jq
index e8e6b0913..fb44702b2 100644
--- a/Completion/Unix/Command/_jq
+++ b/Completion/Unix/Command/_jq
@@ -30,7 +30,7 @@ _arguments -S -s : \
   '(-r --raw-output -j --join-output)--raw-output0[like -r, with NUL after each output]' \
   '(-r --raw-output --raw-output0 -j --join-output)'{-j,--join-output}"[like -r, without newlines between outputs]" \
   '(-f --from-file)'{-f,--from-file}'[read filter from file]: :_files' \
-  '-L+[prepend a directory to the module search path]:_directories' \
+  \*{-L+,--library-path}'[prepend a directory to the module search path]:_directories' \
   '(-e --exit-status)'{-e,--exit-status}'[report "false" and "null" results via exit code]' \
   '*--arg[pre-set a variable to a string]:variable name: :value (string)' \
   '*--argjson[pre-set a variable to an object]:variable name: :value (JSON)' \
diff --git a/Completion/Unix/Command/_mtr b/Completion/Unix/Command/_mtr
index 9a73cfbd4..c5f7ea129 100644
--- a/Completion/Unix/Command/_mtr
+++ b/Completion/Unix/Command/_mtr
@@ -9,6 +9,7 @@ _arguments -s -S \
   '(H -f --first-ttl)'{-f+,--first-ttl=}'[specify TTL to start]:TTL [1]' \
   '(H -m --max-ttl)'{-m+,--max-ttl=}'[specify maximum number of hops to probe]:hops [30]' \
   '(H -U --max-unknown)'{-U+,--max-unknown=}'[specify maximum unknown hosts]:maximum [5]' \
+  '(H -E --max-display-path)'{-E+,--max-display-path=}'[specify maximum number of ECMP paths to display]:ECMP paths [8]' \
   '(H -P --port)'{-P+,--port=}'[specify target port for TCP, SCTP or UDP]:port' \
   '(H -L --localport -T --tcp -S --sctp)'{-L+,--localport=}'[specify source port number for UDP]' \
   '(H -s --psize 2)'{-s+,--psize=}'[packet size]:packet size (bytes)' \
@@ -41,6 +42,8 @@ _arguments -s -S \
     "I[interarrival jitter]"' \
   '(H -z --aslookup -y --ipinfo)'{-y+,--ipinfo=}'[select IP information in output]:information:((0\:display\ AS\ number 1\:display\ IP\ prefix 2\:display\ country\ code 3\:display\ RIR 4\:display\ allocation\ date))' \
   '(H -y --ipinfo -z --aslookup)'{-z,--aslookup}'[display AS number]' \
+  '(H)--ipinfo_provider4=[specify provider for IPv4 AS lookups]:domain [origin.asn.cymru.com]' \
+  '(H)--ipinfo_provider6=[specify provider for IPv6 AS lookups]:domain [origin6.asn.cymru.com]' \
   '(H)1:destination host:_hosts' \
   '(H)2:packet size (bytes)' \
   + '(H)' \
diff --git a/Completion/Unix/Command/_pandoc b/Completion/Unix/Command/_pandoc
index 797e73eaa..243b1ac8b 100644
--- a/Completion/Unix/Command/_pandoc
+++ b/Completion/Unix/Command/_pandoc
@@ -9,10 +9,10 @@ _pandoc_format() {
   local format=${PREFIX%%(+|-)*}
   if compset -P '*(+|-)'; then
     local pm=${IPREFIX[-1]}   # '+' or '-'
-    local -a extensions=(${${$(pandoc --list-extensions=$format):#$pm*}#(+|-)})
+    local -a extensions=( ${${$(_call_program extensions pandoc --list-extensions=$format):#$pm*}#(+|-)} )
     _wanted extensions expl 'extension' compadd -S '+' -r '-+ ' -a extensions
   else
-    local -a formats=( $(pandoc --list-$inout[2]-formats) )
+    local -a formats=( $(_call_program formats pandoc --list-$inout[2]-formats) )
     _wanted formats expl 'format' compadd -S '+' -r '-+ ' -a formats
   fi
 }
@@ -22,15 +22,19 @@ _pandoc_format() {
 _pandoc_all_formats(){
   local -a expl
   local -aU formats
-  formats=( $(pandoc --list-input-formats) $(pandoc --list-output-formats) )
-  _wanted formats expl 'format' compadd -a formats
+  formats=(
+    $(_call_program input-formats pandoc --list-input-formats)
+    $(_call_program output-formats pandoc --list-output-formats)
+  )
+  _description formats expl 'format'
+  compadd "$expl[@]" "$@" -a formats
 }
 
 # pdf engine choice
 (( $+functions[_pandoc_pdf_engine] )) ||
 _pandoc_pdf_engine(){
   _alternative \
-    'engines:engine:(pdflatex lualatex xelatex latexmk tectonic wkhtmltopdf weasyprint prince context pdfroff)' \
+    'engines:engine:(pdflatex lualatex xelatex latexmk tectonic wkhtmltopdf weasyprint pagedjs-cli prince context groff pdfroff typst)' \
     'engine-executables:engine executable:_files -g "*(#q*)"'
 }
 
@@ -43,7 +47,7 @@ _pandoc_pdf_engine_opts(){
       _tex
       ;;
     *)
-      _message "Options for ${pdf_engine}"
+      _message "option for ${pdf_engine}"
       ;;
   esac
 }
@@ -79,7 +83,7 @@ _pandoc_template(){
 (( $+functions[_pandoc_highlight_style] )) ||
 _pandoc_highlight_style(){
   _alternative \
-    'styles:style:( $(pandoc --list-highlight-styles) )' \
+    'styles:style:( $(_call_program styles pandoc --list-highlight-styles) )' \
     'style-files:style file:_files -g "*.theme(-.)"'
 }
 
@@ -195,7 +199,8 @@ _arguments -s \
   '--abbreviations=[specify a custom abbreviations file]:file:_files ' \
   {-s,--standalone}'[produce output with an appropriate header and footer]' \
   '--template=[use specified file as a custom template for the generated document. Implies --standalone]: :_pandoc_template' \
-  {\*-V+,\*--variable=}'[set the variable KEY to the value VALUE]:key\:value: ' \
+  {\*-V+,\*--variable=}'[set a template variable]:key\:value' \
+  \*--variable-json='[set a template variable to the value specified by a JSON string]:key\:json' \
   '(- :)'{-D+,--print-default-template=}'[print the system default template for an output]:format:( $(pandoc --list-output-formats) )' \
   '(- :)--print-default-data-file=[print a system default data file]:file: ' \
   '--eol=[manually specify line endings (crlf|lf|native)]: :_pandoc_eol' \
@@ -217,6 +222,7 @@ _arguments -s \
   '--no-check-certificate[disable the certificate verification]' \
   '--self-contained[produce a standalone HTML file with no external dependencies, using data: URIs to incorporate the contents of linked scripts, stylesheets, images, and videos. Implies --standalone]' \
   '--embed-resources=-[produce a standalone HTML document with no external dependencies]::enable:(true false)' \
+  '--link-images=-[include links to images instead of embedding the images in ODT]::enable:(true false)' \
   '--html-q-tags[use <q> tags for quotes in HTML]' \
   '--ascii[use only ASCII characters in output, supported only for HTML and DocBook output]' \
   '--reference-links[use reference-style links, rather than inline links]' \
@@ -224,7 +230,9 @@ _arguments -s \
   '--markdown-headings[specify style for level1 and 2 headings in markdown output]:style [atx]:(setext atx)' \
   '--list-tables=-[render tables as list tables in RST output]::enable(true false)' \
   '--top-level-division=[treat top-level headers as given division type in LaTeX, ConTeXt, DocBook and TEI output]:top level division:(default section chapter part)' \
-  {-N,--number-sections}'[number section headings in LaTeX, ConTeXt, HTML, or EPUB output]' \
+  '(--lof --list-of-figures)'{--lof=-,--list-of-figures=-}'[include an automatically generated list of figures]::enable:(true false)' \
+  '(--lot --list-of-tables)'{--lot=-,--list-of-tables=-}'[include an automatically generated list of tables]::enable:(true false)' \
+  '(-N --number-sections)'{-N-,--number-sections=-}'[number section headings in LaTeX, ConTeXt, HTML, or EPUB output]::enable:(true false)' \
   '--number-offset=[specify offset for section headings in HTML output (ignored in other output formats)]:number[number,...] [0]' \
   '--listings[use the listings package for LaTeX code blocks]' \
   {-i,--incremental}'[make list items in slide shows display incrementally (one by one)]' \
diff --git a/Completion/Unix/Command/_pv b/Completion/Unix/Command/_pv
index 0e1f148d5..4bec330a6 100644
--- a/Completion/Unix/Command/_pv
+++ b/Completion/Unix/Command/_pv
@@ -17,7 +17,6 @@ _arguments -s -S $args \
   '(-I --fineta -F --format)'{-I,--fineta}'[show absolute estimated time of arrival]' \
   '(-r --rate -F --format)'{-r,--rate}'[show data transfer rate counter]' \
   '(-a --average-rate -F --format)'{-a,--average-rate}'[show data transfer average rate counter]' \
-  '(-m --average-rate-window)'{-m+,--average-rate-window=}'[compute average rate over period]:duration (seconds) [30]' \
   '(-b --bytes -8 --bits -F --format)'{-b,--bytes}'[show number of bytes transferred]' \
   '(-8 --bits -b --bytes -F --format)'{-8,--bits}'[show number of bits transferred]' \
   '(-k --si)'{-k,--si}'[treat suffixes as multiples of 1000 rather than 1024]' \
@@ -33,10 +32,11 @@ _arguments -s -S $args \
   '(-l --line-mode -R --remote)'{-l,--line-mode}'[count lines instead of bytes]' \
   '(-0 --null -l --line-mode)'{-0,--null}'[lines are null-terminated]' \
   '(-i --interval)'{-i+,--interval=}'[update every after specified interval]:interval (seconds) [1]' \
-  '(-m --average-rate-window)'{-m,--average-rate-window}'[compute average rate over past period]:period (seconds) [30]' \
+  '(-m --average-rate-window)'{-m,--average-rate-window}'[compute average rate over period]:period (seconds) [30]' \
   '(-w --width)'{-w+,--width}'[assume terminal is specified characters wide]:width' \
   '(-H --height)'{-H+,--height=}'[assume terminal is specified rows high]:height' \
   '(-N --name)'{-N+,--name=}'[prefix visual information with given name]:name' \
+  '(-u --bar-style)'{-u+,--bar-style=}'[set default bar style]:name [plain]:(plain block granular shaded)' \
   '(-x --extra-display)'{-x+,--extra-display=}'[also send progress to destination]:destination:_sequence - compadd windowtitle processtitle' \
   '(-v --stats)'{-v,--stats}'[output transfer statistics at the end]' \
   '(-f --force -R --remote)'{-f,--force}'[output even if standard error is not a terminal]' \
@@ -70,6 +70,8 @@ case $state in
       'a:average data transfer rate'
       'b:bytes transferred so far'
       'T:percentage of transfer buffer in use'
+      'A:last written'
+      'L:previous line'
       'N:name prefix'
       '%:literal %'
     )
diff --git a/Completion/Unix/Command/_sqlite b/Completion/Unix/Command/_sqlite
index a83624083..218b92b4a 100644
--- a/Completion/Unix/Command/_sqlite
+++ b/Completion/Unix/Command/_sqlite
@@ -47,6 +47,7 @@ options+=(
   $^dashes'-bail[stop after hitting an error]'
   $^dashes'-cmd[run specified command before reading stdin]:sqlite meta-command'
   $^dashes'-deserialize[open the database using sqlite3_deserialize()]'
+  $^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'-lookaside[specify size and number of entries for lookaside memory]:size (bytes): :entries'
diff --git a/Completion/X/Command/_pdftk b/Completion/X/Command/_pdftk
index b26deb15f..4029e52fe 100644
--- a/Completion/X/Command/_pdftk
+++ b/Completion/X/Command/_pdftk
@@ -6,8 +6,7 @@ _pdfwithhandle()
     _files "$@" -g '(#i)*.pdf'
 }
 
-local expl
-local -a opts operations
+local -a expl opts operations
 
 opts=(output encrypt_40bit encrypt_128bit allow owner_pw user_pw flatten
 	compress uncompress keep_first_id keep_final_id drop_xfa verbose
@@ -22,15 +21,13 @@ case $words[CURRENT-1] in
 	;;
 
     (allow)
-	#_description permissions expl "permission"
-	#compadd $expl \
 	_values -s , permission \
 	    Printing DegradedPrinting ModifyContents Assembly CopyContents \
 	    ScreenReaders ModifyAnnotations FillIn AllFeatures
 	;;
 
     (attach_files)
-	_files "$@"
+	_files
 	;;
 
     (fill_form)
@@ -51,11 +48,9 @@ case $words[CURRENT-1] in
 esac && return 0
 
 if [[ -n $words[(r)(${(j:|:)operations})] ]]; then
-    _description options expl "option"
-    compadd $@ $expl $opts
+  _wanted options expl "option" compadd -a opts
 else
-    _tags files operations
-    _alternative \
-	'files:PDF file:_pdfwithhandle' \
-	"operations:operation:($operations)"
+  _alternative \
+    'files:PDF file:_pdfwithhandle' \
+    "operations:operation:compadd -a operations"
 fi
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.