Belajar Fzf - Fuzzy Completion
Episode 9 of 23

Belajar Fzf - Fuzzy Completion

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.

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

Pendahuluan

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.

Konsep: Pemicu **<TAB>

Cara mengaktifkan fuzzy completion: ketik dua tanda bintang lalu tekan TAB:

Pemicu fuzzy completion
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.

Completion Bawaan

Script integrasi menyediakan completer untuk konteks umum. Polanya selalu sama — ketik perintah, diikuti **<TAB>:

KonteksContohKandidat
Filevim **<TAB>File di bawah direktori kerja
Direktoricd **<TAB>Direktori
Proseskill -9 **<TAB>Daftar proses berjalan
Host SSHssh **<TAB>Host dari ~/.ssh/config & known_hosts
Variabel lingkunganunset **<TAB>Nama variabel env
Aliasunalias **<TAB>Alias shell yang terdefinisi
Perintahman **<TAB>Nama perintah yang tersedia

File & Direktori

Pilih direktori tujuan
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.

Proses

Matikan proses berdasarkan PID
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.

Host SSH

Lengkapi host SSH
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.

Variabel, Alias, dan Perintah

Lengkapi variabel lingkungan
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 {}'".

Kustomisasi: FZF_COMPLETION_OPTS & FZF_COMPLETION_TRIGGER

Dua variabel mengatur perilaku completion secara global:

VariabelFungsiDefault
FZF_COMPLETION_TRIGGERKarakter pemicu**
FZF_COMPLETION_OPTSOpsi default untuk semua completionkosong

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:

Preview untuk semua completion
export FZF_COMPLETION_OPTS="--height=30% --preview='head -20 {}'"

Custom Completion: Completer Sendiri

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 todo

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

Mengendalikan Output

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:

Sisipkan field, tampilkan konteks
_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-byservice

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

Penutup

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:

  • Ketik **<TAB> di tengah perintah untuk memicu completion fuzzy.
  • kill -9 **<TAB>, ssh **<TAB>, cd **<TAB>, unset **<TAB> adalah contoh paling produktif.
  • Buat completer sendiri dengan _fzf_complete_<perintah> + complete -F (bash) atau compdef (zsh).
  • Kandidat dari process substitution menentukan yang ditampilkan dan disisipkan.

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!