Bagaimana cara kerja penyelesaian tab bash?

113

Saya telah menghabiskan banyak waktu di shell akhir-akhir ini dan saya bertanya-tanya bagaimana cara kerja tab autocomplete. Apa mekanisme dibaliknya? Bagaimana bash mengetahui konten setiap direktori?

CamelBlues
sumber
2
Anda mungkin ingin memeriksa /etc/bash_completion(setidaknya, di situlah banyak keajaiban Debian).
Wrikken
1
@Wrikken: Itu bash_completion, yang bergantung pada penyelesaian tab tetapi tidak seperti yang terjadi.
Ignacio Vazquez-Abrams

Jawaban:

100

Ada dua bagian pelengkapan otomatis:

  • Pustaka garis baca, seperti yang telah disebutkan oleh fixje, mengelola pengeditan baris perintah, dan memanggil kembali ke bash saat tab ditekan, untuk mengaktifkan penyelesaian. Bash kemudian memberikan (lihat poin selanjutnya) daftar penyelesaian yang mungkin, dan baris baca menyisipkan sebanyak mungkin karakter yang diidentifikasi secara jelas oleh karakter yang sudah diketik. (Anda dapat mengkonfigurasi pustaka readline cukup banyak, lihat bagian Pengeditan baris perintah dari Bash manual untuk detailnya.)

  • Bash sendiri memiliki built-in completeuntuk menentukan mekanisme penyelesaian untuk perintah individual. Jika untuk perintah saat ini tidak ada yang didefinisikan, maka digunakan penyelesaian berdasarkan nama file (menggunakan opendir / readdir, seperti kata Ignacio).

    Bagian untuk menentukan penyelesaian Anda sendiri dijelaskan di bagian Penyelesaian yang Dapat Diprogram . Singkatnya, dengan complete «options» «command»Anda menentukan penyelesaian untuk beberapa perintah. Misalnya complete -u su, ketika menyelesaikan argumen untuk superintah, cari pengguna sistem saat ini .

    Jika ini lebih rumit daripada yang dapat dicakup opsi normal (mis. Penyelesaian yang berbeda bergantung pada indeks argumen, atau bergantung pada argumen sebelumnya), Anda dapat menggunakan -F function, yang kemudian akan memanggil fungsi shell untuk menghasilkan daftar kemungkinan penyelesaian. (Ini digunakan misalnya untuk penyelesaian git, yang sangat rumit, bergantung pada subperintah dan terkadang pada opsi yang diberikan, dan terkadang menggunakan nama cabang (yang tidak diketahui oleh bash).

Anda dapat membuat daftar penyelesaian yang ada yang ditentukan dalam lingkungan bash Anda saat ini dengan sederhana complete, untuk mendapatkan kesan tentang apa yang mungkin. Jika Anda memiliki paket penyelesaian bash (atau bagaimanapun namanya pada sistem Anda), penyelesaian untuk banyak perintah diinstal, dan seperti yang dikatakan Wrikken, /etc/bash_completionberisi skrip bash yang kemudian sering dieksekusi pada startup shell untuk mengonfigurasi ini. Skrip penyelesaian kustom tambahan dapat ditempatkan di /etc/bash_completion.d; itu semua bersumber dari /etc/bash_completion.

Paŭlo Ebermann
sumber
1
Halaman manual hanya ada untuk perintah independen, bukan untuk bawaan shell. Tapi itu adalah bagian dari manual bash yang saya tautkan.
Paŭlo Ebermann
7

Jika Anda tertarik dengan dasar-dasarnya: Bash menggunakan garis baca yang menampilkan riwayat dan penyelesaian dasar. Anda dapat memeriksa sumbernya jika ingin mendapatkan pemahaman yang mendetail. Selanjutnya, Anda dapat menggunakan readline untuk membangun antarmuka CLI Anda sendiri dengan penyelesaian

fixje
sumber