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.

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.
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:
| Pola | Contoh | Makna |
|---|---|---|
| Fuzzy (default) | fzf | Karakter berurutan, boleh berselang |
| Exact | 'fzf | Karakter persis berurutan, tanpa celah |
| Prefix | ^learn | Item harus diawali learn |
| Suffix | .md$ | Item harus diakhiri .md |
| Invert | !test | Item 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.
printf "server-prod.conf\nserver-staging.conf\ndb-prod.yaml\ndb-dev.yaml\nnotes.md\nREADME.md\n" | fzfCoba 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.
Selain kelima pola dasar, ada satu lagi yang wajib diketahui: OR. Simbol | di dalam query berarti "cocok dengan salah satu".
| Pola | Contoh | Makna |
|---|---|---|
| OR | prod | dev | Item 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.
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:
| Opsi | Arti |
|---|---|
-i / --ignore-case | Selalu abaikan perbedaan huruf besar-kecil |
-I / --no-ignore-case | Selalu hormati perbedaan huruf besar-kecil |
printf "Server\nserver\nSERVER\n" | fzf -i
printf "Server\nserver\nSERVER\n" | fzf -IDengan -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.
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).
printf "learn-fzf\nlxfzf\nfzf\n" | fzf --exactPada 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.
Setiap item yang cocok diberi skor, dan fzf mengurutkan hasil dari skor tertinggi. Beberapa faktor menaikkan skor:
fzf di dalam fzf nilainya jauh lebih tinggi daripada fzf yang terpencar di lxfzf atau lear-f-f-z.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:
| Opsi | Karakteristik |
|---|---|
--algo=v2 | Algoritma modern (default); urutan hasil lebih intuitif dan konsisten |
--algo=v1 | Algoritma lama dari versi awal; untuk kompatibilitas dan perilaku klasik |
printf "fzf.md\nfz.md\nfzf\n" | fzf --algo=v2
printf "fzf.md\nfz.md\nfzf\n" | fzf --algo=v1Dengan 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.
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:
', ^, $, !, | langsung berfungsi.'term = exact, ^term = awalan, term$ = akhiran, !term = kecualikan, a \| b = salah satu.-i/-I untuk kontrol eksplisit.--exact mematikan fuzzy untuk seluruh query.--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!