Menggabungkan fzf dengan fd untuk pencarian file cepat yang menghormati .gitignore, dan dengan ripgrep untuk pencarian isi, menghasilkan workflow pencarian file dan teks yang presisi dan instan.

Preview window episode 10 menampilkan isi file; episode 11 memastikan file yang ditampilkan pantas ditampilkan. Kita akan menggabungkan fzf dengan dua alat yang lahir dari ekosistem yang sama: fd (pencarian file) dan ripgrep (pencarian teks). Mulai dari baris yang akan menjadi kebiasaan: fd --type f.
Kenapa dua alat lagi? Karena fzf hanyalah filter — ia sebaik mungkin dengan input yang diberikan, tapi kualitas input menentukan hasil. find bawaan lambat, berisik (ikut menyertakan node_modules, .git), dan tidak memahami .gitignore. fd dan rg menyelesaikan tiga masalah itu sekaligus, dan keduanya menulis output yang "ramah fzf".
Tiga alat ini bukan pesaing, melainkan rantai produksi dengan tugas berbeda:
| Alat | Tugas | Analogi |
|---|---|---|
fd | Menemukan file berdasarkan nama | Resepsionis yang tahu di mana barang disimpan |
rg | Menemukan baris berdasarkan isi | Peneliti yang mencari kata dalam dokumen |
fzf | Menyajikan hasil interaktif | Kasir yang menyerahkan pilihan ke kalian |
Setiap alat melakukan satu hal dengan sangat baik, dan gabungannya lebih cepat serta lebih presisi daripada find | grep | fzf yang asal-asalan.
.gitignorefd adalah alternatif find yang ditulis Rust: hasilnya menghormati .gitignore secara default dan cepat karena dijalankan paralel. Ini membuatnya sumber data ideal untuk FZF_DEFAULT_COMMAND (episode 8):
export FZF_DEFAULT_COMMAND="fd --type f"Sekarang fzf yang dijalankan tanpa pipe, CTRL-T, dan fuzzy completion file — semuanya memakai daftar file dari fd yang bersih: tanpa node_modules, tanpa .git, tanpa folder build, kecuali dinyatakan lain. Ini perubahan yang langsung terasa di repositori besar.
| Opsi | Fungsi |
|---|---|
--type f / -t f | Hanya file |
--type d / -t d | Hanya direktori |
--hidden / -H | Ikut sertakan file tersembunyi (dotfiles) |
--exclude / -E | Kecualikan pola tertentu |
--no-ignore | Abaikan aturan .gitignore |
--extension / -e | Filter berdasarkan ekstensi |
Kombinasi khas untuk mencari semua file termasuk dotfiles tapi tetap menghormati gitignore:
fd --type f --hidden --exclude node_modulesNote
Perbedaan kunci dengan find: fd menghormati .gitignore secara default, sementara find tidak pernah. Untuk daftar file yang akrab di repositori git, default fd hampir selalu yang kalian inginkan. Gunakan --no-ignore hanya ketika kalian sengaja ingin melihat yang "dibuang" git.
Ketika daftar file berasal dari fd, preview window episode 10 jadi pelengkap sempurna: list bersih dari fd, isi dari bat. Simpan keduanya di FZF_DEFAULT_OPTS agar konsisten di seluruh invocation:
export FZF_DEFAULT_COMMAND="fd --type f"
export FZF_DEFAULT_OPTS="--preview='bat --color=always --style=numbers --line-range=:200 {}'"Sekarang menekan CTRL-T menampilkan daftar file bersih, dan setiap file yang disorot langsung diperlihatkan isinya. Ini sudah workflow yang layak dipakai sehari-hari.
rg (ripgrep) adalah grep modern: cepat, menghormati .gitignore, dan mendukung regex. Ia dua peran dalam workflow fzf — sebagai pencari (menghasilkan daftar file yang berisi pola) dan sebagai previewer (menampilkan baris yang cocok).
Untuk mencari file mana saja yang mengandung kata tertentu, gunakan rg -l (files-with-matches):
rg -l 'TODOFIX' | fzfHasil rg -l adalah daftar path — format yang persis dikonsumsi fzf. Setiap file yang disorot lalu bisa diintip isinya dengan preview:
rg -l 'TODOFIX' | fzf --preview 'bat --color=always {}'rg juga sempurna di dalam --preview — memanfaatkan placeholder {q} dari episode 10 untuk pencarian isi yang mengikuti query:
fzf --preview 'rg --color=always -C 3 {q} {}' --ansiSaat kalian mengetik, rg mencari {q} di dalam file yang disorot dan menampilkan 3 baris konteks di atas/bawah kecocokan. Ini menciptakan preview "search-in-search": list adalah file, preview adalah baris yang cocok.
Tip
Untuk membatasi preview agar tidak menguras kinerja pada file raksasa, kombinasikan dengan --line-range di bat atau gunakan --max-count 5 di rg sehingga hanya beberapa kecocokan pertama yang diproses.
Semua komponen siap — kini mari rakit satu setup utuh. Satu baris kunci: FZF_DEFAULT_OPTS bisa menampung --bind untuk reload, sehingga pencarian isi dilakukan rg (bukan fuzzy fzf) saat query berubah.
# ---------- Sumber data: fd ----------
export FZF_DEFAULT_COMMAND="fd --type f --hidden --exclude node_modules"
# ---------- Opsi global + preview bat ----------
export FZF_DEFAULT_OPTS="--height=40% --layout=reverse --border \
--preview='bat --color=always --style=numbers --line-range=:200 {}' \
--bind='ctrl-r:reload(rg -l {q} || true)'"
# ---------- Opsi per keybinding ----------
export FZF_CTRL_T_OPTS="--preview='bat --color=always {}'"
export FZF_CTRL_R_OPTS="--scheme=history --sort"
# ---------- Muat integrasi shell ----------
eval "$(fzf --bash)"Mari bedah bagian --bind yang baru: ctrl-r:reload(rg -l {q} || true) menginstruksikan fzf — saat CTRL-R ditekan di dalam fzf — untuk memuat ulang daftar item menggunakan rg -l {q}. Dengan kata lain: ketik query, tekan CTRL-R, dan list berubah menjadi file-file yang isinya cocok dengan query; || true mencegah error saat tidak ada kecocokan.
Important
Inilah inti integrasi: fd untuk menebak nama file, rg untuk menebak isi, bat untuk menampilkan, dan fzf sebagai pengendali. Tidak ada satupun yang paling penting — masing-masing menutupi kelemahan yang lain. Jika query kosong, rg -l '' akan mengembalikan semua file; || true di atas membuat reload tetap aman dalam kasus tersebut.
Episode 11 ini menyatukan fzf dengan ekosistem pencariannya: fd sebagai sumber file yang menghormati .gitignore (dengan --hidden/--exclude), rg sebagai pencari dan previewer isi, dan bat sebagai perender — dirakit dalam FZF_DEFAULT_COMMAND dan FZF_DEFAULT_OPTS plus bind reload.
Inti yang harus dibawa pulang:
FZF_DEFAULT_COMMAND="fd --type f" memberi fzf daftar file bersih dan cepat.rg -l 'pola' | fzf menemukan file berdasarkan isi.rg {q} {} dan bind reload(rg -l {q}) menciptakan pencarian isi interaktif.Di episode 12, kita akan membawa fzf ke lapisan yang berbeda: integrasi dengan tmux & zellij — menjalankan fzf di dalam session terminal multiplexer, floating pane, dan keybinding lintas pane. Sampai jumpa di episode 12!