Penyelesaian tab tidak berfungsi untuk perintah

50

Saya mencoba menggunakan penyelesaian tab untuk perintah di Ubuntu 11.04 Beta 1, menjalankan semua pembaruan terbaru, tetapi sepertinya tidak berhasil. (Meskipun paket bash-completion diinstal)

Penyelesaian tab hanya berfungsi dengan benar untuk direktori atau file.

Ada ide tempat menggali?

Screatch
sumber
Saya memecahkan masalah ini dengan menggunakan solusi yang diberikan di askubuntu.com/questions/325807/…
DB

Jawaban:

67

Periksa apakah Anda memiliki fragmen berikut di .bashrc Anda (harus ada di sana secara default)

# enable programmable completion features (you don't need to enable
# this, if it's already enabled in /etc/bash.bashrc and /etc/profile
# sources /etc/bash.bashrc).
if [ -f /etc/bash_completion ] && ! shopt -oq posix; then
    . /etc/bash_completion
fi
Adam Byrtek
sumber
Terima kasih! Saya telah mengganti .bashrc dengan milik saya dan oleh karena itu tidak dapat mengetahui apa masalahnya. Sekarang berfungsi dengan sempurna.
Screatch
ini memperbaiki autocomplet git bash saya di xubuntu 12.04 juga, terima kasih banyak.
Palmic
Bagaimana dengan pelengkapan otomatis untuk sakelar dan opsi baris perintah apt-get? yaitu ketika Anda memasukkan apt-get in dan kemudian tekan tab untuk melengkapinya secara otomatis.
Reza Ghodsi
3
Saya ingin menambahkan bahwa paket bash-completionini diperlukan agar ini berfungsi. Anehnya, instalasi standar perusahaan saya tidak memiliki paket ini.
Edgar
13

Saya pikir saya juga akan menambahkan penjelasan tambahan berikut untuk kegagalan penyelesaian bash - terlalu lama untuk komentar dan mungkin berguna bagi seseorang yang memiliki masalah dengan penyelesaian bash, karena mungkin ini adalah pertanyaan kanonik 'umum' yang semua duplikat disebut.

Bahkan jika Anda memiliki baris yang sesuai di .bashrc(seperti pada jawaban di atas) dan bash-completionpaket yang diinstal, penyelesaian bash masih dapat mengalami kegagalan fungsi jika Anda memiliki shopt -s nullglobatau shopt -s failglobdi dalam .bashrcatau .bash_aliases.

Skenario berikut diuji dengan semua kustomisasi pengguna .bashrcdan .bash_aliasesdihapus untuk memberikan tes yang adil, dengan garis penyelesaian bash yang sesuai pada .bashrcsaat ini dan dengan yang bash-completiondiinstal.

1) Skenario pertama adalah ketika Anda memiliki shopt -s failglobdi .bashrcatau .bash_aliases.

Ketika mencoba masing-masing direktori dan file lengkap tab, kesalahan ini akan terjadi:

cd Dbash: no match: "${COMP_WORDS[@]}"  
cat pabash: no match: words[0]=${!ref}${COMP_WORDS[i]}

Namun, perintah akan tetap berhasil diselesaikan.

2) Dengan shopt -s nullglobdiaktifkan, mencoba tab untuk menyelesaikan direktori atau file sebagai gantinya akan mengarah ke semua yang terdaftar, tanpa penyelesaian:

cd Do
.adobe/                  .gimp-2.6/               Podcasts/
.aptitude/               .gnome2/                 Public/
.audacity-data/          .gnome2_private/         .pulse/
............

Saya telah memotong daftar di sini, karena itu sangat panjang dan tidak perlu mereproduksi semuanya.

Sekali lagi, penyelesaian perintah masih akan berfungsi.

Jadi, hanya menghapus shopt -s failglobatau shopt -s nullglobjuga bisa menyelesaikan masalah kesalahan dengan selesai bash, dengan asumsi bahwa Anda memiliki garis yang sesuai di Anda .bashrcdan bash-completiondiinstal.


sumber
1
Penjelasan yang bagus, itu menyelesaikan masalah saya ketika saya mencoba penyelesaian tab dan kesalahan terjadi >> kata [0] = $ {! Ref} $ {COMP_WORDS [i]}
bagustris
Sementara itu berfungsi sebagai solusi, itu adalah hal yang buruk bagi programmer penyelesaian untuk mengandalkan. Karena nullglob (yang secara nominal lebih baik bagi banyak orang) dan kerabat mungkin diatur, kode pelengkap apa pun yang memerlukan semantik lama (wildcard tanpa kecocokan menghasilkan wildcard itu sendiri) harus menyimpan pengaturan glob saat ini, mengatur yang mereka butuhkan, dan mengembalikan pengaturan glob tua setelahnya, sama seperti IFS biasanya digunakan.
Alex North-Keys
10

Selain memodifikasi /etc/bash.bashrcfile (lihat jawaban lain) Anda mungkin perlu menginstal bash-completionpaket.

Periksa, apakah /etc/bash_completionfile keluar. Jika tidak:

sudo apt-get install bash-completion

(Dalam instalasi Debian 7 saya awalnya tidak diinstal)

Sersan
sumber
7

Dasar seperti kedengarannya pastikan bash adalah shell aktif Anda

echo $SHELL

Saya baru saja memutakhirkan ke Ubuntu 14.04.1 LTS dan tidak memiliki tab pelengkapan otomatis, bahkan setelah mengikuti saran pada posting ini, hanya untuk menyadari bahwa shell saya telah disetel ke /bin/shdan tidak /bin/bash.

nocdib
sumber
2

Memperbarui ke Ubuntu 14.04.01

Periksa apakah Anda memiliki fragmen berikut di .bashrc Anda (harus ada di sana secara default)

sudo vim /etc/bash.bashrc (ketik "i" untuk mengedit file)

    # enable bash completion in interactive shells
    if ! shopt -oq posix; then
     if [ -f /usr/share/bash-completion/bash_completion ]; then
        . /usr/share/bash-completion/bash_completion
      elif [ -f /etc/bash_completion ]; then
        . /etc/bash_completion
      fi
    fi

Batalkan komentar 7 baris di atas

Simpan file "esc + w + q + enter"

Mulai ulang bash

exec bash

Diego Arriola
sumber
1
Apa yang akan dilakukan? Bukankah ini seperti ini secara default?
Tim
Seperti yang dikatakan @Tim, konfigurasi itu disediakan oleh konfigurasi default.
ssoto
Ini bekerja untuk saya
Thamaraiselvam
Jawaban ini bekerja seperti pesona, dan memiliki suara negatif ???
greuze