- Memperkenalkan cara mengimplementasikan fitur pelengkapan tab di Bash dan Zsh yang menampilkan deskripsi bahkan untuk kata yang sudah lengkap
- Bash dan Zsh menggunakan API pelengkapan tab yang berbeda, dan hanya Zsh yang secara bawaan menyediakan fitur menampilkan deskripsi pada pelengkapan
- Mengimplementasikan struktur yang menghasilkan kandidat dengan
_generate_foo_completions lalu mengembalikannya melalui COMPREPLY di Bash dan compadd di Zsh
- Untuk menerapkan fitur deskripsi Zsh di Bash juga, digunakan pendekatan menyertakan deskripsi dalam string kandidat lalu menghapus deskripsi itu hanya saat kandidatnya tunggal
- Bahkan saat kandidatnya tunggal, perilaku ini ditingkatkan dengan sengaja menambahkan ambiguitas agar deskripsi tetap ditampilkan saat menekan
<TAB>
- Skrip akhirnya memberikan pengalaman pengguna yang sama di kedua shell, serta mendukung pelengkapan parsial, pelengkapan penuh, dan tampilan deskripsi kandidat
Latar belakang masalah
- Pelengkapan tab (tab-completion) berguna saat menjelajahi perintah atau flag, terutama ketika baru pertama kali menggunakan API atau alat CLI
- Secara bawaan, Zsh hanya menampilkan deskripsi ketika ada beberapa kandidat, sedangkan Bash hanya bisa melakukannya lewat konfigurasi tambahan
- Namun, untuk kata yang sudah lengkap, kedua shell tidak menampilkan deskripsi
- Akibatnya, pengguna harus melalui proses merepotkan seperti berikut untuk melihat deskripsi
- Menghapus beberapa karakter agar beberapa kandidat cocok
- Menekan tombol
<TAB> untuk melihat daftar kandidat
- Mencari deskripsi yang diinginkan secara visual
- Mengetik ulang karakter yang tadi dihapus untuk menjalankan perintah
Ringkasan solusi
- Bahkan jika hanya ada satu kandidat, tambahkan kandidat dummy (dummy completion) agar kandidat menjadi ambigu
- Dengan begitu, baik Bash maupun Zsh akan menampilkan daftar kandidat beserta deskripsinya
- Namun, harus diperhatikan agar teks deskripsi tidak ikut disisipkan ke perintah sebenarnya
Konsep dasar
- Pelengkapan tab bekerja dengan menerima kata saat ini dan posisi kursor ketika
<TAB> ditekan, lalu mengembalikan daftar kandidat yang mungkin
- Bash: menetapkan kandidat ke array
COMPREPLY
- Zsh: mendaftarkan kandidat dengan perintah
compadd
- Fungsi
_generate_foo_completions mencetak string kandidat, dan dalam penggunaan nyata bisa dibuat secara dinamis berdasarkan status CLI
Mendukung Bash dan Zsh sekaligus
- Mengimplementasikan fungsi
_complete_foo_bash dan _complete_foo_zsh sesuai shell masing-masing
- Membedakannya dengan
if [ -n "${ZSH_VERSION:-}" ]; then ... elif [ -n "${BASH_VERSION:-}" ]; then ... fi
- Pengguna menerapkan skrip ini setelah mendaftarkannya di
.bashrc atau .zshrc
Menampilkan deskripsi di Zsh
- Gunakan format
nama: deskripsi pada string kandidat
- Zsh: kirim nama dan deskripsi sebagai array paralel lewat
compadd -d raw -- $trimmed
- Bash: hanya kirim kandidat tanpa bagian deskripsi ke
COMPREPLY (secara bawaan tidak mendukung deskripsi)
Mengimplementasikan deskripsi di Bash
- Jika ada beberapa kandidat, tampilkan apa adanya string yang sudah berisi deskripsi
- Jika kandidatnya tunggal, hapus deskripsinya
- Manfaatkan perilaku pelengkapan Bash yang hanya menyisipkan prefiks bersama agar deskripsi tidak benar-benar masuk ke input
Menampilkan deskripsi bahkan untuk kandidat tunggal
- Agar deskripsi tetap terlihat saat menekan
<TAB> pada kata yang sudah lengkap, tambahkan kandidat dummy untuk menciptakan ambiguitas
- Zsh: tambahkan kandidat dummy ke kedua array paralel (
raw, trimmed)
- Bash: jika kandidatnya tunggal, tambahkan hanya namanya ke
trimmed
Hasil akhir
Belum ada komentar.