Editor yang cantik belum tentu cepat. Di episode ini kita membangun mesin pencarian revolusioner dengan telescope.nvim: find files, live grep, buffers, dan help tags dalam satu picker, ditambah akselerasi C-extension fzf-native agar proyek berukuran besar tetap terasa ringan.

Setelah di episode 10 sebelumnya kita merombak tampilan Neovim dengan colorscheme modern, statusline lualine, bufferline, dan indent guide, sekarang editor kalian sudah terlihat seperti IDE profesional. Namun, ada satu masalah besar yang langsung terasa begitu kalian bekerja di proyek nyata: membuka file dengan cara lama sangat lambat.
Coba bayangkan kalian bekerja di codebase dengan ratusan file — misalnya service backend Go, frontend React, dan direktori deployment sekaligus. Mencari file secara manual lewat :Explore atau file tree butuh puluhan klik. Mencari teks "di mana function ValidateToken dipanggil?" dengan grep dari terminal di luar editor berarti pindah konteks bolak-balik. Di episode 11 ini, kita akan menghancurkan masalah itu dengan telescope.nvim — fuzzy finder yang menjadi standar de-facto navigasi di ekosistem Neovim, mirip Command Palette (Ctrl+Shift+P) di VS Code atau ⌘+P di JetBrains, tapi jauh lebih fleksibel. Mari kita mulai.
Istilah fuzzy finder merujuk pada teknik pencarian yang tidak menuntut pengetikan persis. Ketik lua/pl dan telescope langsung menebak file yang kalian maksud — misal lua/plugins/colorscheme.lua — melalui pencocokan fuzzy (karakter tidak harus berurutan). Analoginya seperti fitur prediksi keyboard di ponsel: kalian mengetik sebagian, sistem menebak sisanya.
Fungsi ini sebenarnya bukan hal baru; Vim punya :find, dan ada plugin lawas seperti fzf.vim atau ctrlp. Keunggulan telescope.nvim:
Konsep kunci yang perlu dipahami: telescope memakai plenary.nvim sebagai pustaka utilitas (mirip lodash untuk Lua) dan ripgrep sebagai mesin pencari teks di luar terminal. Pastikan ripgrep sudah terpasang — kita akan bahas di bagian live grep nanti.
Dengan lazy.nvim, kita tulis satu file spec lengkap berisi plugin utama, dependency, keymaps, dan konfigurasi. Perhatikan pola lazy-loading berbasis keys: plugin baru dimuat saat tombol shortcut pertama kali ditekan, sehingga startup Neovim tetap secepat kilat.
return {
{
"nvim-telescope/telescope.nvim",
branch = "0.1.x",
dependencies = {
"nvim-lua/plenary.nvim",
{ "nvim-telescope/telescope-fzf-native.nvim", build = "make" },
},
keys = {
{ "<leader>ff", "<cmd>Telescope find_files<CR>", desc = "Cari file (find files)" },
{ "<leader>fg", "<cmd>Telescope live_grep<CR>", desc = "Cari teks (live grep)" },
{ "<leader>fb", "<cmd>Telescope buffers<CR>", desc = "Daftar buffer" },
{ "<leader>fh", "<cmd>Telescope help_tags<CR>", desc = "Cari help tags" },
},
opts = {
defaults = {
prompt_prefix = " ",
selection_caret = " ",
sorting_strategy = "ascending",
layout_config = { prompt_position = "top", height = 0.85 },
},
pickers = {
find_files = { hidden = true },
},
},
},
}Ada beberapa detail penting:
keys — setiap entri berisi mode default (normal), kombinasi tombol, command yang dieksekusi, dan desc untuk keperluan which-key (episode 20). Ini juga yang membuat lazy.nvim hanya memuat telescope saat <leader>ff pertama kali ditekan.sorting_strategy = "ascending" — meletakkan hasil di bagian atas, meniru Command Palette modern. Bersama layout_config.height = 0.85, picker menjadi popup vertikal yang lapang.pickers.find_files.hidden = true — menampilkan file dot (.env, .gitignore) di hasil pencarian. Ini sering dilupakan dan bikin kalian bingung kenapa file dot tidak pernah muncul.Tip
<leader> di config di atas berarti Space (kita set vim.g.mapleader = " " di episode 7). Jadi <leader>ff artinya menekan Space lalu f f. Kalian bisa mengubah kumpulan shortcut ini sesuai selera — yang penting konsisten dan mudah diingat.
Ada satu varian find_files yang layak diketahui: git_files (<leader>fgf). Perbedaannya, find_files memindai seluruh direktori proyek (menghormati .gitignore), sedangkan git_files hanya menampilkan file yang sudah di-track oleh git. Di proyek dengan banyak file artifact atau direktori build, git_files biasanya lebih cepat dan lebih bersih. Untuk repo yang baru di-git init, hasil keduanya hampir identik.
Perhatikan bahwa opsi pickers.find_files.hidden = true pada config kita adalah nilai yang dimodifikasi dari default (default-nya false). Jika suatu saat kalian lupa dan file dot tidak muncul, diff berikut menunjukkan seperti apa perubahan yang seharusnya:
pickers = {
find_files = {
# [!code --:1]
hidden = false,
# [!code ++:1]
hidden = true,
},
},ff, fg, fb, fhKeempat picker ini adalah "senjata harian" yang akan kalian pakai puluhan kali sehari:
| Shortcut | Picker | Fungsi | Analogi |
|---|---|---|---|
<leader>ff | find_files | Mencari nama file di proyek | Ctrl+P di VS Code |
<leader>fg | live_grep | Mencari teks di seluruh isi file | Ctrl+Shift+F di VS Code |
<leader>fb | buffers | Berpindah antar file yang sudah terbuka | Alt+Tab |
<leader>fh | help_tags | Mencari dokumentasi :help Neovim | F1 yang benar-benar berguna |
Setelah picker terbuka, navigasinya konsisten: Ctrl+j/Ctrl+k (atau panah) untuk bergerak, Enter untuk membuka hasil, Ctrl+v untuk membuka di split vertikal, Ctrl+x untuk split horizontal, dan Ctrl+q untuk mengirim banyak hasil ke quickfix list. Mempelajari satu set navigasi ini sekali akan terus terpakai di semua picker.
Setiap picker telescope memuat satu set keymap bawaan yang konsisten. Menghafalnya sekali berarti menguasai semua picker:
| Key | Fungsi |
|---|---|
Ctrl+j / Ctrl+k | Pindah hasil berikutnya / sebelumnya |
Ctrl+n / Ctrl+p | Alternatif pindah hasil (jika Ctrl+j bentrok dengan terminal) |
Enter | Buka hasil di window aktif |
Ctrl+v | Buka hasil di split vertikal |
Ctrl+x | Buka hasil di split horizontal |
Ctrl+t | Buka hasil di tab baru |
Ctrl+q | Kirim semua hasil ke quickfix list |
Ctrl+u / Ctrl+d | Hapus / tambahkan karakter pada query (seperti prompt zsh) |
Esc | Tutup picker tanpa memilih |
Dua yang paling sering kalian pakai dalam alur kerja nyata adalah Ctrl+v (membandingkan dua file secara berdampingan — misal implementasi vs test) dan Ctrl+q (mengirim seluruh hasil grep ke quickfix untuk ditinjau satu per satu).
live_grep adalah picker paling bertenaga karena ia mencari isi file, bukan nama file. Di sinilah ripgrep berperan. Saat <leader>fg ditekan, telescope menjalankan rg --hidden --no-ignore (secara default menaati .gitignore) dan menampilkan hasilnya secara live — setiap kalian mengetik, hasil langsung diperbarui.
Caution
Tanpa ripgrep, live_grep tidak akan berfungsi — telescope hanya menjalankan perintah rg, ia tidak mengimplementasikan pencariannya sendiri. Pastikan install lebih dulu: di Debian/Ubuntu sudo apt install ripgrep, di macOS brew install ripgrep, di Arch sudo pacman -S ripgrep. Cek dengan rg --version.
Untuk pencarian yang lebih presisi, live_grep mendukung search syntax dari ripgrep. Coba jalankan variasi berikut:
rg "ValidateToken" # kata biasa
rg "^func .*Validate" # baris yang dimulai dengan func dan mengandung Validate
rg -i "timeout" # case-insensitive
rg "TODO|FIXME" src/ # cari TODO/FIXME khusus di folder srcPerhatikan bahwa pola di atas memakai regex ripgrep. Karena telescope juga membaca query dari :grep buffer, kalian bisa beralih dari live_grep ke buffer grep dengan Ctrl+Ctrl (toggle) — membiarkan kalian menyempurnakan query yang sama tanpa mengetik ulang.
Note
Tiga tombol penting saat live_grep terbuka: Ctrl+j/k berpindah hasil, Enter membuka file di lokasi yang disorot, dan Ctrl+q memasukkan semua hasil ke quickfix — berguna untuk meninjau seluruh kemunculan satu symbol sebelum refactor.
Supaya konsepnya nyata, mari kita telusuri satu skenario yang sering terjadi di dunia kerja. Kalian sedang debugging dan mendapati bahwa helper formatDuration mengembalikan nilai yang salah. Pertanyaan pertamanya: "di mana saja function ini dipanggil, dan dengan argumen apa?"
<leader>fg untuk membuka live_grep.formatDuration — seluruh kemunculan di seluruh codebase muncul seketika, lengkap dengan baris isinya.Ctrl+q untuk memasukkan semua hasil ke quickfix list.Esc), lalu jalankan :cnext/:cprev (atau <leader>j/<leader>k jika sudah dipetakan) untuk meninjau satu per satu.Dengan alur ini, kalian bisa menelusuri seluruh jejak sebuah symbol dalam hitungan detik — tanpa berpindah ke terminal, tanpa grep -rn manual, tanpa kehilangan konteks. Bandingkan dengan cara manual yang menghabiskan puluhan kali lebih lama. Inilah perbedaan antara "mengetik kode" dan "berpikir dalam kode".
telescope-fzf-native.nvimFuzzy matching murni Lua cukup cepat untuk proyek kecil-menengah, tapi di monorepo raksasa dengan puluhan ribu file, ia mulai terasa berat. Solusinya adalah telescope-fzf-native.nvim — C extension yang memakai algoritma fuzzy matching fzf yang ditulis dalam bahasa C, jauh lebih cepat dari implementasi Lua murni.
return {
"nvim-telescope/telescope-fzf-native.nvim",
build = "make",
config = function()
require("telescope").load_extension("fzf")
end,
}Karena dependency ini ditulis dalam C, ia perlu dikompilasi saat diinstal — itulah gunanya build = "make". lazy.nvim akan menjalankan make otomatis. Tambahan bonus: extension ini mengaktifkan syntax fzf seperti 'lua$ (akhiran tertentu), ! (negasi), dan ^ (awalan).
Warning
Jika make gagal, kemungkinan besar sistem kalian tidak punya compiler C (gcc/clang) atau make. Install dulu via package manager (misal sudo apt install build-essential). Setelah itu jalankan :Lazy build telescope-fzf-native.nvim untuk mengkompilasi ulang. Hasilnya akan memuaskan: pencarian ribuan file terasa instan.
Kekuatan telescope ada di ekosistem pickernya. Karena kita sudah memasang plugin Git di episode 18 nanti, tapi ada beberapa picker bawaan yang bisa langsung dipakai sekarang tanpa plugin tambahan:
keys = {
{ "<leader>fs", "<cmd>Telescope git_status<CR>", desc = "Perubahan git" },
{ "<leader>fc", "<cmd>Telescope git_commits<CR>", desc = "Riwayat commit" },
{ "<leader>ft", "<cmd>Telescope colorscheme<CR>", desc = "Ganti colorscheme" },
{ "<leader>fd", "<cmd>Telescope diagnostics<CR>", desc = "Daftar diagnostics" },
},git_status — menampilkan file yang berubah di working tree; Enter membuka file, Ctrl+v membuka diff-nya. Ini menggantikan ritual git status di terminal untuk pekerjaan cepat.git_commits — menelusuri riwayat commit. Dari sini tekan Enter untuk melihat diff commit, atau Ctrl+v untuk checkout. Sangat berguna saat debugging "kenapa rusak?".colorscheme — daftar semua theme terpasang; pilih dan lihat hasilnya langsung tanpa restart. Cocok untuk bereksperimen (ini melengkapi episode 10!).diagnostics — daftar error/warning LSP di seluruh proyek. Akan terasa bertenaga setelah kita bangun LSP di episode 15.Dua picker lagi yang sering terlewat padahal sangat berguna sehari-hari:
| Shortcut | Picker | Fungsi |
|---|---|---|
<leader>gb | git_branches | Beralih cabang git tanpa keluar editor |
<leader>fo | oldfiles | Membuka file yang pernah dibuka sebelumnya (history) |
oldfiles khususnya menarik: ia memanfaatkan shada file Neovim yang mencatat riwayat file yang pernah dibuka. Saat kalian membuka proyek, file yang sering kalian kerjakan kemarin bisa langsung dipanggil dari sini tanpa mengetik nama lengkap — cukup dua atau tiga huruf pertama.
Important
Jangan lupa bahwa picker git_status dan git_commits hanya bermakna jika direktori kalian adalah repository git. Di folder non-git, kedua picker itu akan kosong atau menampilkan error — itu perilaku normal, bukan bug.
| Kesalahan | Gejala | Solusi |
|---|---|---|
ripgrep belum terpasang | live_grep gagal / error rg: command not found | sudo apt install ripgrep (atau sesuai distro) |
fzf-native gagal compile | Warning saat load extension fzf | Install build-essential, lalu :Lazy build telescope-fzf-native.nvim |
| File dot tidak muncul | .env, .gitignore "hilang" | Set pickers.find_files.hidden = true |
| Picker terlalu pendek | Hasil terpotong saat banyak match | Besarkan layout_config.height = 0.85 |
| Shortcut tidak bekerja | Tidak ada reaksi saat <leader>ff | Pastikan vim.g.mapleader = " " sudah di-set sebelum lazy.nvim dimuat |
Pencarian mengikuti .gitignore yang salah | File penting tidak pernah muncul | Ingat: live_grep menghormati ignore file; gunakan --no-ignore jika perlu |
Pada episode 11 ini kita telah membangun tulang punggung navigasi Neovim: telescope.nvim dengan empat picker utama (find_files, live_grep, buffers, help_tags), akselerasi C-extension fzf-native untuk proyek besar, serta picker tambahan untuk git, colorscheme, dan diagnostics. Kalian sekarang bisa membuka file dan mencari teks tanpa meninggalkan keyboard — kecepatan berpikir pun sejalan dengan kecepatan mengetik.
Namun ada satu celah yang masih terasa: mencari file dengan fuzzy finder itu cepat jika kalian ingat nama filenya. Bagaimana kalau kalian tidak ingat, dan hanya ingin melihat-lihat struktur direktori secara visual? Di episode 12 selanjutnya kita akan membahas file explorer (neo-tree.nvim) dan pendekatan buffer-based dengan oil.nvim — plus kapan tepatnya memakai explorer versus fuzzy finder. Pastikan tetap semangat!