Bisakah saya mengaktifkan bash-completion untuk perintah apt yang baru?

20

aptPerintah baru , hadir di Ubuntu sejak 14,04, tampaknya menjadi persimpangan fungsi yang sangat berguna antara apt-getdan apt-cachetetapi versi saat bash-completionini tidak tahu tentang itu ... Yang membuatnya jauh lebih sulit untuk digunakan.

Apakah ada cara cepat untuk menambahkan fungsi ini ke Bash untuk membuat aptperintah itu mudah digunakan?

Oli
sumber
1
Penandaan pertanyaan ini mulai dibahas pada meta .
Gilles 'SO- stop being evil'

Jawaban:

26

Ini adalah kelalaian dalam bash-completepaket, bukan apt. Sepertinya penyelesaian belum ada, jadi saya sudah membatalkan apa yang saya bisa untuk aptperintah (itu bukan perintah terbaik yang pernah ada!)

Berikut ini adalah adaptasi dari apt-getpenyelesaian yang ada (dengan elemen dilucuti dan bit ditambahkan dari apt-cachepenyelesaian). Jalankan sudoedit /usr/share/bash-completion/completions/aptdan tempel berikut ini:

# 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

Kemudian jalankan source ~/.bashrcuntuk memuat penyelesaian. Maka apt show firef+ Tabharus lengkap.

Ini mungkin menawarkan opsi yang tidak ada lagi. Saya pikir saya sudah dipaku perintah utama (yang mungkin berubah dalam waktu) tapi setidaknya itu akan membantu Anda dengan perintah umum: list search show update install remove upgrade full-upgrade edit-sources dist-upgrade purge.

Jelas, jika pengelola bash-completion ingin menangkap hal di atas, Anda dipersilakan untuk itu di bawah GPL (meskipun saya akan tergoda untuk memulai dari yang baru setelah aptdidokumentasikan!)

Oli
sumber
8
Buka bug dan kirimkan ini sebagai tambalan!
Jorge Castro
Apakah Anda tahu cara menggunakan jawaban ini zsh?
Percepatan-G
ada kata di mana harus "saya juga" ini di launchpad?
Mateo
1

Mengapa tidak menggunakan asli bash selesai ?

Coba skrip ini. Ini akan mengunduh dan menginstal penyelesaian-bash pada ~/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

Anda mulai menggunakannya dengan perintah . ~/tmp/bash-completion/bash_completion.sh, yang dapat dimasukkan ke ~/.bashrcfile, atau - lebih baik lagi - symlink ke beberapa file di /etc/profile.d/direktori. Copot pemasangan penyelesaian-bash asli, sehingga Anda tidak akan berakhir memuat keduanya sekaligus.

Adam Ryczkowski
sumber
Saya belum memikirkan hal ini tetapi mereka juga tampaknya belum memiliki penyelesaian yang tepat
Oli
1
@ Oke Yah, kurasa mereka melakukannya. Ada file aptitude, apt-getdan apt-cache. Apa sebenarnya yang Anda maksud dengan penyelesaian yang tepat ?
Adam Ryczkowski
3
Per pertanyaan pembuka saya, aptadalah perintah baru (ish) yang ada di Trusty. Ini memiliki beberapa apt-get, beberapa apt-cache ... Semua dengan sedikit tambahan di satu tempat.
Oli
@Oli Oh, kamu benar! Saya tidak tahu tentang itu. Dan - penyelesaian-bash tidak mendukungnya sejauh ini. Untungnya tidak akan terlalu sulit untuk menulis plugin, jadi Anda dapat mengharapkannya segera. Kemungkinannya, bahwa dengan menggunakan skrip saya, Anda akan menjadi yang pertama, yang dapat menggunakannya.
Adam Ryczkowski