# [ZSH] Fonction de completion pour emerge (intégré à portage)

## Bapt

Update : intégré dans portage avec app-shells/zsh-completion

Voila, j'en ai parler y a un moment, maintenant je l'ai fait  :Wink: 

Une fonction de completion ZSH pour emerge.

Est-ce que vous pouvez la tester, pour moi ça à l'air bon à par la beauté du code  :Wink: 

au programme :

- Toutes ou presque les options en completion 

-completion sur le nom du portage avec l'option -s

- completion sur les pkg installés (cat/nom) avec unmerge

- completion sur les pkg dispo (cat/nom) avec les autres options si elles en ont besoins

voila il faut tester, me dire ce qui va pas, voire modifier et si des gens ont envie de nettoyer le code, allez y  :Smile: 

Une fois que ce sera bien propre comme il faut, je le soumetterai aux dev de ZSH, pour qu'ils l'incorpore dans leur CVS, ils le font facilement.

il faut copier ça dans /usr/share/zsh/version/functions/Completion/Linux/_portage

```

#compdef emerge

_emerge () {

    local state

    if (( CURRENT == 2 ));then

        _arguments \

            ':*:->actions' \

            "$common_args[@]" "$install_args[@]" && return 0

    elif (( CURRENT > 2 ));then

            case "$words[2]" in

            unmerge)

                _arguments \

                '*:installed pkg:_unmerge' "$common_args[@]" && return 0

            ;;

            clean);;

            depclean);;

            -c);;

            -C);;

            help);;

            -h);;

            info);;

            inject)

                _arguments \

                '*:portage:_files -W /usr/portage/ -/'

            ;;

            -j)

                _arguments \

                '*:portage:_files -W /usr/portage -/'

            ;;

            prune)

                _arguments \

                '*:portage:_files -W /usr/portage -/'

            ;;

            -P)

                _arguments \

                '*:portage:_files -W /usr/portage -/'

            ;;

            search);;

            -s)

          _arguments \

      '*:portage:_search_list'

       ;;

            --seachdesc);;

            -S);;

            regen);;

            sync);;

            rsync);;

            *)

                _arguments \

                ':Special action:->special' \

                "$common_args[@]" \

      "$install_args[@]" && return 0

             ;;

             esac

    fi

    while [[ -n "$state" ]]; do

        lstate=$state

        state=''

        case "$lstate" in

        actions)

            _alternative \

            ':emerge actions:_actions' \

            '*:portage:_listeportage'

        ;;

        special)

            _alternative \

            ':particular:_special' \

            '*:portage:_listeportage'

        esac

    done

}

_unmerge(){

   installed_portage=(/var/db/pkg/*/*)

   installed_dir=/var/db/pkg/

   installed_pkg=${(M)${${installed_portage//$installed_dir/$rem}%/}:#*-*}

   _tags installed_pkg && { compadd "$@" -k installed_pkg || compadd "$@" ${(kv)=installed_pkg} }

}

_search_list(){

   search_portage=${${(M)${${${portages//$portagedir/$rem}%/}:#*.eclass}:#*-*}:t}

   _tags search_portage && { compadd "$@" -k search_portage || compadd "$@" ${(kv)=search_portage} }

}

_listeportage(){

   _tags portages_list && { compadd "$@" -k portages_list || compadd "$@" ${(kv)=portages_list} }

}

_special(){

    _values "particular" \

    'world[Represente all packages in the world profiles]' \

    'system[Represent all the system packages]'

}

common_args=(

{'(-p)--pretend','(--pretend)-p'}'[simply  display  what would be done]'

{'(-d)--debug','(--debug)-d'}'[Tells emerge to run the emerge command in debug mode]'

)

   install_args=(

{'(--upgradeonly -U --update -u --quiet -q --onlydeps -o --oneshot --nospinner --noreplace -n --nodeps -O --noconfmem -D --deep --changelog --buildpkg -B -b --buildpkgonly --emptytree -e -f --fetchonly)-l','(--upgradeonly -U --update -u --quiet -q --onlydeps -o --nospinner --noreplace -n --nodeps -O --noconfmem -D --deep --emptytree -e -f --fetchonly -l --buildpkg -b -B --buildpkgonly )--changelog'}'[This will show the ChangeLog]'

{'(-b --buildpkgonly -B --changelog -l)--buildpkg','(--changelog -l --buildpkg --buildpkgonly -B)-b'}'[Tells emerge to build binary packages]' \

{'(-B -b --buildpkg --changelog -l)--buildpkgonly','(--changelog -l --buildpkgonly --buildpkg -b)-B'}'[Tells emerge to only build binary packages]' \

{'(-D --changelog -l)--deep','(-l --changelog --deep)-D'}'[Consider the entire dependency tree of packages]'

{'(-e -l --changelog)--emptytree','(--emptytree -l --changelog)-e'}'[Only consider glibc as installed packages]'

{'(-f -l --changelog)--fetchonly','(-l --changelog --fetchonly)-f'}'[Just perform fetches for all packages]'

'(-l --changelog)--noconfmem[Causes portage to disregard merge records]'

{'(--changelog -l -O)--nodeps','(--nodeps --changelog -l)-O'}'[Merges specified  packages  without  merging  dependencies]'

{'(-l --changelog -n)--noreplace','(-l --changelog --noreplace)-n'}'[Skip packages already installed]'

'(-l --changelog)--nospiner[Disables the spinner for the session]'

'(-l --changelog)--oneshot[Do not add package to the world profile]'

{'(--onlydeps --changelog -l)-o','(--changelog -o -l)--onlydeps'}'[Only  merge  (or pretend to merge) the dependencies]'

{'(--quiet --changelog -l)-q','(-q --changelog -l)--quiet'}'[General outcome is a reduced  or  condensed output]'

{'(--update --changelog -l)-u','(-u --changelog -l)--update'}'[Updates packages to the most  recent  version  available]'

{'(--upgradeonly --changelog -l)-U','(-U --changelog -l)--upgradeonly'}'[Do not update packages to a lower version]'

)

_options() {

    _arguments \

    "$unmerge_args[@]" "$common_args[@]" "$install_args[@]"

}

_actions() {

    _values "emerge actions" \

    'sync[Initiates a portage tree update]' \

    'rsync[Initiates a portage tree update]' \

    'unmerge[Removes all matching packages]' \

    'search[Searches for matches]' \

    'regen[Causes  portage  to check and update the dependency cache]' \

    'prune[Removes  all but the latest versions of matching packages]' \

    'inject[Portage thinks that this package is installed]' \

    'info[This is a list of information to include in  bug  reports]' \

    'help[Displays help]' \

    'depclean[Clean all packages that have no reason for being installed]'\

    'clean[Cleans the system by removing packages]' \

    '-c[Cleans the system by removing packages]' \

    '-h[Displays help]' \

    '-j[Portage thinks that this package is installed]' \

    '-P[Removes  all but the latest versions of matching packages]' \

    '-s[Searches for matches]' \

    '-S[Matches the search string against the description field]' \

    '--searchdesc[Matches the search string against the description field]' \

    '-C[Removes all matching packages]' \

    'world[Represente all packages in the world profiles]' \

    'system[Represent all the system packages]'

}

portages=(/usr/portage/*/*)

portagedir=/usr/portage/

rem=''

portages_list=${${(M)${${${portages//$portagedir/$rem}%/}:#*.eclass}:#*-*}:#*.*}

_emerge "$@" 

```

puis 

```

compdef -a _portage emerge

```

Last edited by Bapt on Fri Jan 21, 2005 7:42 am; edited 3 times in total

----------

## Bapt

Puisque ca n'intéresse personne, je ne vais pas continuer.

----------

## gim

Hey, moi ça m'itéresse ... !!

J'avais raté le post la première fois ... je viens de le tester et je trouve ça pas mal ! Je lui reproche juste le fait qu'il complète sur (cat/nom) et pas à la fois sur (cat/nom) et (nom), mais je m'y connais pas en script zsh ... alors je connais pas les complications associées ...

Sinon, je suppose que la complétion sélective sur -u c'est trop compliqué... c'est bien dommage, mais c'est comme ça ... Gentoo n'a pas prévu de mettre a jour une base de données apres un sync  :Crying or Very sad:  ...

Mais merci !! Le script est déjà d'une aide très appréciable !  :Wink: 

----------

## yuk159

Biensur que ca interresse quelqu'un, seulement je pense simplement que le nombres de gens qui utilise zsh sur le forum est limite.

Desole de ne as avoir repondu mais perso j'utilise bash.

Mais je te remerci pour ton script et ne soit pas trop decu quand personne ne repond.

a+

----------

## Bapt

 *gim wrote:*   

> Hey, moi ça m'itéresse ... !!
> 
> J'avais raté le post la première fois ... je viens de le tester et je trouve ça pas mal ! Je lui reproche juste le fait qu'il complète sur (cat/nom) et pas à la fois sur (cat/nom) et (nom), mais je m'y connais pas en script zsh ... alors je connais pas les complications associées ...
> 
> 

 

Voila c'est fait, c'est un peu plus lent mais ca marche : la completion sur cat/nom et nom directement. (g laissé cat/nom pour les softs genre rsync)

Il n'y a plus de completion sur le contenu de distfiles pour le -s

Par contre, pour le -u c'est possible mais ce serait super lent, puis que je devrait lancer la commande avec l'option -p puis la parser donc on oubli  :Smile: 

```

#compdef emerge

_emerge () {

    local state

    if (( CURRENT == 2 ));then

        _arguments \

            ':*:->actions' \

            "$common_args[@]" "$install_args[@]" && return 0

    elif (( CURRENT > 2 ));then

            case "$words[2]" in

            unmerge)

                _arguments \

                '*:installed pkg:_unmerge' "$common_args[@]" && return 0

            ;;

            clean);;

            depclean);;

            -c);;

            -C);;

            help);;

            -h);;

            info);;

            inject)

                _arguments \ 

                '*:portage:_files -W /usr/portage/ -/'

            ;;

            -j)

                _arguments \ 

                '*:portage:_files -W /usr/portage -/'

            ;;

            prune)

                _arguments \

                '*:portage:_files -W /usr/portage -/'

            ;;

            -P)

                _arguments \

                '*:portage:_files -W /usr/portage -/'

            ;;

            search);;

            -s)

          _arguments \

      '*:portage:_search_list'

       ;;

            --seachdesc);;

            -S);;

            regen);;

            sync);;

            rsync);;

            *)

                _arguments \

                ':Special action:->special' \

                "$common_args[@]" \

      "$install_args[@]" && return 0

             ;;

             esac

    fi

    while [[ -n "$state" ]]; do

        lstate=$state

        state=''

        case "$lstate" in

        actions)

            _alternative \

            ':emerge actions:_actions' \

            '*:portage:_listeportage'

        ;;

        special)

            _alternative \

            ':particular:_special' \

            '*:portage:_listeportage' 

        esac

    done

}

_unmerge(){

   installed_portage=(/var/db/pkg/*/*)

   installed_dir=/var/db/pkg/

   installed_pkg=${(M)${${installed_portage//$installed_dir/$rem}%/}:#*-*}

   _tags installed_pkg && { compadd "$@" -k installed_pkg || compadd "$@" ${(kv)=installed_pkg} }

}

_search_list(){

   search_portage=${${(M)${${${${portages//$portagedir/$rem}:#distfi*}%/}:#*.eclass}:#*-*}:t}

   _tags search_portage && { compadd "$@" -k search_portage || compadd "$@" ${(kv)=search_portage} }

}

_listeportage(){

   _tags portages_list && { compadd "$@" -k portages_list || compadd "$@" ${(kv)=portages_list} }

}

_special(){

    _values "particular" \

    'world[Represente all packages in the world profiles]' \

    'system[Represent all the system packages]'

}

common_args=(

{'(-p)--pretend','(--pretend)-p'}'[simply  display  what would be done]'

{'(-d)--debug','(--debug)-d'}'[Tells emerge to run the emerge command in debug mode]'

)

   install_args=(

{'(--upgradeonly -U --update -u --quiet -q --onlydeps -o --oneshot --nospinner --noreplace -n --nodeps -O --noconfmem -D --deep --changelog --buildpkg -B -b --buildpkgonly --emptytree -e -f --fetchonly)-l','(--upgradeonly -U --update -u --quiet -q --onlydeps -o --nospinner --noreplace -n --nodeps -O --noconfmem -D --deep --emptytree -e -f --fetchonly -l --buildpkg -b -B --buildpkgonly )--changelog'}'[This will show the ChangeLog]'

{'(-b --buildpkgonly -B --changelog -l)--buildpkg','(--changelog -l --buildpkg --buildpkgonly -B)-b'}'[Tells emerge to build binary packages]' \

{'(-B -b --buildpkg --changelog -l)--buildpkgonly','(--changelog -l --buildpkgonly --buildpkg -b)-B'}'[Tells emerge to only build binary packages]' \

{'(-D --changelog -l)--deep','(-l --changelog --deep)-D'}'[Consider the entire dependency tree of packages]'

{'(-e -l --changelog)--emptytree','(--emptytree -l --changelog)-e'}'[Only consider glibc as installed packages]'

{'(-f -l --changelog)--fetchonly','(-l --changelog --fetchonly)-f'}'[Just perform fetches for all packages]'

'(-l --changelog)--noconfmem[Causes portage to disregard merge records]'

{'(--changelog -l -O)--nodeps','(--nodeps --changelog -l)-O'}'[Merges specified  packages  without  merging  dependencies]'

{'(-l --changelog -n)--noreplace','(-l --changelog --noreplace)-n'}'[Skip packages already installed]'

'(-l --changelog)--nospiner[Disables the spinner for the session]'

'(-l --changelog)--oneshot[Do not add package to the world profile]'

{'(--onlydeps --changelog -l)-o','(--changelog -o -l)--onlydeps'}'[Only  merge  (or pretend to merge) the dependencies]'

{'(--quiet --changelog -l)-q','(-q --changelog -l)--quiet'}'[General outcome is a reduced  or  condensed output]'

{'(--update --changelog -l)-u','(-u --changelog -l)--update'}'[Updates packages to the most  recent  version  available]'

{'(--upgradeonly --changelog -l)-U','(-U --changelog -l)--upgradeonly'}'[Do not update packages to a lower version]'

)

_options() {

    _arguments \

    "$unmerge_args[@]" "$common_args[@]" "$install_args[@]"

}

_actions() {

    _values "emerge actions" \

    'sync[Initiates a portage tree update]' \

    'rsync[Initiates a portage tree update]' \

    'unmerge[Removes all matching packages]' \

    'search[Searches for matches]' \

    'regen[Causes  portage  to check and update the dependency cache]' \

    'prune[Removes  all but the latest versions of matching packages]' \

    'inject[Portage thinks that this package is installed]' \

    'info[This is a list of information to include in  bug  reports]' \

    'help[Displays help]' \

    'depclean[Clean all packages that have no reason for being installed]'\

    'clean[Cleans the system by removing packages]' \

    '-c[Cleans the system by removing packages]' \

    '-h[Displays help]' \

    '-j[Portage thinks that this package is installed]' \

    '-P[Removes  all but the latest versions of matching packages]' \

    '-s[Searches for matches]' \

    '-S[Matches the search string against the description field]' \

    '--searchdesc[Matches the search string against the description field]' \

    '-C[Removes all matching packages]' \

    'world[Represente all packages in the world profiles]' \

    'system[Represent all the system packages]' 

}

portages=(/usr/portage/*/*)

portagedir=/usr/portage/

rem=''

portages_list=${${(M)${${${portages//$portagedir/$rem}%/}:#*.eclass}:#*-*}:#*.*}

search_portage=${${(M)${${${${portages//$portagedir/$rem}:#distfi*}%/}:#*.eclass}:#*-*}:t}

   search_portage=${${(M)${${${${portages//$portagedir/$rem}:#distfi*}%/}:#*.eclass}:#*-*}:t}

portages_list="$portages_list $search_portage"

_emerge "$@"

```

----------

## ghoti

 *baptux wrote:*   

> 
> 
> ```
> 
>   [...] 
> ...

 

Ce ne serait pas "-i" au lieu de "-j" ?

Juste mes 2 cents ...

----------

## Bapt

 *ghoti wrote:*   

>  *baptux wrote:*   
> 
> ```
> 
>   [...] 
> ...

 

Oups...  :Smile:  oui il faut le corriger.

----------

## gim

 *baptux wrote:*   

> Par contre, pour le -u c'est possible mais ce serait super lent, puis que je devrait lancer la commande avec l'option -p puis la parser donc on oubli

 

C'est bien ce qu'il me sembalait  :Crying or Very sad:  (A moins de hacker portage pour qu'il fasse une liste qqpart des soft qui peuvent être mis à jour... mais c'est difficilement maintenable... et je suppose que c'est d'ailleurs déjà envisagé par les devellopeurs)

Bon, je m'en vais de ce pas tester ton nouveau script  :Smile:  ...

----------

## gim

Cool, ça marche bien !

Un dernier petit truc, si c'etait possible que la complétion ait aussi lieu apres des

-p,-v, -d, -D, -n, -f, -e, -U, -K,  -k ou -l  :Smile: 

En gros il suffirait de les oublier....

Par exemple sur emerge -upv, se serait bien que ça se comporte comme sur emerge -u !

----------

## Bapt

 *gim wrote:*   

> Cool, ça marche bien !
> 
> Un dernier petit truc, si c'etait possible que la complétion ait aussi lieu apres des
> 
> -p,-v, -d, -D, -n, -f, -e, -U, -K,  -k ou -l 
> ...

 

Ca marche si tu les fait les uns après les autres :

```

emerge -u -p -v [tab]

```

par contre je ne sais pas encore comment les faire si ils sont collés, j'avoue que ca me dérange aussi  :Smile: 

Je viens de me rendre compte que j'ai oublié de -v  :Smile: 

J'essaye de le corriger et je posterais la correction dès que c'est fait.

Si quelqu'un sait comment faire, qu'il n'hésite pas  :Smile: 

----------

## Bapt

Finalement ça a été plus rapide que prévu, info zsh m'a donné la réponse  :Wink: 

J'ai aussi rajouter un -v et supprimer un variable instanciée plusieurs fois ce qui devrait être un peu plus rapide

Pour info si vous voulez une completion un peu plus rapide, vous pouvez aussi activer le cache zsh pour la completion :

```

zstyle ':completion:*' use-cache true

zstyle ':completion:*' cache-path ~/.zsh/cache

```

```

#compdef emerge

_emerge () {

    local state

    if (( CURRENT == 2 ));then

        _arguments -s \

            ':*:->actions' \

            "$common_args[@]" "$install_args[@]" && return 0

    elif (( CURRENT > 2 ));then

            case "$words[2]" in

            unmerge)

                _arguments -s \

                '*:installed pkg:_unmerge' "$common_args[@]" && return 0

            ;;

            clean);;

            depclean);;

            -c);;

            -C);;

            help);;

            -h);;

            info);;

            inject)

                _arguments -s \ 

                '*:portage:_files -W /usr/portage/ -/'

            ;;

            -j)

                _arguments -s \ 

                '*:portage:_files -W /usr/portage -/'

            ;;

            prune)

                _arguments -s \

                '*:portage:_files -W /usr/portage -/'

            ;;

            -P)

                _arguments -s  \

                '*:portage:_files -W /usr/portage -/'

            ;;

            search);;

            -s)

          _arguments -s \

      '*:portage:_search_list'

       ;;

            --seachdesc);;

            -S);;

            regen);;

            sync);;

            rsync);;

            *)

                _arguments -s \

                ':Special action:->special' \

                "$common_args[@]" \

      "$install_args[@]" && return 0

             ;;

             esac

    fi

    while [[ -n "$state" ]]; do

        lstate=$state

        state=''

        case "$lstate" in

        actions)

            _alternative \

            ':emerge actions:_actions' \

            '*:portage:_listeportage'

        ;;

        special)

            _alternative \

            ':particular:_special' \

            '*:portage:_listeportage' 

        esac

    done

}

_unmerge(){

   installed_portage=(/var/db/pkg/*/*)

   installed_dir=/var/db/pkg/

   installed_pkg=${(M)${${installed_portage//$installed_dir/$rem}%/}:#*-*}

   _tags installed_pkg && { compadd "$@" -k installed_pkg || compadd "$@" ${(kv)=installed_pkg} }

}

_search_list(){

   _tags search_portage && { compadd "$@" -k search_portage || compadd "$@" ${(kv)=search_portage} }

}

_listeportage(){

   _tags portages_list && { compadd "$@" -k portages_list || compadd "$@" ${(kv)=portages_list} }

}

_special(){

    _values "particular" \

    'world[Represente all packages in the world profiles]' \

    'system[Represent all the system packages]'

}

common_args=(

{'(-p)--pretend','(--pretend)-p'}'[simply  display  what would be done]'

{'(-d)--debug','(--debug)-d'}'[Tells emerge to run the emerge command in debug mode]'

)

   install_args=(

{'(--upgradeonly -U --update -u --quiet -q --onlydeps -o --oneshot --nospinner --noreplace -n --nodeps -O --noconfmem -D --deep --changelog --buildpkg -B -b --buildpkgonly --emptytree -e -f --fetchonly)-l','(--upgradeonly -U --update -u --quiet -q --onlydeps -o --nospinner --noreplace -n --nodeps -O --noconfmem -D --deep --emptytree -e -f --fetchonly -l --buildpkg -b -B --buildpkgonly )--changelog'}'[This will show the ChangeLog]'

{'(-b --buildpkgonly -B --changelog -l)--buildpkg','(--changelog -l --buildpkg --buildpkgonly -B)-b'}'[Tells emerge to build binary packages]' \

{'(-B -b --buildpkg --changelog -l)--buildpkgonly','(--changelog -l --buildpkgonly --buildpkg -b)-B'}'[Tells emerge to only build binary packages]' \

{'(-D --changelog -l)--deep','(-l --changelog --deep)-D'}'[Consider the entire dependency tree of packages]'

{'(-e -l --changelog)--emptytree','(--emptytree -l --changelog)-e'}'[Only consider glibc as installed packages]'

{'(-f -l --changelog)--fetchonly','(-l --changelog --fetchonly)-f'}'[Just perform fetches for all packages]'

'(-l --changelog)--noconfmem[Causes portage to disregard merge records]'

{'(--changelog -l -O)--nodeps','(--nodeps --changelog -l)-O'}'[Merges specified  packages  without  merging  dependencies]'

{'(-l --changelog -n)--noreplace','(-l --changelog --noreplace)-n'}'[Skip packages already installed]'

'(-l --changelog)--nospiner[Disables the spinner for the session]'

'(-l --changelog)--oneshot[Do not add package to the world profile]'

{'(--onlydeps --changelog -l)-o','(--changelog -o -l)--onlydeps'}'[Only  merge  (or pretend to merge) the dependencies]'

{'(--quiet --changelog -l)-q','(-q --changelog -l)--quiet'}'[General outcome is a reduced  or  condensed output]'

{'(--update --changelog -l)-u','(-u --changelog -l)--update'}'[Updates packages to the most  recent  version  available]'

{'(--upgradeonly --changelog -l)-U','(-U --changelog -l)--upgradeonly'}'[Do not update packages to a lower version]'

{'(--verbose)-v','(-v)--verbose'}'[Tell  emerge to run in verbose mode]'

)

_options() {

    _arguments -s \

    "$unmerge_args[@]" "$common_args[@]" "$install_args[@]"

}

_actions() {

    _values "emerge actions" \

    'sync[Initiates a portage tree update]' \

    'rsync[Initiates a portage tree update]' \

    'unmerge[Removes all matching packages]' \

    'search[Searches for matches]' \

    'regen[Causes  portage  to check and update the dependency cache]' \

    'prune[Removes  all but the latest versions of matching packages]' \

    'inject[Portage thinks that this package is installed]' \

    'info[This is a list of information to include in  bug  reports]' \

    'help[Displays help]' \

    'depclean[Clean all packages that have no reason for being installed]'\

    'clean[Cleans the system by removing packages]' \

    '-c[Cleans the system by removing packages]' \

    '-h[Displays help]' \

    '-i[Portage thinks that this package is installed]' \

    '-P[Removes  all but the latest versions of matching packages]' \

    '-s[Searches for matches]' \

    '-S[Matches the search string against the description field]' \

    '--searchdesc[Matches the search string against the description field]' \

    '-C[Removes all matching packages]' \

    'world[Represente all packages in the world profiles]' \

    'system[Represent all the system packages]' 

}

portages=(/usr/portage/*/*)

portagedir=/usr/portage/

rem=''

portages_list=${${(M)${${${portages//$portagedir/$rem}%/}:#*.eclass}:#*-*}:#*.*}

search_portage=${${(M)${${${${portages//$portagedir/$rem}:#distfi*}%/}:#*.eclass}:#*-*}:t}

portages_list="$portages_list $search_portage"

_emerge "$@"

```

Enfin j'aimerai savoir si vous voulez une completion de type "nom" pour un unmerge ou cat/nom vous suffit (moi je préfère cat/nom mais je peux faire les deux comme pour le completion normale) ?

----------

## gim

Oyo, ça commence à être vachement sympa comme outil !!

Euh pour le unmerge, ça ne me dérange pas de n'avoir la complétion que sur cat/nom, c'est pas tous les jours qu'on unmerge, et ça impose une plus grande sécurité .... c'est pas cool de virer un paquet a cause d'un <tab><return> involontaire  :Smile: 

Perso, pour l'instant je vois plus d'améliorations à apporter ... (désolé  :Laughing: ) ...Last edited by gim on Tue Sep 14, 2004 9:49 am; edited 1 time in total

----------

## Bapt

 *gim wrote:*   

> 
> 
> Perso, pour l'instant je vois plus d'améliorations à apporter ... (désolé ) ...

 

Tant mieux.

Je vais attendre quelques jours pour laisser le temps aux gens de l'essayer puis je le proposerais aux dev gentoo et aux dev zsh (ils intègre facilement ce genre de chose, je l'ai déjà fait pour pkgtool, ogg vorbis, et rar)

----------

## gim

Ça y est, j'ai trouvé un nouveau truc qui serait bien : si il était possible de compléter pas que le premier nom de paquet sur la ligne de commande se serait bien.

Exemple:

```
emerge -u «paquet1» «debutdepaquet2»<tab>
```

ne complète pas sur le deuxième paquet...

se serait bien si ça le faisait....

 :Mr. Green: Last edited by gim on Tue Sep 14, 2004 9:50 am; edited 1 time in total

----------

## Bapt

Voila c'est en parti fait, ca fonctionne pour -s et unmerge, mais je n'arrive tjs pas le faire pour le reste, je continue à regarder.

j'ai aussi supprimer le contenu du dossier licenses dans la completion des portages disponibles.

```

#compdef emerge

_emerge () {

    local state

    if (( CURRENT == 2 ));then

        _arguments -s \

            ':*:->actions' \

            "$common_args[@]" "$install_args[@]" && return 0

    elif (( CURRENT > 2 ));then

            case "$words[2]" in

            unmerge)

                _arguments -s \

                '*:installed pkg:_unmerge' "$common_args[@]" && return 0

            ;;

            clean);;

            depclean);;

            -c);;

            -C);;

            help);;

            -h);;

            info);;

            inject)

                _arguments -s \ 

                '*:portage:_files -W /usr/portage/ -/'

            ;;

            -j)

                _arguments -s \ 

                '*:portage:_files -W /usr/portage -/'

            ;;

            prune)

                _arguments -s \

                '*:portage:_files -W /usr/portage -/'

            ;;

            -P)

                _arguments -s  \

                '*:portage:_files -W /usr/portage -/'

            ;;

            search);;

            -s)

          _arguments -s \

      '*:portage:_search_list'

       ;;

            --seachdesc);;

            -S);;

            regen);;

            sync);;

            rsync);;

            *)

                _arguments -s \

                ':Special action:->special' \

                "$common_args[@]" \

      "$install_args[@]" && return 0

             ;;

             esac

    fi

    while [[ -n "$state" ]]; do

        lstate=$state

        state=''

        case "$lstate" in

        actions)

            _alternative \

            ':emerge actions:_actions' \

            '*:portage:_listeportage'

        ;;

        special)

            _alternative \

            ':particular:_special' \

            '*:portage:_listeportage' 

        esac

    done

}

_unmerge(){

   installed_portage=(/var/db/pkg/*/*)

   installed_dir=/var/db/pkg/

   installed_pkg=${(M)${${installed_portage//$installed_dir/$rem}%/}:#*-*}

   _tags -s installed_pkg && { compadd "$@" -k installed_pkg || compadd "$@" ${(kv)=installed_pkg} }

}

_search_list(){

   _tags -s search_portage && { compadd "$@" -k search_portage || compadd "$@" ${(kv)=search_portage} }

}

_listeportage(){

   _tags -s portages_list && { compadd "$@" -k portages_list || compadd "$@" ${(kv)=portages_list} }

}

_special(){

    _values "particular" \

    'world[Represente all packages in the world profiles]' \

    'system[Represent all the system packages]'

}

common_args=(

{'(-p)--pretend','(--pretend)-p'}'[simply  display  what would be done]'

{'(-d)--debug','(--debug)-d'}'[Tells emerge to run the emerge command in debug mode]'

)

   install_args=(

{'(--upgradeonly -U --update -u --quiet -q --onlydeps -o --oneshot --nospinner --noreplace -n --nodeps -O --noconfmem -D --deep --changelog --buildpkg -B -b --buildpkgonly --emptytree -e -f --fetchonly)-l','(--upgradeonly -U --update -u --quiet -q --onlydeps -o --nospinner --noreplace -n --nodeps -O --noconfmem -D --deep --emptytree -e -f --fetchonly -l --buildpkg -b -B --buildpkgonly )--changelog'}'[This will show the ChangeLog]'

{'(-b --buildpkgonly -B --changelog -l)--buildpkg','(--changelog -l --buildpkg --buildpkgonly -B)-b'}'[Tells emerge to build binary packages]' \

{'(-B -b --buildpkg --changelog -l)--buildpkgonly','(--changelog -l --buildpkgonly --buildpkg -b)-B'}'[Tells emerge to only build binary packages]' \

{'(-D --changelog -l)--deep','(-l --changelog --deep)-D'}'[Consider the entire dependency tree of packages]'

{'(-e -l --changelog)--emptytree','(--emptytree -l --changelog)-e'}'[Only consider glibc as installed packages]'

{'(-f -l --changelog)--fetchonly','(-l --changelog --fetchonly)-f'}'[Just perform fetches for all packages]'

'(-l --changelog)--noconfmem[Causes portage to disregard merge records]'

{'(--changelog -l -O)--nodeps','(--nodeps --changelog -l)-O'}'[Merges specified  packages  without  merging  dependencies]'

{'(-l --changelog -n)--noreplace','(-l --changelog --noreplace)-n'}'[Skip packages already installed]'

'(-l --changelog)--nospiner[Disables the spinner for the session]'

'(-l --changelog)--oneshot[Do not add package to the world profile]'

{'(--onlydeps --changelog -l)-o','(--changelog -o -l)--onlydeps'}'[Only  merge  (or pretend to merge) the dependencies]'

{'(--quiet --changelog -l)-q','(-q --changelog -l)--quiet'}'[General outcome is a reduced  or  condensed output]'

{'(--update --changelog -l)-u','(-u --changelog -l)--update'}'[Updates packages to the most  recent  version  available]'

{'(--upgradeonly --changelog -l)-U','(-U --changelog -l)--upgradeonly'}'[Do not update packages to a lower version]'

{'(--verbose)-v','(-v)--verbose'}'[Tell  emerge to run in verbose mode]'

)

_options() {

    _arguments -s \

    "$unmerge_args[@]" "$common_args[@]" "$install_args[@]"

}

_actions() {

    _values "emerge actions" \

    'sync[Initiates a portage tree update]' \

    'rsync[Initiates a portage tree update]' \

    'unmerge[Removes all matching packages]' \

    'search[Searches for matches]' \

    'regen[Causes  portage  to check and update the dependency cache]' \

    'prune[Removes  all but the latest versions of matching packages]' \

    'inject[Portage thinks that this package is installed]' \

    'info[This is a list of information to include in  bug  reports]' \

    'help[Displays help]' \

    'depclean[Clean all packages that have no reason for being installed]'\

    'clean[Cleans the system by removing packages]' \

    '-c[Cleans the system by removing packages]' \

    '-h[Displays help]' \

    '-i[Portage thinks that this package is installed]' \

    '-P[Removes  all but the latest versions of matching packages]' \

    '-s[Searches for matches]' \

    '-S[Matches the search string against the description field]' \

    '--searchdesc[Matches the search string against the description field]' \

    '-C[Removes all matching packages]' \

    'world[Represente all packages in the world profiles]' \

    'system[Represent all the system packages]' 

}

portages=(/usr/portage/*/*)

portagedir=/usr/portage/

rem=''

portages_list=${${(M)${${${portages//$portagedir/$rem}%/}:#*.eclass}:#*-*}:#*.*}

search_portage=${${(M)${${${${${portages//$portagedir/$rem}:#distfi*}:#licens*}%/}:#*.eclass}:#*-*}:t}

portages_list="$portages_list $search_portage"

_emerge "$@"

```

----------

## S_Oz

C'est super comme truc!

C'est un peu lent sur mon vieux taco mais c'est super!

Félicitations et merci beaucoup pour le boulot!!!!  :Wink: 

----------

## Bapt

 *S_Oz wrote:*   

> C'est super comme truc!
> 
> C'est un peu lent sur mon vieux taco mais c'est super!
> 
> Félicitations et merci beaucoup pour le boulot!!!! 

 

De rien mais je n'arrive toujours pas à faire la completion "qui se suit sur un emerge classique" et ca m'énerve.

----------

## Bapt

Voila j'ai le plaisir de vous annoncer que j'ai réussit à faire en sorte de répondre à la demande gim et même un peu plus  :Smile: 

maintenant, il y a aussi la completion sur les fichier .ebuild si il y en a dans le répertoire courrant.

aussi quelques améliorations sur le code et même 3 commentaires  :Smile: 

```

#compdef emerge

_emerge () {

    local state

    if (( CURRENT == 2 ));then

        _arguments -s \

            '*:*:->actions' \

            "$common_args[@]" "$install_args[@]" && return 0

    elif (( CURRENT > 2 ));then

            case "$words[2]" in

            unmerge)

                _arguments -s \

                '*:installed pkg:_unmerge' "$common_args[@]" && return 0

            ;;

            clean|depclean|-c|-C|help|-h|info|regen|sync|rsync|--searchdesc|-S|inject|-j|prune|-P);;

            search|-s)

              _arguments -s \

              '*:portage:_search_list' && return 0

               ;;

            *)

                _arguments -s \

                '*:*:->install_portage' \

                "$common_args[@]" \

              "$install_args[@]" && return 0

             ;;

             esac

    fi

    while [[ -n "$state" ]]; do

        lstate=$state

        state=''

        case "$lstate" in

        actions)

            _alternative \

            ':emerge actions:_actions' \

            '*:portage:_listportage' \

            '*:Ebuild files:_files -g \*.ebuild' 

        ;;

        install_portage)

            _alternative \

            '*:portage:_listportage' \

            '*:Ebuild files:_files -g \*.ebuild' 

        ;;

        esac

    done

}

#function to only show installed packages "cat/name"

_unmerge(){

   installed_portage=(/var/db/pkg/*/*)

   installed_dir=/var/db/pkg/

   installed_pkg=${(M)${${installed_portage//$installed_dir/$rem}%/}:#*-*}

   _tags -s installed_pkg && { compadd "$@" -k installed_pkg || compadd "$@" ${(kv)=installed_pkg} }

}

#Function to show only the name of all available portages

_search_list(){

   _tags -s search_portage && { compadd "$@" -k search_portage || compadd "$@" ${(kv)=search_portage} }

}

#Function to show all available portage like : "cat/name" and "name"

_listportage(){

    portages_list="$portages_list world system"

   _tags -s portages_list && { compadd "$@" -k portages_list || compadd "$@" ${(kv)=portages_list} }

}

common_args=(

{'(-p)--pretend','(--pretend)-p'}'[simply  display  what would be done]'

{'(-d)--debug','(--debug)-d'}'[Tells emerge to run the emerge command in debug mode]'

)

   install_args=(

{'(--upgradeonly -U --update -u --quiet -q --onlydeps -o --oneshot --nospinner --noreplace -n --nodeps -O --noconfmem -D --deep --changelog --buildpkg -B -b --buildpkgonly --emptytree -e -f --fetchonly)-l','(--upgradeonly -U --update -u --quiet -q --onlydeps -o --nospinner --noreplace -n --nodeps -O --noconfmem -D --deep --emptytree -e -f --fetchonly -l --buildpkg -b -B --buildpkgonly )--changelog'}'[This will show the ChangeLog]'

{'(-b --buildpkgonly -B --changelog -l)--buildpkg','(--changelog -l --buildpkg --buildpkgonly -B)-b'}'[Tells emerge to build binary packages]' \

{'(-B -b --buildpkg --changelog -l)--buildpkgonly','(--changelog -l --buildpkgonly --buildpkg -b)-B'}'[Tells emerge to only build binary packages]' \

{'(-D --changelog -l)--deep','(-l --changelog --deep)-D'}'[Consider the entire dependency tree of packages]'

{'(-e -l --changelog)--emptytree','(--emptytree -l --changelog)-e'}'[Only consider glibc as installed packages]'

{'(-f -l --changelog)--fetchonly','(-l --changelog --fetchonly)-f'}'[Just perform fetches for all packages]'

'(-l --changelog)--noconfmem[Causes portage to disregard merge records]'

{'(--changelog -l -O)--nodeps','(--nodeps --changelog -l)-O'}'[Merges specified  packages  without  merging  dependencies]'

{'(-l --changelog -n)--noreplace','(-l --changelog --noreplace)-n'}'[Skip packages already installed]'

'(-l --changelog)--nospiner[Disables the spinner for the session]'

'(-l --changelog)--oneshot[Do not add package to the world profile]'

{'(--onlydeps --changelog -l)-o','(--changelog -o -l)--onlydeps'}'[Only  merge  (or pretend to merge) the dependencies]'

{'(--quiet --changelog -l)-q','(-q --changelog -l)--quiet'}'[General outcome is a reduced  or  condensed output]'

{'(--update --changelog -l)-u','(-u --changelog -l)--update'}'[Updates packages to the most  recent  version  available]'

{'(--upgradeonly --changelog -l)-U','(-U --changelog -l)--upgradeonly'}'[Do not update packages to a lower version]'

{'(--verbose)-v','(-v)--verbose'}'[Tell  emerge to run in verbose mode]'

)

_options() {

    _arguments -s \

    "$unmerge_args[@]" "$common_args[@]" "$install_args[@]"

}

_actions() {

    _values "emerge actions" \

    'sync[Initiates a portage tree update]' \

    'rsync[Initiates a portage tree update]' \

    'unmerge[Removes all matching packages]' \

    'search[Searches for matches]' \

    'regen[Causes  portage  to check and update the dependency cache]' \

    'prune[Removes  all but the latest versions of matching packages]' \

    'inject[Portage thinks that this package is installed]' \

    'info[This is a list of information to include in  bug  reports]' \

    'help[Displays help]' \

    'depclean[Clean all packages that have no reason for being installed]'\

    'clean[Cleans the system by removing packages]' \

    '-c[Cleans the system by removing packages]' \

    '-h[Displays help]' \

    '-i[Portage thinks that this package is installed]' \

    '-P[Removes  all but the latest versions of matching packages]' \

    '-s[Searches for matches]' \

    '-S[Matches the search string against the description field]' \

    '--searchdesc[Matches the search string against the description field]' \

    '-C[Removes all matching packages]' \

    'world[Represente all packages in the world profiles]' \

    'system[Represent all the system packages]' 

}

portages=(/usr/portage/*/*)

portagedir=/usr/portage/

rem=''

portages_list=${${(M)${${${portages//$portagedir/$rem}%/}:#*.eclass}:#*-*}:#*.*}

search_portage=${${(M)${${${${${portages//$portagedir/$rem}:#distfi*}:#licens*}%/}:#*.eclass}:#*-*}:t}

portages_list="$portages_list $search_portage"

_emerge "$@"

```

Là je pense que je tiens le bon bout  :Smile:  dites moi si il faut encore rajouter des trucs ou pas, sinon la semaine prochaine je l'enverrai aux dev zsh et aux dev gentoo  :Smile: 

----------

## Barratis

Sympa, le script vraiment tres utile ^_^.

Merci beaucoup pour cette contribution, puis ca poussera peut etre des personne a se tourner vers zsh (je l'ai decouvert recement et je m'en passe plus  :Smile: )

----------

## BoBBY-nOOb

J'ai emerger zsh 4.2 et j'ai pas l'impression que cette fonction d'autocompletion pour portage est intégré   :Question: 

----------

## HubyRod

```
compdef -a _portage emerge
```

me renvoie 

```
zsh: command not found: compdef
```

Qu'ai-je mal compris et/ou mal fait ??

----------

## babykart

Pas mal du tout cette fonction supplémentaire...

Un grand merci pour ton taf...   :Very Happy: 

----------

## Bapt

 *babykart wrote:*   

> Pas mal du tout cette fonction supplémentaire...
> 
> Un grand merci pour ton taf...  

 

De rien, mais depuis ce post, elle a été améliorée, intégrée à portage, et d'autres sont venues le rejoindre : rc-update, opengl-update, ebuild, ...

Maintenant elles sont toutes dans un ebuild à part : zsh-completion.

----------

## babykart

merci pour l'info: c'est emergé...   :Wink: 

----------

## omné

 *baptux wrote:*   

>  *babykart wrote:*   Pas mal du tout cette fonction supplémentaire...
> 
> Un grand merci pour ton taf...   
> 
> De rien, mais depuis ce post, elle a été améliorée, intégrée à portage, et d'autres sont venues le rejoindre : rc-update, opengl-update, ebuild, ...
> ...

 

Ça c'est royal, j'adore ma gentoo. Merci beaucoup. Le gros problème c'est de connaitre tout ces petit truc géniaux qui existent, script, ebuild...

Comment faire  ?

----------

## Bapt

 *omné wrote:*   

> 
> 
> Ça c'est royal, j'adore ma gentoo. Merci beaucoup. Le gros problème c'est de connaitre tout ces petit truc géniaux qui existent, script, ebuild...
> 
> Comment faire  ?

 

Lire le forum sinon en ce qui concerne le zsh lire le changelog de zsh-completion ou de zsh (le dernier annonce la création de zsh-completion).

ou alors tu as les einfo.

----------

