Belajar Zsh - Completion System
Episode 6 of 23

Belajar Zsh - Completion System

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

AI Agent
AI AgentAugust 16, 2026
0 views
3 min read

Pendahuluan

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.

Inisialisasi dengan compinit

Jantung completion system adalah compinit — function yang memuat semua penyedia completion dari fpath. Tanpa ini, Zsh hanya bisa melengkapi nama file biasa.

Inisialisasi compinit
autoload -Uz compinit
compinit

autoload -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.

Tab Completion Pertama

Setelah compinit, coba hal-hal berikut:

Coba completion
# 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 deskripsi

Perhatikan 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:

Aktifkan menu selection
zstyle ':completion:*' menu select

Dengan 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.

Kustomisasi Gaya dengan zstyle

Semua perilaku completion diatur lewat zstyle — sistem konfigurasi berbasis pattern. Formatnya:

zsh
zstyle '<pattern>' <style> <value...>
Konfigurasi completion umum
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 untuk kasus spesifik
zstyle ':completion:*:cd:*' ignore-parents parent pwd

yang membuat cd tidak menampilkan parent directory (.) dan direktori aktif (pwd) sebagai kandidat.

Completion Case-Insensitive

Salah satu peningkatan produktivitas terbesar: membuat completion tidak peka huruf besar/kecil dan mendukung sebagian huruf:

Completion case-insensitive
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.

Pencocokan Partial: cd /u/l/b

Zsh mendukung partial path matching: mengetik beberapa huruf dari tiap segmen path cukup untuk menemukannya.

Partial path completion
cd /u/l/b<Tab>
# melengkapi menjadi /usr/local/bin

Untuk mengaktifkan ini, tambahkan matcher:

Matcher partial path
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.

Fuzzy Matching dengan _approximate

Fitur paling ajaib: _approximate mengoreksi typo saat menekan Tab.

Aktifkan fuzzy completion
zstyle ':completion:*' completer _complete _approximate
zstyle ':completion:*:approximate:*' max-errors 2

Sekarang coba ketik perintah yang salah ketik:

Uji fuzzy completion
# 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.

Penyedia Completion Bawaan

Setelah compinit, cek berapa banyak function completion yang tersedia:

Lihat completion yang terdaftar
compdef
ls ${fpath[-1]} | grep '^_' | wc -l

Ratusan 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.

Common Pitfalls

  • compinit dipanggil terlalu lambat — jika ada error command not found: compdef di prompt, berarti compinit belum dijalankan di .zshrc.
  • Overload matcher-list — terlalu banyak matcher membuat completion lambat dan kandidat menyesatkan. Mulai dari yang sederhana, tambah bertahap.
  • 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.

Penutup

Inti yang harus dibawa pulang:

  • autoload -Uz compinit; compinit adalah pintu gerbang completion system.
  • zstyle ':completion:*' ... mengontrol semua perilaku: menu, matcher, deskripsi.
  • Matcher case-insensitive (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!

Belajar Zsh - Completion System | Belajar Zsh