Bash autocomplete dengan perintah vim

13

Di bash, pelengkapan otomatis lintasan baru-baru ini berhenti bekerja ketika mengeluarkan vimperintah di mana lintasan lebih dalam dari dua direktori (ini terus bekerja seperti yang diharapkan dengan perintah lain, seperti lsdan cd).

Misalnya, jika saya mengetik ls .config/btsync/btdan kemudian tekan TAB, itu akan diperluas ke ls .config/btsync/btsync.conf.

Jika saya mengetik vim .config/btdan kemudian tekan TAB, itu diperluas ke vim .config/btsync/.

Namun, jika saya mengetik vim .config/btsync/btdan kemudian menekan TAB, tidak ada yang terjadi (saya akan berharap itu meluas ke vim .config/btsync/btsync.conf, seperti pada lscontoh, di atas.

Saya mendapatkan masalah yang sama saat berjalan sebagai pengguna saya sendiri dan ketika berjalan sebagai su.

Saya membaca posting ini yang menyebutkan masalah dengan versi lama dari penyelesaian-bash tetapi saya menjalankan 2.1-5.

UPDATE: Setelah beberapa pengujian tambahan, saya menemukan bahwa masalah root adalah bahwa bash hanya akan melengkapi nama direktori, bukan nama file.

UPDATE: Ternyata itulah bash-completionpenyebab keseluruhannya. Lihat komentar kedua saya pada jawaban yang diterima.

Setiap saran tentang kemungkinan penyebab perilaku ini akan diterima dengan penuh rasa syukur!

TheRogueWolf
sumber
Posting Anda .bashrc!
Gilles 'SANGAT berhenti menjadi jahat'
Tautan ke .bashrcposting saya , sesuai permintaan.
TheRogueWolf
Tautan yang dihapus ke .bashrc, .aliases, dan .fungsi tidak relevan dengan masalah sekarang karena penyebabnya telah ditemukan.
TheRogueWolf
masalah yang sama pada Debian 9, beberapa instalasi tetapi tidak semua: $
Philippe Gachoud

Jawaban:

10

Saya melakukan riset lebih lanjut untuk Anda dan inilah yang saya temukan - kunci untuk pelengkapan otomatis adalah bashperintahnya complete. Anda dapat mencetak aturan untuk vimmenggunakan:

complete -p vim

Anda juga dapat menghapus aturan khusus ini dengan:

complete -r vim

Perintah ini mengatur ulang ke default - jalur yang biasa dan nama file selesai tanpa logika tambahan. Mungkin itu yang Anda inginkan.

Untuk info lebih lanjut, periksa help completeatau man bashcari bagian tentang completeperintah (ini adalah built-in bash, karenanya didokumentasikan dalam manual bash).

Satu titik terakhir - perubahan di atas hanya memengaruhi bashsesi saat ini , jika Anda ingin menghapus aturan vim setelah setiap login memasukkan complete -r vimke Anda ~/.bashrc.

Semoga itu bisa membantu :)

MLu
sumber
Itu berhasil. Terima kasih banyak. The complete -p vimperintah kembali complete -F _filedir_xspec vimyang telah dihapus oleh complete -r vimperintah, menyelesaikan masalah. Saya akan melakukan beberapa pembacaan pada completeperintah dan informasi yang dikembalikan oleh -p switch. Agak bingung mengapa perilaku ini berubah jadi akan menyelidiki itu juga.
TheRogueWolf
3
Sepertinya penyelesaian bash adalah biang keladinya. The _filedir_xspecfungsi dalam /usr/share/bash-completion/bash_completionhanya melengkapi direktori. Saya telah mencopot pemasangan bash-completion, menghapus complete -r vimsaluran dari saya .bashrcdan mem-boot ulang dan vimsekarang berperilaku seperti yang diharapkan.
TheRogueWolf
3

Bash secara default hanya akan melengkapi jalur dan nama file. Namun mekanisme ini dapat diperpanjang dan bash dapat diajarkan untuk melakukan pelengkapan otomatis yang berbeda untuk program yang berbeda. Misalnya untuk gititu dapat secara otomatis melengkapi nama-nama sub-perintah (klon, komit) dan revisi bukan hanya nama path. Kadang-kadang berguna, kadang-kadang cukup menjengkelkan - misalnya ketika gzip -dmenolak untuk melengkapi nama file yang tidak memiliki .gzekstensi.

Penyelesaian Bash biasanya dikonfigurasi dalam /etc/bash_completion.d- Anda mungkin akan menemukan file yang dipanggil vimdi sana. Itu file yang berisi aturan pelengkapan otomatis untuk vimcommandline.

Sekarang Anda punya dua opsi:

  1. Baik perbaiki file ke jalur pelengkapan otomatis seperti yang mungkin diharapkan pengguna.
  2. Hapus file untuk menonaktifkan vimaturan khusus dan hanya melakukan penyelesaian otomatis jalur default.

Dan tentu saja, laporkan laporan bug yang menguraikan masalah sehingga diperbaiki di versi mendatang :)

MLu
sumber
Terima kasih banyak atas penjelasannya yang luar biasa :) Saya sudah melihat-lihat /etc/bash_completion.ddan hanya ada hghadiah file (untuk Mercurial). Sangat aneh.
TheRogueWolf
1
Maka harus di tempat lain. Coba /usr/share/bash-completion/atau daftarkan semua file dari vimpaket atau dari bashatau bash-completionpaket (tidak yakin bagaimana itu disebut pada ArchLinux). Itu akan ada di suatu tempat.
MLu
1
Daftar file dari bash-completionpaket menunjukkan /usr/share/bash-completion/completionsmemang berisi aturan untuk banyak program, tetapi tidak vim. Mendaftar file yang diinstal dengan vimpaket tidak menunjukkan file terkait penyelesaian dan mencari seluruh sistem menggunakan find / -name vimjuga tidak menunjukkan file terkait penyelesaian.
TheRogueWolf
2

Mungkin Anda dapat menginstal ulang bash-completion: apt-get install --reinstall bash-completion

Dan lihat file /etc/bash.bashrc: nano /etc/bash.bashrc

Dan verifikasi bahwa baris berikut tidak dikomentari dengan baik:

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

Kemudian, mulai kembali sesi terminal Anda

Djidiouf
sumber
Saya mencoba menghapus bash-completion, menguji vimperilaku dan kemudian menginstal ulang bash-completiondan menguji tetapi saya masih mengalami masalah yang sama di kedua keadaan tersebut. Baris yang Anda daftarkan tidak ada di /etc/bash.bashrc. Namun, baris ini[ -r /usr/share/bash-completion/bash_completion ] && . /usr/share/bash-completion/bash_completion
TheRogueWolf