Posso habilitar a conclusão do bash para o novo comando apt?

20

O novo aptcomando, presente no Ubuntu desde 14.04, parece ser uma interseção muito útil de funcionalidades entre apt-gete, apt-cachemas a versão atual bash-completionnão o conhece ... O que torna muito mais difícil o uso.

Existe uma maneira rápida de adicionar essa funcionalidade ao Bash para facilitar o aptuso do comando?

Oli
fonte
11
A marcação dessa pergunta é discutida em meta .
Gilles 'SO- stop be evil'

Respostas:

26

Esta é uma omissão no bash-completepacote, não apt. Parece que uma conclusão ainda não existe, então reuni o que posso para o aptcomando (não é o melhor comando documentado que já existiu!)

A seguir, é apresentada uma adaptação da apt-getconclusão existente (com os elementos removidos e os bits adicionados à apt-cacheconclusão). Execute sudoedit /usr/share/bash-completion/completions/apte 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*\).*/\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

Em seguida, execute source ~/.bashrcpara carregar a conclusão. Então apt show firef+ Tabdeve ser concluído.

Isso pode oferecer opções que simplesmente não existem mais. Eu acho que eu tenha pregado os principais comandos (que pode mudar com o tempo), mas pelo menos ele vai ajudá-lo com os comandos mais comuns: list search show update install remove upgrade full-upgrade edit-sources dist-upgrade purge.

Obviamente, se um mantenedor de conclusão do bash quiser entender o que foi dito acima, você é bem-vindo na GPL (embora eu fique tentado a começar do zero uma vez aptdocumentado!)

Oli
fonte
8
Abra um bug e envie-o como um patch!
Jorge Castro
Você tem alguma idéia de como usar esta resposta zsh?
Exeleration-G
alguma palavra sobre onde "eu também" isso na barra de lançamento?
Mateo
1

Por que não usar a conclusão do bash original ?

Experimente este script. Ele fará o download e instalará a conclusão do bash ~/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 no ~/.bashrcarquivo ou, melhor ainda, vinculá-lo a algum arquivo do /etc/profile.d/diretório. Desinstale a conclusão do bash original para não acabar carregando os dois ao mesmo tempo.

Adam Ryczkowski
fonte
11
@ Oli Bem, acho que sim. Há arquivos aptitude, apt-gete apt-cache. O que exatamente você quer dizer com conclusão adequada ?
Adam Ryczkowski
3
Pela minha pergunta de abertura, apté um novo comando (ish) que está no Trusty. Ele possui alguns dos apt-get, alguns do apt-cache ... Tudo com um pouco de floreio extra em um só lugar.
Oli
@ Oli Oh, você está certo! Eu não sabia disso. E - o bash-conclusão não o suporta imediatamente. Felizmente, não seria tão difícil escrever um plugin, então você pode esperar um em breve. As chances são de que, usando meu script, você estaria entre os primeiros, quem pode usá-lo.
Adam Ryczkowski