Belajar Fzf - Fuzzy Matching & Search Modes
Episode 3 of 23

Belajar Fzf - Fuzzy Matching & Search Modes

Menguasai bahasa pola pencarian fzf: fuzzy default, exact, prefix, suffix, invert, dan OR, ditambah kontrol case serta cara memahami skor dan urutan hasil dengan algoritma v1 dan v2.

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

Pendahuluan

Setelah di episode 2 kita membedah arsitektur fzf — model stdin filter stdout, subsequence matching, dan exit code — sekarang saatnya menguasai alat yang paling sering kalian pakai setiap hari: bahasa pola pencarian. Episode ini adalah jantung dari "merasa cepat" dengan fzf: begitu pola-pola ini melekat, kalian tidak akan lagi mengetik ulang path lengkap atau memelototi daftar panjang.

Konsep kuncinya satu: fzf modern memiliki extended search yang aktif secara default. Artinya, simbol tertentu di awal kata yang kalian ketik mengubah makna pola. Kalian tidak perlu menghafal menu — cukup ketik pola, dan fzf memahami maksudnya.

Lima Pola Pencarian Dasar

Setiap query yang kalian ketik ke fzf bisa mengandung beberapa "kata", dan setiap kata bisa diberi makna khusus lewat simbol. Lima pola berikut adalah fondasinya:

PolaContohMakna
Fuzzy (default)fzfKarakter berurutan, boleh berselang
Exact'fzfKarakter persis berurutan, tanpa celah
Prefix^learnItem harus diawali learn
Suffix.md$Item harus diakhiri .md
Invert!testItem harus tidak mengandung test

Bandingkan dua pola pertama: dengan fzf (fuzzy), item learn-fzf cocok — begitu juga fzf.md. Tapi dengan 'fzf (exact), item harus memuat huruf f, z, f secara berurutan tanpa celah — fzf.md tetap cocok, sementara lxfzf tidak. Inilah perbedaan mendasar antara "boleh berselang" dan "harus rapat".

Pola prefix dan suffix sangat berguna untuk mempersempit daftar secara drastis. Ketik ^docker jika kalian hanya ingin item yang dimulai docker, atau config$ jika hanya yang diakhiri config. Sedangkan invert adalah "filter penolak": !test menghapus semua item yang mengandung test dari daftar — sangat berguna untuk menyembunyikan file yang tidak relevan.

Dataset kecil untuk berlatih pola
printf "server-prod.conf\nserver-staging.conf\ndb-prod.yaml\ndb-dev.yaml\nnotes.md\nREADME.md\n" | fzf

Coba kombinasi: ketik prod (fuzzy biasa), lalu ^db (hanya item berawalan db), lalu !yaml (kecualikan semua file yaml). Perhatikan bagaimana daftar menyusut secara bertahap — itulah cara kalian berkomunikasi dengan fzf setiap hari.

Pola OR: Menggabungkan dengan Garis Miring

Selain kelima pola dasar, ada satu lagi yang wajib diketahui: OR. Simbol | di dalam query berarti "cocok dengan salah satu".

PolaContohMakna
ORprod | devItem cocok dengan prod atau dev

Pada dataset di atas, query prod | dev menampilkan kelima file (semua mengandung salah satu kata). Perlu diingat: pola OR baru aktif jika kalian menggunakan extended search. Jika di-disable dengan --no-extended, simbol | diperlakukan sebagai karakter biasa.

Note

Perhatikan juga bahwa simbol ^, $, dan ! hanya dianggap sebagai penanda pola jika extended search aktif (default) dan simbol tersebut berada di awal kata dalam query. Di tengah kata, simbol-simbol ini diperlakukan sebagai karakter biasa — jadi file! akan mencari string file! secara fuzzy, bukan mengecualikan sesuatu.

Kontrol Case: Huruf Besar dan Kecil

Perilaku huruf besar/kecil fzf mengikuti prinsip smart-case: secara default, fzf mengabaikan perbedaan huruf besar-kecil selama query kalian seluruhnya huruf kecil. Begitu query mengandung huruf besar, pencocokan menjadi peka huruf besar-kecil. Ini masuk akal: kalian mengetik server inginnya semua, tapi mengetik Server biasanya memang menginginkan persis Server.

Dua opsi mengendalikan perilaku ini secara eksplisit:

OpsiArti
-i / --ignore-caseSelalu abaikan perbedaan huruf besar-kecil
-I / --no-ignore-caseSelalu hormati perbedaan huruf besar-kecil
Mengatur perilaku case
printf "Server\nserver\nSERVER\n" | fzf -i
printf "Server\nserver\nSERVER\n" | fzf -I

Dengan -i, query server akan mencocokkan ketiganya. Dengan -I, hanya server yang cocok. Pilihan yang paling umum di dunia nyata: biarkan smart-case default, dan gunakan -i hanya jika daftar kalian dipenuhi singkatan huruf kapital.

Exact Search Global: Opsi --exact

Selain pola 'term per kata, fzf menyediakan --exact untuk mengubah perilaku seluruh query. Dengan --exact, fuzzy matching dimatikan dan semua kata diperlakukan sebagai pencarian exact (karakter rapat berurutan, tanpa celah).

Mode exact global
printf "learn-fzf\nlxfzf\nfzf\n" | fzf --exact

Pada contoh di atas, query fzf di mode exact hanya mencocokkan item yang memuat huruf f, z, f secara berurutan tanpa celah — learn-fzf dan fzf cocok, lxfzf tidak. Mode ini berguna untuk daftar yang panjangnya pendek, seperti daftar branch atau tag, di mana kecocokan fuzzy terlalu longgar dan sering menampilkan hasil yang tidak diinginkan.

Skor dan Urutan Hasil

Setiap item yang cocok diberi skor, dan fzf mengurutkan hasil dari skor tertinggi. Beberapa faktor menaikkan skor:

  • Karakter bersebelahanfzf di dalam fzf nilainya jauh lebih tinggi daripada fzf yang terpencar di lxfzf atau lear-f-f-z.
  • Karakter di awal kata — kecocokan yang menyentuh awal kata atau awal item dihargai lebih.
  • Awalan item — item yang diawali dengan query cenderung naik ke atas.
  • Panjang item — untuk skor yang sama, item yang lebih pendek biasanya diutamakan.

Akibatnya, urutan hasil fzf hampir selalu "yang paling masuk akal di atas" — bukan urutan asli daftar. Ini perilaku yang bagus, tapi penting disadari, karena pengguna pemula sering bingung melihat daftar berubah urutan saat mereka mengetik.

Urutan ini juga ditentukan oleh algoritma skor yang dipilih. Fzf menyediakan dua generasi melalui --algo:

OpsiKarakteristik
--algo=v2Algoritma modern (default); urutan hasil lebih intuitif dan konsisten
--algo=v1Algoritma lama dari versi awal; untuk kompatibilitas dan perilaku klasik
Membandingkan algoritma skor
printf "fzf.md\nfz.md\nfzf\n" | fzf --algo=v2
printf "fzf.md\nfz.md\nfzf\n" | fzf --algo=v1

Dengan query fzf, perhatikan bagaimana posisi relatif fzf.md dan fz.md bisa berbeda antara v1 dan v2. Aturan praktisnya: biarkan --algo=v2 sebagai default, dan hanya turun ke v1 jika kalian punya alasan kuat — misalnya hasil yang sudah dihafal dari versi lama.

Penutup

Pada episode 3 ini, kalian telah menguasai bahasa pola pencarian fzf: fuzzy (default), exact dengan ', prefix dengan ^, suffix dengan $, invert dengan !, dan OR dengan |. Kalian juga memahami kontrol case (-i/-I dan smart-case), mode exact global --exact, serta bagaimana skor dan --algo menentukan urutan hasil.

Inti yang harus dibawa pulang:

  • Extended search aktif secara default — ', ^, $, !, | langsung berfungsi.
  • 'term = exact, ^term = awalan, term$ = akhiran, !term = kecualikan, a \| b = salah satu.
  • Smart-case default; gunakan -i/-I untuk kontrol eksplisit.
  • --exact mematikan fuzzy untuk seluruh query.
  • Hasil diurutkan oleh skor relevansi, dan --algo=v1/v2 mengubah perilaku skor.

Di episode 4 selanjutnya, kita akan mengubah tampilan fzf menjadi milik kalian: UI & layout interaktif — height, layout, border, margin, padding, info line, hingga kustomisasi prompt, pointer, marker, header, dan warna. Sampai jumpa di episode 4!