Czy mogę włączyć uzupełnianie bash dla nowej komendy apt?

20

Nowa aptkomenda, obecny w Ubuntu od 14,04, wydaje się być bardzo przydatne przecięcia między funkcjonalnością apt-geta apt-cachejednak obecna wersja bash-completionnie wie o tym ... co sprawia, że dużo trudniejszy w obsłudze.

Czy istnieje szybki sposób na dodanie tej funkcji do Bash, aby ułatwić korzystanie z aptpolecenia?

Oli
źródło
1
Oznaczanie tego pytania rozpoczyna się na meta .
Gilles 'SO - przestań być zły'

Odpowiedzi:

26

To pominięcie w bash-completepakiecie, nie apt. Wygląda na to, że zakończenie jeszcze nie istnieje, więc zebrałem razem, co mogę dla aptpolecenia (nie jest to najlepiej udokumentowane polecenie, jakie kiedykolwiek istniało!)

Poniżej znajduje się adaptacja istniejącego apt-getuzupełnienia (z usuniętymi elementami i dodanymi bitami z apt-cacheuzupełnienia). Uruchom sudoedit /usr/share/bash-completion/completions/apti wklej w następujący sposób:

# 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

Następnie uruchom, source ~/.bashrcaby załadować zakończenie. Następnie apt show firef+ Tabpowinien zakończyć.

Może to zaoferować opcje, których już nie ma. Chyba przybity do najważniejszych poleceń (co może się zmienić w czasie), ale przynajmniej będzie to pomóc z typowych poleceń: list search show update install remove upgrade full-upgrade edit-sources dist-upgrade purge.

Oczywiście, jeśli opiekun bash chce uzyskać powyższe, możesz to zrobić na licencji GPL (choć kusiłbym, aby zacząć od nowa, gdy aptzostanie to udokumentowane!)

Oli
źródło
8
Otwórz błąd i prześlij go jako poprawkę!
Jorge Castro
Czy masz pomysł, jak korzystać z tej odpowiedzi zsh?
Przyspieszenie-G
jakieś słowo, gdzie „ja też” to na starterze?
Mateo
1

Dlaczego nie skorzystać z oryginalnego zakończenia bash ?

Wypróbuj ten skrypt. Spowoduje to pobranie i zainstalowanie zakończenia 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

Zaczynasz używać go z poleceniem . ~/tmp/bash-completion/bash_completion.sh, które można umieścić w ~/.bashrcpliku, lub - jeszcze lepiej - dowiązać symbolicznie do jakiegoś pliku w /etc/profile.d/katalogu. Odinstaluj oryginalne zakończenie bash, abyś nie ładował obu jednocześnie.

Adam Ryczkowski
źródło
1
@Oli Cóż, chyba tak. Są to pliki aptitude, apt-geta apt-cache. Co dokładnie masz na myśli mówiąc o ukończeniu apt ?
Adam Ryczkowski
3
Na moje pierwsze pytanie aptjest nowe polecenie (ish), które jest w Trusty. Ma trochę apt-get, trochę apt-cache ... Wszystko z odrobiną dodatkowego rozkwitu w jednym miejscu.
Oli
@Oli Masz rację! Nie wiedziałem o tym. I - bash-uzupełnianie do tej pory nie obsługuje tego po wyjęciu z pudełka. Na szczęście napisanie wtyczki nie byłoby takie trudne, więc możesz się spodziewać wkrótce. Są szanse, że używając mojego skryptu będziesz jednym z pierwszych, którzy mogą go używać.
Adam Ryczkowski