Menguasai completion system Zsh yang menjadi salah satu alasan utama pindah dari bash: inisialisasi dengan compinit, menu completion interaktif, kustomisasi gaya lewat zstyle, completion case-insensitive, pencocokan partial untuk cd /u/l/b, dan fuzzy matching _approximate yang mengoreksi typo saat menekan Tab

Setelah di episode 5 kita membahas globbing, pada episode ini kita masuk ke fitur yang paling sering disebut sebagai alasan utama orang pindah ke Zsh: completion system. Bayangkan menekan Tab dan Zsh memahami konteks perintah yang sedang kalian ketik — opsi git commit -a vs git push --force, argumen scp yang mengerti daftar remote, atau cd yang bisa menemukan direktori dari huruf-huruf acak.
Completion system Zsh bukan sekadar "melengkapi nama file". Ia adalah framework berbasis function: setiap perintah punya function penyedia completion (_git, _ssh, _kubectl, dan ratusan lainnya) yang memberitahu Zsh apa yang harus dilengkapi. Di episode ini kita bangun fondasi yang akan terus kita pakai sepanjang series.
Jantung completion system adalah compinit — function yang memuat semua penyedia completion dari fpath. Tanpa ini, Zsh hanya bisa melengkapi nama file biasa.
autoload -Uz compinit
compinitautoload -Uz compinit mendaftarkan compinit sebagai function yang dimuat on-demand, lalu compinit membaca direktori completion dari fpath (defaultnya sudah di-set saat instalasi zsh) dan meng-index semua function _*.
Note
compinit memakan waktu startup karena meng-index ratusan file. Di episode 21 kita optimalkan dengan compinit -C (skip reindex) dan dump cache ke file. Untuk sekarang, pastikan compinit dipanggil sebelum menggunakan fitur completion apa pun.
Setelah compinit, coba hal-hal berikut:
# Tekan Tab setelah mengetik sebagian
cd ~/D<Tab> # melengkapi nama direktori
git <Tab> # menampilkan semua subcommand git
git ch<Tab> # menampilkan checkout, cherry-pick, ...
ls -<Tab> # menampilkan semua opsi ls dengan deskripsiPerhatikan yang terakhir: Zsh menampilkan deskripsi setiap opsi di menu — sesuatu yang tidak pernah dilakukan bash. Ini karena function _ls tahu deskripsi opsi -a (all), -l (long format), dan seterusnya.
Saat ada beberapa kemungkinan, Zsh menampilkan daftar di bawah prompt. Kalian bisa memilih dengan tombol panah:
zstyle ':completion:*' menu selectDengan menu select, tekan Tab sekali untuk memulai selection, lalu gunakan panah →/←/↑/↓ untuk memilih dan Enter untuk menerima. Ini membuat completion terasa seperti selector interaktif, bukan sekadar daftar statis.
Semua perilaku completion diatur lewat zstyle — sistem konfigurasi berbasis pattern. Formatnya:
zstyle '<pattern>' <style> <value...>zstyle ':completion:*' menu select
zstyle ':completion:*' verbose yes
zstyle ':completion:*' group-name ''
zstyle ':completion:*:descriptions' format '%F{green}-- %d --%f'Pattern :completion:* berlaku untuk semua completion. Bagian setelah :completion: bisa mempersempit cakupan, misalnya:
zstyle ':completion:*:cd:*' ignore-parents parent pwdyang membuat cd tidak menampilkan parent directory (.) dan direktori aktif (pwd) sebagai kandidat.
Salah satu peningkatan produktivitas terbesar: membuat completion tidak peka huruf besar/kecil dan mendukung sebagian huruf:
zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}'Dengan matcher di atas, cd ~/Do<Tab> bisa melengkapi ~/Documents dan ~/downloads sekaligus — tidak peduli kasus aslinya.
Zsh mendukung partial path matching: mengetik beberapa huruf dari tiap segmen path cukup untuk menemukannya.
cd /u/l/b<Tab>
# melengkapi menjadi /usr/local/binUntuk mengaktifkan ini, tambahkan matcher:
zstyle ':completion:*' matcher-list '' 'm:{a-zA-Z}={A-Za-Z}' 'r:|[._-]=* r:|=*' 'l:|=* r:|=*'Baris terakhir (l:|=* r:|=*) membuat Zsh mencocokkan huruf di posisi mana pun — jadi cd u/bin bisa menemukan /usr/local/bin. Ini kombinasi matcher yang dipakai oleh banyak framework seperti Oh My Zsh.
Fitur paling ajaib: _approximate mengoreksi typo saat menekan Tab.
zstyle ':completion:*' completer _complete _approximate
zstyle ':completion:*:approximate:*' max-errors 2Sekarang coba ketik perintah yang salah ketik:
# Ketik: cd Document<Salah ketik> dan tekan Tab
cd Documant<Tab>
# Zsh menawarkan kandidat dengan edit distance ≤ 2_approximate mencoba semua kandidat yang berjarak hingga max-errors edit (2 perubahan) dari kata yang kalian ketik. Ini sangat berguna untuk path yang panjang dan nama perintah yang rumit.
Warning
Urutan completer penting: _complete _approximate berarti Zsh mencoba completion biasa dulu, baru fuzzy jika tidak ada yang cocok. Jangan balik urutannya — _approximate di depan akan membuat Zsh "menebak" terlalu agresif dan bisa menampilkan kandidat yang tidak relevan.
Setelah compinit, cek berapa banyak function completion yang tersedia:
compdef
ls ${fpath[-1]} | grep '^_' | wc -lRatusan function _* sudah tersedia untuk perintah besar seperti git, docker, kubectl, ssh, rsync, dan semua alat CLI standar. Zsh bahkan punya penyedia untuk opsi --help dari program tertentu.
compinit dipanggil terlalu lambat — jika ada error command not found: compdef di prompt, berarti compinit belum dijalankan di .zshrc.zstyle pattern salah — pattern yang terlalu spesifik tidak akan pernah cocok; uji dengan zstyle -L untuk melihat semua rule aktif.Tip
Diagnostik ampuh: zstyle -L ':completion:*' menampilkan seluruh konfigurasi completion yang aktif, dan verbose yes membuat Zsh menampilkan deskripsi penuh tiap kandidat. Dua ini teman debugging terbaik kalian.
Inti yang harus dibawa pulang:
autoload -Uz compinit; compinit adalah pintu gerbang completion system.zstyle ':completion:*' ... mengontrol semua perilaku: menu, matcher, deskripsi.m:{a-zA-Z}={A-Za-z}) dan partial (l:|=* r:|=*) menghemat banyak ketikan._approximate memberi fuzzy completion dengan batas max-errors.Di episode 7 selanjutnya kita akan membahas prompt, RPROMPT, dan line editor — membangun prompt yang informatif dengan PROMPT/PS1 dan RPROMPT, menambahkan git branch via vcs_info, lalu menguasai ZLE: keybinding dengan bindkey, mode emacs/vi, dan widget seperti history-search-backward. Sampai jumpa di episode 7!