¿Puedo habilitar bash-complete para el nuevo comando apt?

20

El nuevo aptcomando, presente en Ubuntu desde 14.04, parece ser una intersección realmente útil de la funcionalidad entre apt-gety, apt-cachepero la versión actual de bash-completionno lo sabe ... Lo que hace que sea mucho más difícil de usar.

¿Hay alguna forma rápida de agregar esta funcionalidad a Bash para que el aptcomando sea fácil de usar?

Oli
fuente
1
El etiquetado de esta pregunta se comienza a discutir en meta .
Gilles 'SO- deja de ser malvado'

Respuestas:

26

Esta es una omisión en el bash-completepaquete, no apt. Parece que todavía no existe una finalización, por lo que he reunido lo que puedo para el aptcomando (¡no es el comando mejor documentado que haya existido!)

La siguiente es una adaptación de la apt-getfinalización existente (con elementos eliminados y bits añadidos desde apt-cachela finalización). Ejecute sudoedit /usr/share/bash-completion/completions/apty pegue lo siguiente:

# Debian apt(8) completion                             -*- shell-script -*-

_apt()
{
    local cur prev words cword
    _init_completion || return

    local special i
    for (( i=0; i < ${#words[@]}-1; i++ )); do
        if [[ ${words[i]} == @(list|search|show|update|install|remove|upgrade|full-upgrade|edit-sources|dist-upgrade|purge) ]]; then
            special=${words[i]}
        fi
    done

    if [[ -n $special ]]; then
        case $special in
            remove|purge)
                if [[ -f /etc/debian_version ]]; then
                    # Debian system
                    COMPREPLY=( $( \
                        _xfunc dpkg _comp_dpkg_installed_packages $cur ) )
                else
                    # assume RPM based
                    _xfunc rpm _rpm_installed_packages
                fi
                return 0
                ;;
            *)
                COMPREPLY=( $( apt-cache --no-generate pkgnames "$cur" \
                    2> /dev/null ) )
                return 0
                ;;
        esac
    fi

    case $prev in
        -c|--config-file)
             _filedir
             return 0
             ;;
        -t|--target-release|--default-release)
             COMPREPLY=( $( apt-cache policy | \
                 command grep "release.o=Debian,a=$cur" | \
                 sed -e "s/.*a=\(\w*\).*/\1/" | uniq 2> /dev/null) )
             return 0
             ;;
    esac

    if [[ "$cur" == -* ]]; then
        COMPREPLY=( $( compgen -W '-d -f -h -v -m -q -s -y -u -t -b -c -o
            --download-only --fix-broken --help --version --ignore-missing
            --fix-missing --no-download --quiet --simulate --just-print
            --dry-run --recon --no-act --yes --assume-yes --show-upgraded
            --only-source --compile --build --ignore-hold --target-release
            --no-upgrade --force-yes --print-uris --purge --reinstall
            --list-cleanup --default-release --trivial-only --no-remove
            --diff-only --no-install-recommends --tar-only --config-file
            --option --auto-remove' -- "$cur" ) )
    else
        COMPREPLY=( $( compgen -W 'list search show update install 
            remove upgrade full-upgrade edit-sources dist-upgrade 
            purge' -- "$cur" ) )
    fi

    return 0
} &&
complete -F _apt apt

# ex: ts=4 sw=4 et filetype=sh

Luego ejecute source ~/.bashrcpara cargar la finalización. Entonces apt show firef+ Tabdebería completarse.

Esto puede ofrecerle opciones que simplemente ya no existen. Creo que he clavado los comandos principales (que podría cambiar en el tiempo) pero por lo menos te ayudaré con los comandos comunes: list search show update install remove upgrade full-upgrade edit-sources dist-upgrade purge.

Obviamente, si un mantenedor de finalización de bash quiere atrapar lo anterior, eres bienvenido bajo GPL (¡aunque estaría tentado de comenzar desde cero una vez que aptesté documentado!)

Oli
fuente
8
¡Abre un error y envíalo como un parche!
Jorge Castro
¿Tienes alguna idea sobre cómo usar esta respuesta zsh?
Exeleration-G
alguna palabra sobre dónde "yo también" esto en launchpad?
Mateo
1

¿Por qué no usar el bash-complete original ?

Prueba este script. Descargará e instalará la finalización de bash en ~/tmp/bash-completion.

#!/bin/bash
echo -en "\e]2;Updating bash completion...\a"

katalog="~/tmp/bash-completion"

if [ ! -d "$katalog" ]; then
   mkdir -p $katalog
   cd $katalog
   cd ..
   git clone git://git.debian.org/git/bash-completion/bash-completion.git
   cd $katalog
   autoreconf -i
   ./configure
   make
   sudo make install
else
   cd $katalog
   if [ `git log --pretty=%H ...refs/heads/master^` != `git ls-remote origin -h refs/heads/master |cut -f1` ]; then
      git pull
      autoreconf -i
      ./configure
      make
      sudo make install
   else
      echo "Bash-completion is already up to date!"
   fi
fi

Comienza a usarlo con el comando . ~/tmp/bash-completion/bash_completion.sh, que se puede poner en un ~/.bashrcarchivo o, mejor aún, vincularlo a algún archivo en el /etc/profile.d/directorio. Desinstale la finalización de bash original, para que no termine cargando ambos al mismo tiempo.

Adam Ryczkowski
fuente
No había pensado en esto, pero tampoco parecen tener una finalización adecuada todavía
Oli
1
@Oli Bueno, supongo que sí. Hay archivos aptitude, apt-gety apt-cache. ¿Qué es exactamente lo que quieres decir con terminación adecuada ?
Adam Ryczkowski
3
Según mi pregunta inicial, apthay un nuevo comando (ish) que está en Trusty. Tiene algunos de apt-get, algunos de apt-cache ... Todo con un poco de florecimiento extra en un solo lugar.
Oli
@Oli ¡Oh, tienes razón! No lo sabía. Y - bash-complete no lo admite hasta ahora. Afortunadamente, no sería tan difícil escribir un complemento, por lo que puede esperar uno pronto. Lo más probable es que, usando mi script, usted sea uno de los primeros que pueda usarlo.
Adam Ryczkowski