Kann ich die Bash-Vervollständigung für den neuen Befehl apt aktivieren?

20

Der neue aptBefehl, in Ubuntu seit 14.04, scheint eine wirklich nützliche Schnittstelle zwischen Funktionalität zu sein zwischen apt-getund apt-cacheaber die aktuellen Version bash-completionist es nicht wissen ... Was es macht viel schwieriger in der Bedienung.

Gibt es eine schnelle Möglichkeit, diese Funktionalität zu Bash hinzuzufügen, um die aptVerwendung des Befehls zu vereinfachen?

Oli
quelle
1
Das Markieren dieser Frage wird zunächst auf Meta diskutiert .
Gilles 'SO- hör auf böse zu sein'

Antworten:

26

Dies ist eine Auslassung im bash-completePaket, nicht apt. Es scheint nur, dass eine Vervollständigung noch nicht existiert, also habe ich zusammengeschrottet, was ich kann für den aptBefehl (es ist nicht der am besten dokumentierte Befehl, der jemals existiert hat!)

Das Folgende ist eine Anpassung aus der vorhandenen apt-getVervollständigung (mit ausgeblendeten Elementen und hinzugefügten Bits aus apt-cacheder Vervollständigung). Führen Sie sudoedit /usr/share/bash-completion/completions/aptFolgendes aus und fügen Sie es ein:

# 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

Führen Sie dann aus source ~/.bashrc, um die Vervollständigung zu laden. Dann sollte apt show firef+ Tababgeschlossen sein.

Dies kann Ihnen Optionen bieten, die es einfach nicht mehr gibt. Ich glaube , ich habe die wichtigsten Befehle genagelt (die in der Zeit ändern könnte) , aber zumindest wird es Ihnen mit den gemeinsamen Befehlen helfen: list search show update install remove upgrade full-upgrade edit-sources dist-upgrade purge.

Offensichtlich wenn eine bash-completion Maintainer will die oben, Sie ist willkommen , um es unter dem GPL nab (obwohl ich versuche sein würde zu starten aus frischen einmal aptdokumentiert!)

Oli
quelle
8
Öffne einen Bug und sende diesen als Patch!
Jorge Castro
Haben Sie eine Idee, wie Sie diese Antwort verwenden sollen zsh?
Exeleration-G
Gibt es ein Wort darüber, wo man "mich auch" auf dem Launchpad findet?
Mateo
1

Warum nicht die ursprüngliche Bash-Vervollständigung verwenden ?

Versuchen Sie dieses Skript. Es lädt die Bash-Vervollständigung herunter und installiert sie auf ~/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

Sie starten die Verwendung mit dem Befehl . ~/tmp/bash-completion/bash_completion.sh, der in eine ~/.bashrcDatei eingefügt werden kann , oder - noch besser - mit einem Symlink in eine Datei im /etc/profile.d/Verzeichnis. Deinstallieren Sie die ursprüngliche Bash-Vervollständigung, damit Sie nicht beide gleichzeitig laden müssen.

Adam Ryczkowski
quelle
Ich hatte nicht daran gedacht, aber sie scheinen auch noch keine passende Vollendung zu haben
Oli
1
@Oli Nun, ich denke sie tun es. Es gibt Dateien aptitude, apt-getund apt-cache. Was genau meinst du mit passender Fertigstellung ?
Adam Ryczkowski
3
Laut meiner Eröffnungsfrage apthandelt es sich um einen brandneuen (ish) Befehl, der in Trusty enthalten ist. Es hat einiges an Apt-Get, einiges an Apt-Cache ... Alles mit ein bisschen mehr Blüte an einem Ort.
Oli
@Oli Oh, du hast recht! Ich wusste es nicht. Und - die Bash-Vervollständigung unterstützt es noch nicht sofort. Glücklicherweise wäre es nicht so schwierig, ein Plugin zu schreiben, also können Sie bald damit rechnen. Es besteht die Möglichkeit, dass Sie mit meinem Skript zu den Ersten gehören, die es verwenden können.
Adam Ryczkowski