Membawa fzf ke jantung workflow pengembangan: integrasi di Neovim lewat fzf.vim, fzf-lua, dan telescope.nvim, serta pola fuzzy di VS Code. Termasuk tools pendamping seperti zoxide untuk navigasi, gh CLI untuk repo dan PR, lazygit, dan kombinasi bat dengan delta untuk preview yang hidup.

Di episode 19 kalian melihat ke mana fzf berkembang selama seri 0.70-0.74. Episode 20 ini menggeser fokus: bukan lagi fzf berdiri sendiri, melainkan fzf sebagai anggota ekosistem developer. Kalian akan belajar menempatkannya di dalam editor dan menggandengkannya dengan tools yang membentuk alur kerja harian — dari berpindah file, mencari kode, menavigasi direktori, memilih PR, sampai menilik diff.
Bayangkan fzf sebagai jantung yang tidak pernah terlihat: ia tidak tampil dalam daftar fitur editor, tetapi denyutnya terasa di mana-mana — pemilih file, pemilih buffer, pemilih command, semuanya berdetak dengan pola fuzzy. Episode ini membuat detak itu disadari dan dikendalikan, bukan hanya dinikmati.
Episode ini membahas integrasi Neovim (fzf.vim, fzf-lua, telescope.nvim), pola fuzzy di VS Code, lalu empat pendamping penting: zoxide untuk navigasi cerdas, gh CLI untuk repo dan PR, lazygit untuk git yang ramah, dan kombinasi bat dengan delta untuk preview yang hidup.
fzf lahir dari kebutuhan mencari file di Vim, jadi tak heran integrasi terbaiknya ada di keluarga Vim. fzf.vim adalah plugin resmi dari pembuat fzf yang menambahkan perintah-perintah fuzzy di dalam Neovim. Pemasangannya paling mudah lewat vim-plug:
Plug 'junegunn/fzf', { 'do': { -> fzf#install() } }
Plug 'junegunn/fzf.vim'Setelah terpasang dan di-:source ulang, perintah-perintah kunci langsung tersedia:
| Perintah | Fungsi |
|---|---|
:Files | Mencari file di bawah direktori kerja |
:Rg | Mencari isi kode lewat ripgrep, hasilnya masuk fzf |
:Buffers | Berpindah antar buffer yang terbuka |
:History | Menelusuri history perintah Vim |
:Windows | Berpindah antar window |
Kekuatan fzf.vim ada pada kesederhanaannya: setiap perintah memanfaatkan fzf binary yang sudah terpasang, sehingga perilakunya identik dengan fzf di terminal — termasuk opsi --preview yang bisa diteruskan lewat variabel konfigurasi.
let g:fzf_preview_window = ['up:60%', 'ctrl-/']
command! -bang -nargs=* Rg
\ call fzf#vim#grep('rg --column --line-number --no-heading --color=always '.shellescape(<q-args>), 1, <bang>0)Note
fzf.vim memanggil fzf binary di luar proses editor — itu sebabnya pemasangan junegunn/fzf dengan fzf#install() menjadi bagian dari snippet di atas. Jika kalian sudah memasang fzf lewat package manager sistem, baris itu boleh dilewati. Yang penting: binary fzf harus bisa ditemukan di $PATH Neovim.
Jika kalian lebih nyaman dengan Lua dan konfigurasi yang eksplisit, fzf-lua adalah pilihan modern. Ia ditulis murni dalam Lua, memakai fzf binary sebagai backend, dan menawarkan banyak preset pemilih — file, buffer, git status, LSP symbols, hingga ripgrep. Konfigurasi dasarnya sangat singkat:
local fzf_lua = require('fzf-lua')
fzf_lua.setup({})
vim.keymap.set('n', '<C-p>', function()
fzf_lua.files()
end, { desc = 'Cari file dengan fzf' })Keunggulan fzf-lua dibanding fzf.vim: hasil pencarian bisa dikustomisasi per pemilih, memakai fzf sebagai backend sekaligus tetap memanfaatkan previewer.builtin yang mengerti file, git, dan buffer. Ketika kalian membutuhkan "satu pemilih untuk setiap tugas" dengan kontrol halus, fzf-lua adalah kompromi terbaik antara kekuatan fzf dan ergonomi Neovim modern.
telescope.nvim adalah pemilih fuzzy paling populer di ekosistem Neovim. Ia tidak menggunakan fzf secara bawaan — scoring fuzzy-nya sendiri — tetapi telescope-fzf-native.nvim mengganti engine scoring-nya dengan implementasi fzf dalam C, memberi hasil yang jauh lebih cepat dan urutan yang lebih konsisten dengan fzf di terminal:
Plug 'nvim-lua/plenary.nvim'
Plug 'nvim-lua/telescope.nvim', { 'tag': '0.1.x' }
Plug 'nvim-telescope/telescope-fzf-native.nvim', { 'do': 'make' }require('telescope').setup {
extensions = {
fzf = { fuzzy = true, override_generic_sorter = true }
},
}
require('telescope').load_extension('fzf')Perbedaan konseptualnya penting: di telescope, fzf bukan antarmuka — ia adalah mesin scoring di belakang layar. Antarmukanya tetap milik telescope; yang dipinjam adalah kecepatan dan urutan hasil ala fzf. Bagi kalian yang sudah menguasai fzf di terminal, pengalaman telescope akan terasa familiar karena hasilnya "berpikir" seperti fzf.
Tip
Bagaimana memilih di antara ketiganya? fzf.vim untuk integrasi paling dekat dengan fzf itu sendiri dan ketergantungan paling sedikit; fzf-lua untuk kontrol Lua yang halus per pemilih; telescope untuk ekosistem plugin terbesar (LSP, git, treesitter, dll.) dengan engine fzf sebagai akselerator. Tidak ada yang salah — pilih berdasarkan kebutuhan ekosistem, bukan karena tren.
VS Code tidak "menjalankan fzf" secara langsung, tetapi filosofi fuzzy-nya sudah tertanam di jantung editor: Quick Open (Ctrl+P) dan Command Palette (Ctrl+Shift+P) adalah pemilih fuzzy bawaan untuk file dan perintah. Extension di marketplace menambah cakupan — pencarian symbol, git branch, dan berbagai preset — dengan pola interaksi yang sama.
Di sisi lain, terminal terintegrasi VS Code bisa menjalankan fzf secara penuh. Ini pola yang sering terlewat: kombinasi rg + fzf di terminal VS Code untuk pekerjaan yang tidak dimiliki Quick Open — misalnya memilih branch lalu checkout, atau memilih file untuk di-diff:
git status --short | fzf --multi --preview 'git diff --color=always {}' |
awk '{print $2}' | xargs git diffPola ini menunjukkan satu prinsip: editor modern punya fuzzy bawaan, tetapi fzf tetap unggul ketika pilihan harus diproses lebih lanjut — dipipakan ke perintah lain, di-preview dengan bat, atau digabung dengan git.
Pindah ke pendamping di luar editor. zoxide adalah "smarter cd" — ia merekam direktori yang sering kalian kunjungi (frecency) dan membiarkan kalian lompat dengan sebagian nama. Yang membuatnya relevan dengan series ini: zoxide memiliki integrasi fzf bawaan. Dengan mode --cmd cd, ketika nama yang kalian ketik tidak cocok persis dengan satu direktori, zoxide membuka pemilih interaktif berbasis fzf untuk memilih dari kandidat:
eval "$(zoxide init --cmd cd zsh)"cd apic
cd fzfprojKombinasi zoxide + fzf adalah contoh terbaik fzf sebagai fallback interaktif: zoxide menangani kasus cepat (nama persis), fzf menangani kasus ragu (banyak kandidat). Dua lapisan yang saling melengkapi, bukan bersaing.
Tip
Jika kalian lebih suka memilih secara eksplisit, pipe hasilnya sendiri: zoxide query --list | fzf | xargs cd. Tetapi begitu mencoba mode --cmd cd, kalian akan merasakan keajaiban yang berbeda — tidak perlu mengetik perintah fzf sama sekali, cukup cd <sebagian-nama> dan pemilih muncul saat dibutuhkan.
gh — GitHub CLI — adalah pendamping berikutnya. Outputnya yang berbentuk tabel adalah bahan mentah sempurna untuk fzf: kolom pertama bisa diambil dengan awk lalu dieksekusi. Memilih repo lalu men-clone:
gh repo list --limit 100 | fzf --preview 'gh repo view {1} --json description -q .description' |
awk '{print $1}' | xargs gh repo cloneMemilih PR lalu checkout secara langsung:
gh pr list | fzf --preview 'gh pr view {1}' | awk '{print $1}' | xargs gh pr checkoutPola gh ... | fzf | awk '{print $1}' | xargs gh ... adalah idiom yang bisa diulang untuk hampir semua perintah gh: issues, releases, bahkan actions. Sekali kalian memahaminya, antarmuka fuzzy untuk seluruh GitHub menjadi tinggal mengetik.
lazygit adalah TUI git yang membuat operasi kompleks terasa ringan. Relevansinya dengan series ini: lazygit membawa pengalaman fuzzy finder ke dalam tampilannya sendiri — mencari file yang berubah, branch, atau commit tidak lagi mengetik nama, melainkan menyaring daftar secara interaktif dengan pola yang sama seperti fzf. Di layar status, tekan shortcut fuzzy find untuk langsung melompat ke file, dan dari sana staging, commit, dan push dilakukan dengan tombol tunggal.
Pendekatan lazygit dan fzf berbeda cara tetapi sejalan tujuan: mengurangi jarak antara niat dan eksekusi. fzf adalah blok bangunan di terminal; lazygit adalah aplikasi jadi yang mengadopsi filosofinya. Banyak engineer memakai keduanya — fzf untuk memilih apa pun di shell, lazygit ketika pekerjaan sudah jelas-jelas soal git.
Note
lazygit tidak menggantikan fzf — dan tidak dimaksudkan begitu. fzf tetap unggul ketika sumber data bisa berupa apa saja (file, proses, log, API); lazygit unggul ketika konteksnya sudah terikat pada git. Kenali batas masing-masing, dan kombinasikan: misalnya pakai fzf untuk memilih branch, lalu lanjutkan di lazygit untuk menyelesaikan pekerjaan git.
Terakhir, dua pager yang mengubah preview fzf dari teks polos menjadi kode berwarna. bat sudah kalian kenal sejak episode 0 sebagai cat dengan syntax highlighting. delta melengkapi dengan memformat git diff menjadi tampilan yang hidup — warna, nomor baris, dan hunks yang rapi:
git status --short | fzf --multi --preview 'git diff --color=always -- {2} | delta --color-only'fd -t f | fzf --preview 'bat --color=always --style=numbers {}'Gabungkan keduanya dengan gh: preview PR yang menampilkan diff berwarna membuat peninjauan code review terasa seperti bekerja di editor, padahal kalian hanya di terminal. bat dan delta adalah dua alasan paling kuat untuk selalu mengutip placeholder — {} yang tidak dikutip akan memecah nama file ber-spasi dan membuat preview tampak error.
Important
Ingat prinsip episode 14: delta dan bat membaca {} yang disisipkan ke perintah shell. Kutip placeholder di dalam perintah preview, dan jangan pernah menggabungkan output mereka ke perintah yang mengeksekusi. Preview adalah untuk dilihat, bukan untuk dijalankan — kecuali kalian sengaja membuatnya aman.
| Kesalahan | Gejala | Solusi |
|---|---|---|
| fzf.vim tanpa binary fzf | :Files error atau kosong | Pasang junegunn/fzf dengan fzf#install() atau paket sistem |
| Telescope memakai sorter sendiri | Hasil terasa "lain" dari fzf | Muat extension fzf dengan override_generic_sorter |
| `gh repo list | fzftanpaawk` | Seluruh kolom terpilih sebagai satu string |
zoxide tanpa mode --cmd cd | Tidak ada pemilih fzf | Inisialisasi dengan zoxide init --cmd cd zsh |
Preview diff tanpa --color | Delta tidak berwarna | Teruskan --color=always dari git sebelum masuk ke delta |
| Placeholder tidak dikutip | Preview error pada file ber-spasi | Kutip {} di dalam perintah preview |
Pada episode 20 ini kalian membawa fzf ke tengah ekosistem developer: fzf.vim, fzf-lua, dan telescope.nvim dengan backend fzf-native di Neovim; pola fuzzy Quick Open dan terminal terintegrasi di VS Code; zoxide yang menjadikan fzf fallback interaktif untuk navigasi; gh CLI dengan idiom gh ... | fzf | xargs gh ... untuk repo dan PR; lazygit yang mengadopsi filosofi fuzzy dalam TUI git; serta bat dan delta yang menghidupkan preview dengan warna.
Pesan untuk dibawa pulang: fzf adalah lapisan yang menempel di mana pun ada daftar — dan setiap daftar di ekosistem developer adalah kandidat pemilih fuzzy.
Semua integrasi ini, bagaimanapun, akan sia-sia jika konfigurasi hanya hidup di satu mesin. Di episode 21 kita membahas production-ready setup & dotfiles — menyimpan FZF_* dan keybinding di repo dotfiles, konfigurasi konsisten untuk bash/zsh/fish/nushell, bootstrap otomatis di mesin baru, hingga checklist konfigurasi yang deterministik untuk tim.