Puis-je activer bash-complètement pour la nouvelle commande apt?

20

La nouvelle aptcommande, présente dans Ubuntu depuis le 14.04, semble être une intersection vraiment utile de fonctionnalités entre apt-getet apt-cachemais la version actuelle de bash-completionne le sait pas ... Ce qui la rend beaucoup plus difficile à utiliser.

Existe-t-il un moyen rapide d'ajouter cette fonctionnalité à Bash pour rendre la aptcommande facile à utiliser?

Oli
la source
1
Le balisage de cette question est commencé discuté sur meta .
Gilles 'SO- arrête d'être méchant'

Réponses:

26

C'est une omission dans le bash-completepaquet, non apt. Il semble juste qu'une fin n'existe pas encore, j'ai donc mis au rebut ce que je peux pour la aptcommande (ce n'est pas la commande la mieux documentée qui ait jamais existé!)

Ce qui suit est une adaptation de la apt-getcomplétion existante (avec des éléments supprimés et des bits ajoutés de apt-cachela complétion de). Exécutez sudoedit /usr/share/bash-completion/completions/aptet collez ce qui suit:

# 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

Exécutez ensuite source ~/.bashrcpour charger l'achèvement. Ensuite, apt show firef+ Tabdevrait se terminer.

Cela peut vous offrir des options qui n'existent tout simplement plus. Je pense que je l' ai cloué les commandes principales ( ce qui pourrait changer dans le temps) , mais à tout le moins il vous aider avec les commandes communes: list search show update install remove upgrade full-upgrade edit-sources dist-upgrade purge.

De toute évidence, si un responsable de l'achèvement de bash veut saisir ce qui précède, vous êtes le bienvenu sous GPL (bien que je serais tenté de recommencer à zéro une fois aptdocumenté!)

Oli
la source
8
Ouvrez un bug et soumettez-le en tant que patch!
Jorge Castro
Avez-vous une idée de comment utiliser cette réponse zsh?
Exeleration-G
un mot sur où "moi aussi" cela sur le tableau de bord?
Mateo
1

Pourquoi ne pas utiliser l' achèvement bash d' origine ?

Essayez ce script. Il téléchargera et installera le bash-complétement sur ~/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

Vous commencez à l'utiliser avec la commande . ~/tmp/bash-completion/bash_completion.sh, qui peut être placée dans un ~/.bashrcfichier, ou - mieux encore - le lier symboliquement dans un fichier du /etc/profile.d/répertoire. Désinstallez l'achèvement bash d'origine, afin de ne pas finir par charger les deux en même temps.

Adam Ryczkowski
la source
Je n'y avais pas pensé, mais ils ne semblent pas encore avoir terminé correctement
Oli
1
@Oli Eh bien, je suppose que oui. Il y a des fichiers aptitude, apt-getet apt-cache. Qu'entendez-vous exactement par achèvement approprié ?
Adam Ryczkowski
3
Par ma question d'ouverture, aptest une toute nouvelle commande (ish) qui est dans Trusty. Il a une partie d'apt-get, une partie d'apt-cache ... Le tout avec un peu de fioriture supplémentaire au même endroit.
Oli
@Oli Oh, tu as raison! Je n'en savais rien. Et - bash-complétement ne le prend pas en charge jusqu'à présent. Heureusement, il ne serait pas si difficile d'écrire un plugin, vous pouvez donc vous y attendre bientôt. Il y a de fortes chances que l'utilisation de mon script soit parmi les premiers à pouvoir l'utiliser.
Adam Ryczkowski