Menelusuri perjalanan fzf dari plugin Vim yang ditulis Junegunn Choi pada 2013 hingga menjadi standar de-facto fuzzy finder yang ditulis dalam Go, serta memahami masalah nyata yang dipecahkannya dan ekosistem besar yang tumbuh di sekitarnya.

Setelah di episode 0 kita menyiapkan environment — memastikan fzf --version menampilkan 0.74.x dan tools pendukung siap dipakai — pada episode ini kita akan menarik napas sejenak dari hands-on dan memahami mengapa fzf ada. Sejarah dan latar belakang sebuah tool mungkin terasa tidak penting, padahal justru di sanalah letak alasan mengapa desainnya seperti sekarang.
Mengapa harus memahami sejarah fzf? Karena fzf bukan lahir dari ruang rapat perusahaan, melainkan dari sebuah kebutuhan pribadi yang sangat konkret: "bagaimana cara mencari file dengan cepat tanpa meninggalkan Vim?" Memahami asal-usulnya akan menjelaskan banyak keputusan desain — mengapa fzf berbasis pipeline, mengapa ia begitu cepat, dan mengapa hingga hari ini ia menjadi pilihan pertama jutaan developer dan sysadmin.
Cerita fzf dimulai di tangan seorang developer asal Korea bernama Junegunn Choi. Pada tahun 2013, Junegunn sedang merasa frustrasi dengan cara mencari file di dalam Vim. Editor teks ini terkenal efisien, tapi pencarian file masih bergantung pada plugin yang berat atau perintah yang kaku. Maka, seperti kebiasaan engineer yang baik, ia menulis solusi kecilnya sendiri: sebuah plugin fuzzy finder untuk Vim yang kemudian dinamai fzf — singkatan dari fuzzy finder.
Awalnya fzf hanyalah plugin Vim. Namun prinsip desainnya sejak hari pertama sudah berbeda dari plugin lain: segalanya berbasis pipeline. Pengguna bisa memberi fzf daftar apa pun — file, buffer, tag — dan fzf akan menampilkannya untuk difilter secara interaktif. Prinsip inilah yang kemudian membuat fzf melampaui batas Vim, dan pada tahun 2015 proyek ini ditulis ulang dalam Go sebagai program CLI mandiri.
Note
Jangan tertukar: fzf adalah kependekan dari fuzzy finder, bukan singkatan lain. Versi awal yang ditulis dalam bahasa Vim script hanya bertahan sampai sekitar versi 0.9-an; sejak versi Go dirilis pada 2015, fzf menjadi binary standalone yang bisa dipakai di shell mana pun — bukan hanya di dalam Vim.
Keputusan menulis ulang fzf dari Vim script menjadi Go bukan tanpa alasan. Ada tiga masalah yang hanya bisa diselesaikan dengan bahasa yang lebih "serius":
Keputusan ini juga yang menjelaskan mengapa fzf --version hanya butuh beberapa milidetik untuk dijalankan dan mengapa fzf bisa menyaring jutaan baris log tanpa melambat — dua hal yang menjadi standar kualitas di episode-episode berikutnya.
Inti masalah yang dipecahkan fzf sangat sederhana untuk diucapkan, tetapi menyebalkan jika dikerjakan manual: memilih satu item dari daftar panjang dengan cara mengetik pola parsial.
| Skenario | Daftar Item | Tanpa Fzf |
|---|---|---|
| Membuka file | Ratusan file di proyek | Mengetik path lengkap atau klik sana-sini |
| Menjalankan proses | Puluhan proses berjalan | Membaca ps lalu menyalin PID |
| Mengisi branch | Ratusan branch git | Menghafal nama branch yang panjang |
| Mencari riwayat | Ribuan baris history | Mengetik ulang perintah yang sama |
| Mencari isi file | Ribuan baris log | grep lalu membuka file satu per satu |
Ambil analogi kontak di ponsel: kalian tidak pernah menelusuri 500 kontak satu per satu. Kalian mengetik sebagian nama — misalnya "jun" — dan daftar langsung menyusut. Itulah filosofi dasar fuzzy finder yang sama: ketik sedikit, dapatkan yang kalian maksud. Fzf membawa filosofi itu ke terminal, di mana daftarnya bisa berisi apa saja.
Perbedaan paling mendasar antara fzf dan alat pencarian klasik adalah interaktivitas. grep adalah filter non-interaktif: ia membaca baris, mencocokkan pola, mencetak hasil, lalu selesai — kalian tidak bisa memilih hasilnya.
ls | grep configBandingkan dengan fzf: alih-alih mencetak semua hasil sekaligus, fzf menampilkan antarmuka interaktif yang memperbarui hasil setiap kali kalian mengetik. Setiap karakter yang kalian ketik memfilter daftar secara real-time, sampai satu item yang diinginkan tertinggal. Saat itulah kalian menekan Enter, dan fzf mencetak item terpilih ke stdout — menjadi input bagi perintah berikutnya.
ls | fzfInilah jawaban atas pertanyaan yang sering muncul: "bukankah grep sudah bisa mencari? Kenapa masih ada fzf?" grep menjawab pertanyaan "baris mana yang cocok?" sementara fzf menjawab "item mana yang kalian inginkan?" Fzf bukan pengganti grep — ia penerus dari hasil grep atau find, yang mengubah daftar menjadi menu pilihan yang hidup.
Fzf bukan satu-satunya fuzzy finder di ekosistem terminal. Beberapa proyek lain mencoba hal serupa, dan memahami posisinya membantu kalian menghargai pilihan desainnya:
| Proyek | Bahasa | Status & Karakteristik |
|---|---|---|
skim | Rust | Paling mirip fzf; target sebagai pengganti drop-in, dengan fokus performa |
peco | Go | Sederhana dan stabil, banyak dipakai untuk filtering sederhana |
percol | Perl | Generasi awal yang menginspirasi; kini jarang dirawat |
pick | Haskell | Antar muka berbeda dengan pendekatan menu terpisah |
fzy | C | Lebih dikenal sebagai pustaka skoring fuzzy daripada tool lengkap |
fzf | Go | Kombinasi kecepatan, fitur, dan ekosistem terlengkap |
Yang membedakan fzf dari yang lain adalah cakupan fitur dan ekosistemnya: preview window, multi-select, custom keybindings, HTTP API, hingga integrasi dengan puluhan tool lain. Banyak proyek seperti skim justru lahir sebagai upaya meniru fzf — itu bukti betapa kuatnya desain dasarnya.
Seiring waktu, fzf tumbuh dari sekadar tool menjadi fondasi yang dipakai banyak perangkat lunak lain. Daftar berikut hanya sebagian kecil dari yang memanfaatkannya:
Kehadiran fzf-go adalah lompatan terpenting: fzf bukan hanya program, tapi juga API. Kalian bisa memakai mesin skoring dan filtering-nya di dalam aplikasi sendiri — model yang membuat fzf tetap relevan jauh melampaui sekadar tool baris perintah. Inilah yang dimaksud dengan "standar de-facto": sebuah tool yang diandalkan orang lain untuk dibangun di atasnya.
rg --files | fzf --preview 'bat --color=always {}'Baris di atas merangkum ekosistemnya dalam satu contoh: rg menyiapkan daftar, bat menghidupkan preview berwarna, dan fzf menjadi jembatan interaktif di antaranya. Masing-masing tool melakukan satu hal dengan baik, dan fzf menyatukannya.
Pada episode 1 ini, kalian telah menelusuri perjalanan fzf dari sebuah plugin Vim pada 2013 — ditulis Junegunn Choi untuk mempercepat pencarian file — hingga menjadi fuzzy finder Go yang menjadi standar de-facto ekosistem terminal. Kalian juga memahami masalah yang dipecahkannya, perbedaannya dengan grep, perbandingannya dengan finder lain, dan ekosistem yang tumbuh di sekitarnya.
Inti yang harus dibawa pulang:
grep memfilter; fzf memfilter sekaligus memilih — interaktif dan real-time.skim, peco, percol, dan lainnya, fzf menang karena fitur dan ekosistemnya.Di episode 2 selanjutnya, kita akan membedah konsep dasar dan arsitektur utama fzf — model stdin -> filter -> stdout yang menjadi jiwanya, cara kerja fuzzy matching berbasis subsequence dan skor relevansi, bahasa exit code, serta anatomi komponen antarmukanya. Sampai jumpa di episode 2!