zsh-workers
 help / color / mirror / code / Atom feed
* Updated zypper completion file
@ 2014-01-15 23:04 Holger Macht
  2014-01-16  9:46 ` İsmail Dönmez
  0 siblings, 1 reply; 2+ messages in thread
From: Holger Macht @ 2014-01-15 23:04 UTC (permalink / raw)
  To: zsh-workers; +Cc: Thomas Mitterfellner

[-- Attachment #1: Type: text/plain, Size: 223 bytes --]

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

[-- Attachment #2: _zypper --]
[-- Type: text/plain, Size: 5519 bytes --]

#compdef zypper
#
# Copyright (C) 2009 Holger Macht <holger@homac.de>
# Copyright (C) 2013 Thomas Mitterfellner <thomas.mitterfellner@gmail.com>
#
# 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 "$@"

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: Updated zypper completion file
  2014-01-15 23:04 Updated zypper completion file Holger Macht
@ 2014-01-16  9:46 ` İsmail Dönmez
  0 siblings, 0 replies; 2+ messages in thread
From: İsmail Dönmez @ 2014-01-16  9:46 UTC (permalink / raw)
  To: Holger Macht; +Cc: Zsh Hackers' List, Thomas Mitterfellner

[-- Attachment #1: Type: text/plain, Size: 480 bytes --]

Hi,


On Thu, Jan 16, 2014 at 1:04 AM, Holger Macht <holger@homac.de> wrote:

> 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.
>

Thanks for the update. I added this as a patch to openSUSE zsh package.
Should be in openSUSE 13.2 when its released.

Hopefully it will be official zsh repo by then too ;)

Regards,
ismail

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2014-01-16  9:47 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-01-15 23:04 Updated zypper completion file Holger Macht
2014-01-16  9:46 ` İsmail Dönmez

Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/zsh/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).