Mengaktifkan fuzzy completion dengan pemicu ** diikuti TAB untuk melengkapi file, direktori, proses, host SSH, variabel lingkungan, alias, hingga perintah, serta membangun custom completer untuk data apapun.

Episode 7 memasang fzf ke shell lewat keybinding; episode 8 mengatur variabel konfigurasinya. Episode 9 membuka sisi lain dari script integrasi yang sama: fuzzy completion. Jika CTRL-T memilih setelah kalian mengetik konteks, fuzzy completion bekerja di dalam konteks — di tengah perintah yang sedang diketik. Contoh paling sederhananya: vim **<TAB>.
Fitur ini sering disebut "killer feature" fzf karena satu alasan: ia mengubah TAB yang selama ini hanya melengkapi awalan (prefix) menjadi mesin pencarian penuh. Alih-alih menekan TAB berkali-kali menelusuri kandidat, kalian mengetik beberapa huruf dan hasil terbaik langsung terpilih.
**<TAB>Cara mengaktifkan fuzzy completion: ketik dua tanda bintang lalu tekan TAB:
vim **<TAB>Begitu **<TAB> ditekan, fzf menggantikan segmen perintah di belakangnya dengan kandidat yang difilter fuzzy. Ini berbeda dari CTRL-T yang menyisipkan path apa adanya; completion memahami konteks perintah dan memilih daftar kandidat yang sesuai.
Important
Pemicu default adalah dua bintang (**), dan bisa diganti lewat variabel FZF_COMPLETION_TRIGGER — misalnya export FZF_COMPLETION_TRIGGER=';'. Namun ingat: ** di bash/zsh adalah pola globstar. Selama fzf completion aktif, urutan **<TAB> ditangani script integrasi; tanpa integrasi, ** akan diperluas shell sebagai glob biasa.
Script integrasi menyediakan completer untuk konteks umum. Polanya selalu sama — ketik perintah, diikuti **<TAB>:
| Konteks | Contoh | Kandidat |
|---|---|---|
| File | vim **<TAB> | File di bawah direktori kerja |
| Direktori | cd **<TAB> | Direktori |
| Proses | kill -9 **<TAB> | Daftar proses berjalan |
| Host SSH | ssh **<TAB> | Host dari ~/.ssh/config & known_hosts |
| Variabel lingkungan | unset **<TAB> | Nama variabel env |
| Alias | unalias **<TAB> | Alias shell yang terdefinisi |
| Perintah | man **<TAB> | Nama perintah yang tersedia |
cd **<TAB>Ini versi completion dari ALT-C: kandidatnya direktori, hasilnya path yang siap dipakai perintah. Untuk file, cukup ganti konteks perintahnya — fzf menebak apakah yang dibutuhkan file atau direktori dari perintah di depannya.
kill -9 **<TAB>Contoh paling disukai: mengetik kill -9 **<TAB> menampilkan daftar proses dengan PID-nya, pilih satu secara fuzzy, dan fzf menyisipkan PID-nya — bukan nama prosesnya. Tidak perlu menjalankan ps aux dulu untuk mencari PID.
ssh **<TAB>Completer ini membaca ~/.ssh/config dan known_hosts, sehingga host seperti web-prod-01 bisa dipilih tanpa mengetik nama lengkap. Ini sangat berharga jika kalian mengelola banyak server.
unset **<TAB>Setiap konteks punya logika kandidat sendiri: unset menampilkan env vars, unalias menampilkan alias, man menampilkan perintah yang terdaftar di $PATH. Yang membedakan bukan sintaksnya — selalu **<TAB> — melainkan apa yang script integrasi kirim sebagai kandidat.
Tip
Jangan menghafal daftar di atas. Pola berpikirnya: apa pun yang bisa dilengkapi dengan TAB biasa bisa dilengkapi secara fuzzy dengan **<TAB>. Jika kandidat yang muncul terasa tidak cocok, ingat bahwa FZF_COMPLETION_OPTS bisa mengatur perilaku semua completion sekaligus — misalnya menambah preview: export FZF_COMPLETION_OPTS="--preview='head -50 {}'".
Dua variabel mengatur perilaku completion secara global:
| Variabel | Fungsi | Default |
|---|---|---|
FZF_COMPLETION_TRIGGER | Karakter pemicu | ** |
FZF_COMPLETION_OPTS | Opsi default untuk semua completion | kosong |
FZF_COMPLETION_OPTS bekerja seperti FZF_DEFAULT_OPTS tapi khusus invocation completion. Kalian bisa menambah preview, layout, atau keybinding hanya untuk mode completion tanpa memengaruhi pemakaian fzf lainnya:
export FZF_COMPLETION_OPTS="--height=30% --preview='head -20 {}'"Kekuatan penuh completion muncul saat kalian menambahkan kandidat data sendiri. Script integrasi mendefinisikan helper _fzf_complete yang dipanggil dari fungsi completer bernama _fzf_complete_<perintah>.
Struktur dasarnya sama untuk bash dan zsh:
_fzf_complete_todo() {
_fzf_complete -- "$@" < <(
grep '^@' "$HOME/todo.txt"
)
}
complete -F _fzf_complete_todo -o bashdefault -o default todoDengan definisi di atas, mengetik todo **<TAB> menampilkan semua baris yang diawali @ dari todo.txt, dipilih secara fuzzy, lalu disisipkan ke baris perintah. Mari bedah bagian-bagiannya:
_fzf_complete_todo — nama fungsi wajib mengikuti pola _fzf_complete_<perintah> agar dipanggil otomatis._fzf_complete -- "$@" — memanggil helper inti; -- "$@" meneruskan argumen baris perintah yang sedang diketik (bisa untuk --query, --multi, dsb).< <(...) — process substitution mengirim kandidat ke stdin fzf tanpa memodifikasi environment.complete -F (bash) / compdef (zsh) — mendaftarkan completer untuk perintah todo.Kandidat yang kalian kirim menentukan apa yang bisa dipilih — dan juga apa yang disisipkan. Kalau ingin menyisipkan sesuatu yang berbeda dari yang ditampilkan, gunakan --accept-nth (episode 6) di dalam pemanggilan _fzf_complete:
_fzf_complete_kill_byservice() {
_fzf_complete --accept-nth=1 -- "$@" < <(
systemctl list-units --type=service --no-legend | awk '{print $1, $5}'
)
}
complete -F _fzf_complete_kill_byservice -o bashdefault -o default kill-byserviceDi sini list menampilkan nama.service deskripsi, tetapi yang disisipkan hanya field pertama (--accept-nth=1) — kandidat praktis untuk diteruskan ke perintah selanjutnya.
Note
Custom completer hidup di config shell, bukan di fzf. Karena itu mereka juga mengikuti prinsip episode 8: definisikan sebelum baris integrasi dimuat, dan reload shell setelah mengubahnya. Untuk data yang berubah sering, pertimbangkan memakai find, rg, atau sed di dalam kandidat agar selalu segar saat **<TAB> ditekan.
Episode 9 ini menghidupkan sisi "pelengkap perintah" dari fzf: pemicu **<TAB> untuk completion berbasis fuzzy, completer bawaan untuk file, direktori, proses, host SSH, env vars, alias, dan perintah, pengaturan global lewat FZF_COMPLETION_TRIGGER dan FZF_COMPLETION_OPTS, serta custom completer dengan helper _fzf_complete.
Inti yang harus dibawa pulang:
**<TAB> di tengah perintah untuk memicu completion fuzzy.kill -9 **<TAB>, ssh **<TAB>, cd **<TAB>, unset **<TAB> adalah contoh paling produktif._fzf_complete_<perintah> + complete -F (bash) atau compdef (zsh).Di episode 10, kita akan membangun salah satu fitur yang membuat fzf terasa "hidup": preview window — jendela kedua yang menampilkan isi file, gambar, hingga hasil perintah secara real-time saat kalian menavigasi daftar. Sampai jumpa di episode 10!