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

Updated zypper completion file



Hello,

attached is an updated version of the completion file for zypper. It
includes support for repository and package names, thanks to Thomas
Mitterfellner. Please include as soon as time permits.

Best regards,
 Holger
#compdef zypper
#
# Copyright (C) 2009 Holger Macht <holger@xxxxxxxx>
# Copyright (C) 2013 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.2
#
# Main dispatcher

function _zypper_caching_policy () {
   # rebuild if cache is more than a week old
   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 ')
            _zypp_all=( $(echo $_zypp_all_raw | grep 'installed' | cut -d\" -f 4) )
            _zypp_not_installed=( $(echo $_zypp_all_raw | grep 'not-installed' | cut -d\" -f 4 ) )
            _zypp_installed=( $(echo $_zypp_all_raw | grep '"installed"' | cut -d\" -f 4 ) )
            _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