Posso ativar o bash-completion para o novo comando apt?

20

O novo comando apt , presente no Ubuntu desde 14.04, parece seja uma interseção realmente útil de funcionalidade entre apt-get e apt-cache , mas a versão atual de bash-completion não sabe sobre isso ... O que torna um lote mais difícil de usar.

Existe uma maneira rápida de adicionar essa funcionalidade ao Bash para tornar o comando apt fácil de usar?

    
por Oli 09.04.2014 / 22:15
fonte

2 respostas

26

Esta é uma omissão no pacote bash-complete , não em apt . Parece que ainda não existe uma conclusão, então eu juntei o que posso para o comando apt (não é o comando mais bem documentado que já existiu!)

A seguir, uma adaptação da conclusão apt-get existente (com elementos retirados e bits adicionados da conclusão de apt-cache ). Execute sudoedit /usr/share/bash-completion/completions/apt e cole o seguinte:

# 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

Em seguida, execute source ~/.bashrc para carregar a conclusão. Então apt show firef + Tab deve ser concluído.

Isso pode oferecer opções que simplesmente não existem mais. Eu acho que eu tenho pregado os comandos principais (que podem mudar no tempo), mas no mínimo ele vai te ajudar com os comandos comuns: list search show update install remove upgrade full-upgrade edit-sources dist-upgrade purge .

Obviamente, se um mantenedor da conclusão do bash quiser pegar o acima, você é bem-vindo a ele sob a GPL (embora eu ficasse tentada a começar do zero uma vez que apt esteja documentado!)

    
por Oli 09.04.2014 / 22:15
fonte
1

Por que não usar a original bash-completion ?

Experimente este script. Ele fará o download e instalará a conclusão do bash em ~/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

Você começa a usá-lo com o comando . ~/tmp/bash-completion/bash_completion.sh , que pode ser colocado em ~/.bashrc file, ou - melhor ainda - symlink em algum arquivo no diretório /etc/profile.d/ . Desinstale a conclusão do bash original, para que você não acabe carregando os dois ao mesmo tempo.

    
por Adam Ryczkowski 11.04.2014 / 13:02
fonte