Posso abilitare bash-completamento per il nuovo comando apt?


20

Il nuovo aptcomando, presente in Ubuntu dal 14.04, sembra essere un'intersezione di funzionalità davvero utile tra apt-gete apt-cachema la versione attuale di bash-completionnon ne è a conoscenza ... Il che rende molto più difficile da usare.

Esiste un modo rapido per aggiungere questa funzionalità a Bash per rendere il aptcomando facile da usare?


1
Il tagging di questa domanda è iniziato discusso su meta .
Gilles 'SO- smetti di essere cattivo' il

Risposte:


26

Questa è un'omissione nel bash-completepacchetto, no apt. Sembra che non esista ancora un completamento, quindi ho messo insieme quello che posso per il aptcomando (non è il comando documentato migliore che sia mai esistito!)

Quello che segue è un adattamento dal apt-getcompletamento esistente (con elementi eliminati e bit aggiunti dal apt-cachecompletamento). Esegui sudoedit /usr/share/bash-completion/completions/apte incolla quanto segue:

# 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

Quindi eseguire source ~/.bashrcper caricare il completamento. Quindi apt show firef+ Tabdovrebbe essere completato.

Questo potrebbe offrirti opzioni che non esistono più. Penso di aver inchiodato i comandi principali (che potrebbe cambiare nel tempo), ma per lo meno l'aiuterò con i comandi più comuni: list search show update install remove upgrade full-upgrade edit-sources dist-upgrade purge.

Ovviamente, se un manutentore del completamento della bash vuole ottenere quanto sopra, sei il benvenuto sotto GPL (anche se sarei tentato di ricominciare da capo una volta che aptè documentato!)


8
Apri un bug e invialo come patch!
Jorge Castro,

Hai idea di come utilizzare questa risposta con zsh?
Exeleration-G,

qualche parola su dove "anche io" questo sul launchpad?
Mateo,

1

Perché non usare il completamento bash originale ?

Prova questo script. Scarica e installa il completamento bash su ~/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

Inizi a usarlo con il comando . ~/tmp/bash-completion/bash_completion.sh, che può essere inserito in un ~/.bashrcfile o, meglio ancora, collegalo a un file nella /etc/profile.d/directory. Disinstalla il completamento bash originale, in modo da non finire per caricare entrambi contemporaneamente.



1
@Oli Beh, immagino che lo facciano. Ci sono file aptitude, apt-gete apt-cache. Cosa intendi esattamente con completamento apt ?
Adam Ryczkowski l'

3
Per la mia domanda iniziale, aptè un comando nuovo (ish) che si trova in Trusty. Ha un po 'di apt-get, alcuni di apt-cache ... Tutti con un po' di extra in un unico posto.
Oli

@Oli Oh, hai ragione! Non lo sapevo. E - bash-completamento non lo supporta fin dall'inizio. Fortunatamente non sarebbe così difficile scrivere un plugin, quindi puoi aspettartelo presto. È probabile che usando il mio script sarai tra i primi a poterlo usare.
Adam Ryczkowski,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.