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

20

El nuevo comando apt , presente en Ubuntu desde el 14.04, parece ser una intersección de funcionalidad muy útil entre apt-get y apt-cache pero la versión actual de bash-completion no lo sabe ... lo que hace que sea lot más difícil de usar.

¿Hay alguna manera rápida de agregar esta funcionalidad a Bash para hacer que el comando apt sea fácil de usar?

    
pregunta Oli 09.04.2014 - 20:15

2 respuestas

26

Esto es una omisión en el paquete bash-complete , no apt . Simplemente parece que todavía no existe una finalización, así que eliminé todo lo que pude para el comando apt (¡no es el mejor comando documentado que haya existido!)

La siguiente es una adaptación de la finalización de apt-get existente (con los elementos eliminados y los bits agregados de la finalización de apt-cache ). Ejecute sudoedit /usr/share/bash-completion/completions/apt y 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*\).*//" | 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 ~/.bashrc para cargar la finalización. Luego, debe completarse apt show firef + Tab .

Esto puede ofrecerte opciones que ya no existen. Creo que he encontrado los comandos principales (que pueden cambiar a tiempo) pero al menos te ayudarán 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, puede hacerlo bajo GPL (¡aunque estaría tentado de comenzar desde cero una vez que apt esté documentado!)

    
respondido por el Oli 09.04.2014 - 20:15
1

¿Por qué no utilizar el original bash-completion ?

Pruebe este script. Se descargará e instalará el bash-completion 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

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

    
respondido por el Adam Ryczkowski 11.04.2014 - 11:02

Lea otras preguntas en las etiquetas