#autoload # Usage: _deb_packages expl... (installed|deinstalled|xinstalled|held|uninstalled|avail|available|source) _deb_packages_update_avail () { cachevar=_cache_deb_packages_avail if (( ! $+_cache_deb_packages_avail[1] )) && { _cache_invalid debs-avail || ! _retrieve_cache debs-avail } then _cache_deb_packages_avail=( ${(f)"$(_call_program packages apt-cache --generate pkgnames)"} ) _store_cache debs-avail $cachevar fi } _deb_packages_update_installed () { cachevar=_cache_deb_packages_installed if (( ! $+_cache_deb_packages_installed[1] )) && { _cache_invalid debs-installed || ! _retrieve_cache debs-installed } then _cache_deb_packages_installed=( ${${(M)${(f)"$(_call_program packages dpkg --get-selections)"}:#*([^e]install|hold)}%%[[:blank:]]*} ) _store_cache debs-installed $cachevar fi } _deb_packages_update_held () { cachevar=_cache_deb_packages_held if (( ! $+_cache_deb_packages_held[1] )) && { _cache_invalid debs-held || ! _retrieve_cache debs-held } then _cache_deb_packages_held=( ${${(M)${(f)"$(_call_program packages dpkg --get-selections)"}:#*hold}%%[[:blank:]]*} ) _store_cache debs-held $cachevar fi } _deb_packages_update_deinstalled () { cachevar=_cache_deb_packages_deinstalled if (( ! $+_cache_deb_packages_deinstalled[1] )) && { _cache_invalid debs-deinstalled || ! _retrieve_cache debs-deinstalled } then _cache_deb_packages_deinstalled=( ${${(M)${(f)"$(_call_program packages dpkg --get-selections)"}:#*deinstalled}%%[[:blank:]]*} ) _store_cache debs-deinstalled $cachevar fi } _deb_packages_update_xinstalled () { cachevar=_cache_deb_packages_xinstalled if (( ! $+_cache_deb_packages_xinstalled[1] )) && { _cache_invalid debs-xinstalled || ! _retrieve_cache debs-xinstalled } then _cache_deb_packages_xinstalled=( ${${(f)"$(_call_program packages dpkg --get-selections)"}%%[[:blank:]]*} ) _store_cache debs-xinstalled $cachevar fi } _deb_packages_update_uninstalled () { if (( ! $+_cache_deb_packages_uninstalled )); then _deb_packages_update_avail _deb_packages_update_installed _cache_deb_packages_uninstalled=( ${_cache_deb_packages_avail:|_cache_deb_packages_installed} ) fi cachevar=_cache_deb_packages_uninstalled } _deb_packages_update_source () { cachevar=_cache_deb_packages_source if (( ! $+_cache_deb_packages_source[1] )) && { _cache_invalid debs-source || ! _retrieve_cache debs-source } then _cache_deb_packages_source=( # requires apt >= 1.1.8 # if dpkg --compare-versions "$(dpkg-query --show --showformat '${Version}\n' apt)" '>=' '1.1.8' ; then ...; else ...; fi ${(f)"$(/usr/lib/apt/apt-helper cat-file $(apt-get indextargets --format '$(FILENAME)' 'Created-By: Sources' 2>/dev/null) 2>/dev/null | sed -ne 's/^Package: //p' | uniq)"} ) _store_cache debs-source $cachevar fi } _deb_packages () { local command="$argv[$#]" expl cachevar pkgset update_policy zstyle -s ":completion:*:*:$service:*" cache-policy update_policy if [[ -z "$update_policy" ]]; then zstyle ":completion:*:*:$service:*" cache-policy _debs_caching_policy fi [[ "$command" = (installed|deinstalled|xinstalled|held|uninstalled|avail|available|source) ]] || { _message "unknown command: $command" return } zstyle -s ":completion:${curcontext}:" packageset pkgset [[ "$pkgset" = (installed|deinstalled|xinstalled|held|uninstalled|avail|available|source) ]] || { pkgset="$command" } [[ "$pkgset" = "available" ]] && pkgset="avail" expl=("${(@)argv[1,-2]}") _deb_packages_update_$pkgset typeset -gH $cachevar _tags packages && compadd "$expl[@]" -a - $cachevar } _debs_caching_policy () { # rebuild if cache is more than a week old local -a oldp oldp=( "$1"(mw+1) ) (( $#oldp )) && return 0 [[ /var/cache/apt/pkgcache.bin -nt "$1" || /var/lib/dpkg/available -nt "$1" ]] } _deb_packages "$@"