Menjelajah codebase besar dari dalam Emacs: memahami project.el untuk mendeteksi akar proyek, membuka file dengan project-find-file, mencari lintas file dengan project-search yang memakai grep/ripgrep, menyaring hasil ke buffer, dan mengintegrasikan consult untuk workflow yang cepat.

Isearch (episode 6) mencari dalam satu file; realita kerja adalah mencari dalam ribuan file. Episode 17 membahas alat itu: project.el — sistem proyek bawaan Emacs — dan integrasi dengan ripgrep, pencari teks tercepat di dunia command line.
Mengapa penting? Karena "di mana fungsi ini dipanggil?", "file apa yang menyentuh modul ini?", "di file mana string ini muncul?" adalah pertanyaan harian developer. Jawaban cepat atas pertanyaan-pertanyaan ini menentukan seberapa besar codebase yang bisa kalian kelola dengan tenang. Dan semuanya bisa dilakukan tanpa meninggalkan Emacs.
project.el mendeteksi akar proyek dari penanda yang dikenal — .git, projectile-project-root, atau project-vc-extra-root-markers:
M-x project-find-file RET → buka file mana pun di proyek (fuzzy)
M-x project-find-regexp RET → cari regexp di seluruh proyek
M-x project-switch-project RET → pindah antar proyekproject-find-file adalah pintu gerbang utama: kalian mengetik sebagian nama file dan Emacs memfilter seluruh proyek — jauh lebih cepat daripada C-x C-f yang mengetik path penuh.
Konfigurasi penanda proyek kustom:
(add-to-list 'project-vc-extra-root-markers "go.mod")
(add-to-list 'project-vc-extra-root-markers "pyproject.toml")
(add-to-list 'project-vc-extra-root-markers "Cargo.toml")Sekarang folder berisi go.mod (tanpa .git) tetap dikenali sebagai proyek.
ripgrep (rg) adalah pencari teks lintas direktori yang sangat cepat — ditulis Rust, memakai parallel scan + smart heuristik:
sudo apt install ripgrep # Debian/Ubuntu
sudo dnf install ripgrep # RHEL/Fedora
brew install ripgrep # macOSKenapa Emacs lebih baik memakai rg daripada grep? Karena rg secara default menghormati .gitignore, melewati binary, dan menggunakan banyak thread. Untuk codebase besar, perbedaannya berlipat kali lipat.
Cara paling langsung memakai ripgrep dari project.el:
M-x project-search RET → ketik pola → semua hasil masuk ke bufferHasil ditampilkan dalam satu buffer (mode grep-mode / project-find-regexp). Navigasi hasil:
n / p → hasil berikutnya / sebelumnya
RET → buka file di lokasi hasil
M-g M-n / M-g M-p → next/previous match di seluruh buffer
C-c C-c → jalankan kembali pencarian dengan prompt baruUntuk rename massal lintas proyek yang aman:
M-x project-query-replace-regexp RET
→ pola lama → pola baru → y / n / ! per kemunculanIni versi project-wide dari query-replace (episode 6) — senjata refactor teraman untuk codebase utuh.
consult (dari stack Vertico) meningkatkan semuanya: hasil pencarian langsung di-minibuffer dengan preview:
(use-package consult
:ensure t
:bind (("C-x p" . project-command-map)
("M-s p" . consult-find)
("M-s r" . consult-ripgrep)))M-x consult-ripgrep RET → ketik pola → hasil muncul di minibuffer
(tekan panah untuk preview file sebelum memilih)Dengan consult, workflow "cari di proyek" menjadi live preview: mengetik pola menampilkan hasil yang bisa ditelusuri sebelum file dibuka. Satu pola = satu alur; tidak ada layar menengah.
Pola kerja lengkap:
1. M-x project-find-file RET → buka file yang dicari (misal app.py)
2. M-s p (consult-find) → cari file lain di proyek
3. M-x consult-ripgrep RET "pagination" → di mana semua pemakaian?
4. RET pada hasil → langsung ke lokasi
5. M-x project-query-replace-regexp RET "pagination" RET "page_size" RET
6. ! → terapkan ke semua kemunculan
7. C-x g (magit-status) → review semua perubahan sekali jalanDari "temukan" sampai "refactor selesai + review", semuanya dalam satu sesi tanpa berpindah aplikasi.
Tip
Isearch (episode 6) juga bisa memanfaatkan proyek: M-s e (consult-isearch) atau M-s o (occur). Dan jangan lupa, M-x project-find-file + C-x p r (project-rename) + Eglot (episode 16) memberi rename symbol yang paham konteks bahasa — untuk kasus yang lebih dari sekadar replace teks.
Buffer hasil pencarian bisa di-refine — cari lagi dalam hasil:
M-x grep RET → pola baru dalam buffer hasil (grep-mode)Teknik ini berguna saat hasil pertama terlalu banyak: cari pola kasar dulu (misal error), lalu filter dalam hasil dengan pola kedua (timeout). Isearch dalam buffer hasil juga bisa (C-s).
rg tidak ditemukan: project.el otomatis memakai grep fallback kalau rg tidak ada — hasilnya lebih lambat dan pola berbeda. Install rg dan verifikasi which rg.\d valid, sedangkan Emacs regex butuh [[:digit:]]. Di project-find-regexp, pola ditulis dalam syntax ripgrep, bukan Emacs..gitignore dipatuhi: rg tidak mencari file yang di-ignore — kalau ingin mencarinya, tambahkan --no-ignore di grep-find-command atau pola eksplisit..git? Tambah project-vc-extra-root-markers seperti di atas.Pada episode 17 ini, kalian telah menjelajah codebase dengan kecepatan ripgrep.
Inti yang harus dibawa pulang:
project-find-file membuka file mana pun secara fuzzy.rg, bukan grep.project-search / project-find-regexp menampilkan semua hasil dalam satu buffer navigable.project-query-replace-regexp = refactor massal aman lintas proyek.Di episode 18 selanjutnya, kita menghubungkan Emacs dengan sistem: Eshell, Shell & Tramp — Eshell (shell native Elisp), shell-mode, vterm, dan editing file remote lewat Tramp dengan C-x C-f /ssh:host:/path. Sampai jumpa di episode 18!