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

[PATCH] _apt



I found some lost completions behind the shed /ó\

lg,
Christopher

From fd9c89290b79450848d7aa926299993c7f6d3772 Mon Sep 17 00:00:00 2001
From: Christopher Bock <christopher@xxxxxxxxx>
Date: Sat, 29 Nov 2025 18:24:50 +0100
Subject: [PATCH] update _apt completion

   thanks to dana or the many tweaks.
  * fix: apt-config shell options + add missing options
  * new: satisy, autoremove, autpurge, --allow-downgrades,
    --allow-remove-essential,--allow-change-held-packages, --with-new-pkgs,
    indextargets, --snapshot/-S
  * snapshot lookup via mr/time^Wrewritten by dana to use zsh/datetime
  * edit-sources file lookup for .list & .sources
---
 Completion/Debian/Command/_apt | 64 +++++++++++++++++++++++++++++-----
 1 file changed, 56 insertions(+), 8 deletions(-)

diff --git a/Completion/Debian/Command/_apt b/Completion/Debian/Command/_apt
index 7c52262f9..aa4b3bed4 100644
--- a/Completion/Debian/Command/_apt
+++ b/Completion/Debian/Command/_apt
@@ -398,6 +398,7 @@ _apt-cmd () {
     -c,--config-file:configfile \
     -o,--option:arbitem \
     -t,--target-release:release \
+    -S,--snapshot:_apt_snapshot_dates \
     -- \
     /$'list\0'/ \( \
       \( \
@@ -412,12 +413,14 @@ _apt-cmd () {
     /$'depends\0'/ /$'[^\0]#\0'/ ':packages::_deb_packages "$expl_packages[@]" avail' \# \| \
     /$'rdepends\0'/ /$'[^\0]#\0'/ ':packages::_deb_packages "$expl_packages[@]" avail' \# \| \
     /$'policy\0'/ /$'[^\0]#\0'/ ':packages::_deb_packages "$expl_packages[@]" avail' \# \| \
+    /$'(source|build-dep)\0'/ /$'[^\0]#\0'/ ':packages::_deb_packages "$expl_packages[@]" source' \# \| \
     /$'update\0'/ \| \
     \( \
       /$'(install|download|source|build-dep)\0'/ -'subcmd=${match%?}' \
       /$'[^\0]#\0'/ ':packages::_deb_packages -qr "\n\t\- /=+-" "$expl_packages[@]" avail' \# \
       \( \
-	// '%(.|)/%' -'[[ $subcmd = install ]]' /'[]'/ ':files: :_deb_files -c' \| \
+	// '%(.|)/%' -'[[ $subcmd = install ]]' /'[]'/ ':files: :_deb_files' \| \
+	// '%(.|)/%' -'[[ $subcmd = build-dep ]]' /'[]'/ ':files: :_deb_files -D' \| \
 	/$'[^\0/=]#\/'/ /'[]'/ ':apt-releases:release name:_apt_releases' \| \
 	/$'[^\0/=]#='/ /'[]'/ ':apt-package-versions:package version:_apt_versions_of_binary_package' \| \
       \) \
@@ -426,11 +429,12 @@ _apt-cmd () {
     /$'why\0'/ /$'[^\0]#\0'/ ':packages::_deb_packages "$expl_packages[@]" installed' \| \
     /$'upgrade\0'/ \| \
     /$'autoclean\0'/ \| \
+    /$'distclean\0'/ \| \
     /$'changelog\0'/ /$'[^\0]#\0'/ ':packages::_deb_packages "$expl_packages[@]" avail' \# \| \
     /$'why-not\0'/ /$'[^\0]#\0'/ ':packages::_deb_packages "$expl_packages[@]" avail' \| \
     /$'full-upgrade\0'/ \| \
     /$'dist-upgrade\0'/ \| \
-    /$'edit-sources\0'/ \| \
+    /$'edit-sources\0'/ /$'[^\0]#\0'/ ': ::_apt_sources' \# \| \
     /"[]"/ ':argument-1::compadd "$expl_action[@]" list search showsrc show depends rdepends policy update install reinstall download source build-dep remove upgrade full-upgrade dist-upgrade edit-sources autoclean changelog autopurge autoremove purge why why-not'
 
   _apt-cmd () {
@@ -460,7 +464,12 @@ _apt-get () {
     --no-download:bool \
     --no-install-recommends:bool \
     --ignore-hold:bool \
+    --with-new-pkgs:bool \
     --no-upgrade:bool \
+    --only-upgrade:bool \
+    --allow-downgrades:bool \
+    --allow-remove-essential:bool \
+    --allow-change-held-packages:bool \
     --force-yes:bool \
     --print-uris:bool \
     --purge:bool \
@@ -477,27 +486,37 @@ _apt-get () {
     --arch-only:bool \
     --allow-unauthenticated:bool \
     --auto-remove:bool \
+    -S,--snapshot:_apt_snapshot_dates \
     -- \
     /$'update\0'/ \| \
     /$'upgrade\0'/ \| \
     \( \
-    /$'install\0'\|$'download\0'\|$'source\0'\|$'build-dep\0'/ \
-      /$'[^\0]#\0'/ ':packages::_deb_packages -qr "\n\t\- /=" "$expl_packages[@]" avail' \# \
+      /$'(source|build-dep)\0'/ /$'[^\0]#\0'/ ':packages::_deb_packages "$expl_packages[@]" source' \# \| \
+      /$'(install|download|source|build-dep)\0'/ -'subcmd=${match%?}' \
+      /$'[^\0]#\0'/ ':packages::_deb_packages -qr "\n\t\- /=+-" "$expl_packages[@]" avail' \# \
       \( \
-	/$'[^\0/=]#/'/ /'[]'/ ':apt-releases:release name:_apt_releases' \| \
-	/$'[^\0/=]#='/ /'[]'/ ':apt-package-versions:package version:_apt_versions_of_binary_package' \
+	// '%(.|)/%' -'[[ $subcmd = install ]]' /'[]'/ ':files: :_deb_files' \| \
+	// '%(.|)/%' -'[[ $subcmd = build-dep ]]' /'[]'/ ':files: :_deb_files -D' \| \
+	/$'[^\0/=]#\/'/ /'[]'/ ':apt-releases:release name:_apt_releases' \| \
+	/$'[^\0/=]#='/ /'[]'/ ':apt-package-versions:package version:_apt_versions_of_binary_package' \| \
       \) \
     \) \| \
     /$'(|auto)(purge|remove)\0'/ /$'[^\0]#\0'/ ':packages::_deb_packages "$expl_packages[@]" installed' \# \| \
     /$'dist-upgrade\0'/ \| \
     /$'dselect-upgrade\0'/ \| \
     /$'clean\0'/ \| \
+    /$'clean\0'/ \| \
     /$'autoclean\0'/ \| \
+    /$'indextargets\0'/ \| \
+    /$'distclean\0'/ \| \
     /$'changelog\0'/ /$'[^\0]#\0'/ ':packages::_deb_packages "$expl_packages[@]" avail' \# \| \
     /$'check\0'/ \| \
     /$'help\0/' \| \
     /$'(|un)markauto\0'/ /$'[^\0]#\0'/ ':packages::_deb_packages "$expl_packages[@]" installed' \# \| \
-    /"[]"/	':argument-1::compadd "$expl_action[@]" update upgrade install remove purge dist-upgrade dselect-upgrade clean autoclean changelog check source build-dep autopurge autoremove help markauto unmarkauto download'
+    /$'autoremove\0'/ /$'[^\0]#\0'/ ':packages::_deb_packages "$expl_packages[@]" installed' \# \| \
+    /$'autopurge\0'/ /$'[^\0]#\0'/ ':packages::_deb_packages "$expl_packages[@]" installed' \# \| \
+    /$'help\0/' \| \
+    /"[]"/	':argument-1::compadd "$expl_action[@]" update upgrade install reinstall remove purge dist-upgrade dselect-upgrade clean autoclean distclean changelog check source build-dep satisfy indextargets autoremove autopurge help markauto unmarkauto download'
 
   _apt-get () {
     local expl_action expl_packages
@@ -591,15 +610,19 @@ _apt-cdrom () {
 
 _apt-config () {
   _apt_arguments _apt-config \
+    --empty:bool \
+    --format:arbitem \
     -h,--help:bool \
     -v,--version:bool \
+    --audit:bool \
     -c,--config-file:configfile \
     -o,--option:arbitem \
+    --color:bool \
     -- \
     /$'shell\0'/ \
       \( \
 	/$'[^\0]#\0'/ ':parameters:shell variable to assign:_parameters' \
-	/$'[^\0]#\0'/ ':values:configuration key:compadd - ${${(f)"$(apt-config dump 2>&1)"}% *}' \
+	/$'[^\0]#\0'/ ':values:configuration key:compadd - ${(u)${(f)"$(apt-config --empty --no-color --format='%f%n' dump 2>&1)"}%%(::|) *}' \
       \) \# \| \
     /$'dump\0'/ \| \
     /"[]"/	':argument-1:action:compadd shell dump'
@@ -621,6 +644,17 @@ ${${${${(M)tmp:#*release*n=*}#*n=}%%,*}:#now}
   fi
 }
 
+_apt_sources () {
+  local diretc=etc/apt sourceparts=sources.list.d
+  local -a expl
+
+  eval "$(apt-config shell diretc dir::etc 2> /dev/null)"
+  eval "$(apt-config shell sourceparts dir::etc::sourceparts 2> /dev/null)"
+
+  _description files expl 'source file'
+  _files "${(@)expl}" -W /$diretc/$sourceparts -g '*.(list|sources)(.:t)'
+}
+
 _apt_releases () {
   local update_policy
 
@@ -710,4 +744,18 @@ _apt-mark () {
   _apt-mark "$@"
 }
 
+_apt_snapshot_dates() {
+  local -a expl dates
+  # Get last 6 months of dates
+  zmodload -i zsh/datetime && {
+    local i date last=$EPOCHSECONDS
+    for (( i = 0; i < 180; i++ )); do
+      strftime -s date %Y%m%d $last
+      dates+=( $date )
+      last=$(( last - (24 * 60 * 60) ))
+    done
+  }
+  _wanted list expl 'wayback date (yyyymmdd[ThhmmssZ])' compadd -- $dates
+}
+
 _apt "$@"
-- 
2.51.0





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