Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
_zypper completion
- X-seq: zsh-workers 32265
- From: Thomas Mitterfellner <thomas.mitterfellner@xxxxxxxxx>
- To: zsh-workers@xxxxxxx
- Subject: _zypper completion
- Date: Thu, 16 Jan 2014 19:35:49 +0100
- Cc: ismail@xxxxxxxxx, holger@xxxxxxxx
- Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=message-id:date:from:user-agent:mime-version:to:cc:subject :content-type; bh=HERKmoDqFuHlRNiLfKfEiRg3Lgcx8ie7xRfJP1jogRk=; b=y+r2EAaMVKIzDF8wP3xR7UOTMACRKlBzPSsksgyuJFIuVU+xVLuLSOdh/GJeysi904 FACfTLzCIfrCityaKRMMdcWV02kPnemR8hZG0l3Pl9EwFbtjqeUOGmqryEZNBK8TF/nj oJBvl9wZURaTBV9JkhypbgqSB/yjmSsGJHLhKXt9s4F0Ctr3m2dpFo1+aDZmL2LyV3Eb KoJso0p2iKybCcc4ag1YhtwaUNZziYy6sIt5XFt9S8GLNyYabbK7fj/M5QZr1dZgqmr3 4RMQ9XFnD+BngC33veI0YrhW/Ji5Mfg9ev+s8qGqqz5P3vL63tWxh/Fyh3PxOef7wwzV 4LKw==
- List-help: <mailto:zsh-workers-help@zsh.org>
- List-id: Zsh Workers List <zsh-workers.zsh.org>
- List-post: <mailto:zsh-workers@zsh.org>
- Mailing-list: contact zsh-workers-help@xxxxxxx; run by ezmlm
Hello there!
Since I sent the first mail with my proposed zypper packages completion
extension to Holger, I noticed that holding the whole raw xml output I
get from zypper in one variable ($_zypp_all_raw) might truncate the
output (thus not containing all available packages) since it may get
quite large.
So I updated the _zypper script so that a lot of 'weight' of the output
(xml syntax, package descriptions) is dropped. On my system with 14
repos enabled, I'm now offered all packages when doing zypper se <TAB>.
If anyone more knowledgable has suggestions on how to improve that
script, please go ahead!
Greetings,
Thomas
#compdef zypper
#
# Copyright (C) 2009 Holger Macht <holger@xxxxxxxx>
# Copyright (C) 2014 Thomas Mitterfellner <thomas.mitterfellner@xxxxxxxxx>
#
# This file is released under the GPLv2.
#
# Based on the zsh guide from http://zsh.dotsrc.org/Guide/zshguide06.html
#
# Toggle verbose completions: zstyle ':completion:*:zypper:*' verbose no
# zstyle ':completion:*:zypper-subcommand:*' verbose no
#
# version 0.3
#
# Main dispatcher
function _zypper_caching_policy () {
# rebuild if zsh's cache is older than zypper's
if test /var/cache/zypp/raw -nt "$1"; then
return 0
else
return 1
fi
}
_zypper() {
typeset -A opt_args
local context curcontext="$curcontext" state line
if (( CURRENT > 2 )) && [[ ${words[2]} != "help" ]]; then
# Remember the subcommand name
local cmd=${words[2]}
# Set the context for the subcommand.
curcontext="${curcontext%:*:*}:zypper-subcommand"
# Narrow the range of words we are looking at to exclude `zypper'
(( CURRENT-- ))
shift words
_zypper_cmd_do $cmd
else
local hline
local -a cmdlist
local tag=0
_call_program help-commands LANG=C zypper help | sed -e ':a;N;$!ba;s/\n\t\t\t\t/ /g' | while read -A hline; do
# start parsing with "Global Options:"
[[ $hline =~ "^Global Options:" ]] && tag=1
[[ $tag = 0 ]] && continue
# all commands have to start with lower case letters
[[ $hline[1] =~ ^[A-Z] ]] && continue
(( ${#hline} < 2 )) && continue
# cut comma at end of command
hline[1]=`echo $hline[1] | sed -e 's/\(^.*\),/\1/'`
# ${hline[1]%,} truncates the last ','
cmdlist=($cmdlist "${hline[1]%,}:${hline[2,-1]}")
done
_describe -t zypper-commands 'zypper command' cmdlist
fi
}
_all_repos() {
local -a repos
repos=( $(zypper -q lr | tail -n +3 | cut -d'|' -f 2) )
_describe -t repos 'Available repositories' repos && return
}
_enabled_repos() {
repos=( $(zypper -x lr | grep 'enabled="1"' | cut -d\" -f 2) )
_describe -t repos 'Available repositories' repos && return
}
_disabled_repos() {
repos=( $(zypper -x lr | grep 'enabled="0"' | cut -d\" -f 2) )
_describe -t repos 'Available repositories' repos && return
}
_zypper_cmd_do() {
typeset -A opt_args
local context state line
local hline
local -a cmdlist
local tag=0
local curcontext="$curcontext"
zstyle ":completion:${curcontext}:" use-cache on
zstyle ":completion:${curcontext}:" cache-policy _zypper_caching_policy
_call_program help-commands LANG=C zypper help $cmd | while read -A hline; do
# start parsing from "Options:"
[[ $hline =~ "^Command options:" ]] && tag=1
[[ $tag = 0 ]] && continue
# Option has to start with a '-'
[[ $hline[1] =~ ^- ]] || continue
(( ${#hline} < 2 )) && continue
cmdlist=($cmdlist "${hline[1]%,}:${hline[2,-1]}")
done
if [ -n "$cmdlist" ]; then
local -a repos
# special completion lists for certain options (mainly repos)
case ${words[CURRENT - 1]} in
--from)
repos=( $(zypper -x lr | grep 'enabled="1"' | cut -d\" -f 2) )
_describe -t repos 'Available repositories' repos && return
;;
(--enable|-e)
case $cmd in
(mr|modifyrepo)
_disabled_repos && return
;;
esac
;;
(--disable|-d)
case $cmd in
(mr|modifyrepo)
_enabled_repos && return
;;
esac
;;
(--type|-t)
local -a types
case $cmd in
(if|info|se|search|in|install)
types=( pattern srcpackage package patch )
_describe -t types 'Package types' types && return
;;
esac
;;
esac
# all options available for the active main command
_describe -t zypper-commands 'zypper command' cmdlist
case $cmd in
(lr|repos)
_all_repos
;;
(in|install)
local expl
_description files expl 'RPM files'
_files "$expl[@]" -g '*.(#i)rpm(.)'
;;
esac
# only suggest packages if at least one character is given
if [[ ${words[CURRENT]} =~ "^[0-9a-zA-Z]" ]] ; then
local -a pkglist
if ( [[ ${+_zypp_all_raw} -eq 0 ]] || _cache_invalid ZYPPER_ALL_RAW ) && ! _retrieve_cache ZYPPER_ALL_RAW;
then
_zypp_all_raw=$(zypper -x -q se | grep '<solvable' | cut -d \" -f 2,4)
_zypp_all=( $(echo $_zypp_all_raw | grep 'installed' | cut -d\" -f 2) )
_zypp_not_installed=( $(echo $_zypp_all_raw | grep 'not-installed' | cut -d\" -f 2 ) )
_zypp_installed=( $(echo $_zypp_all_raw | grep '^installed' | cut -d\" -f 2 ) )
_store_cache ZYPPER_ALL_RAW _zypp_all_raw _zypp_all _zypp_not_installed _zypp_installed
fi
case $cmd in
(in|install)
pkglist=( $_zypp_not_installed )
compadd $pkglist && return
;;
(rm|remove|up|update)
pkglist=( $_zypp_installed )
compadd $pkglist && return
;;
(if|info|se|search)
pkglist=( $_zypp_all )
compadd $pkglist && return
;;
esac
fi
else
_complete
fi
}
# Code to make sure _zypper is run when we load it
_zypper "$@"
Messages sorted by:
Reverse Date,
Date,
Thread,
Author