Saya menggunakan Emacs untuk beberapa waktu dan saya masih gagal memahami apa cara terbaik untuk (secara rekursif) grep untuk string dalam direktori (proyek) dan mendapatkan hasil yang disajikan baik sebagai buffer dired atau dalam beberapa bahkan lebih cara yang bermanfaat. Tolong beri tahu saya.
14
helm-projectile-grep
perintah (jika Anda memiliki proyektil helm terpasang) atauprojectile-grep
?helm
atau apaprojectile
, tetapi jika ini adalah alat yang direkomendasikan, saya akan menginstal dan mempelajarinya.projectile-grep
. Juga, saya SANGAT menyarankan Anda menginstalhelm
paket. Saya tidak bisa membayangkan menjalankan emacs tanpahelm
danhelm-projectile
. Anda mungkin juga tertarik padahelm-ag
paket (yang menyediakan antarmuka helm untuk pencari perak di emacs, yang seharusnya lebih cepat daripada grep atau ack).M-x grep
tidak melakukan apa yang Anda butuhkan. Mari kita beri baris perintah sewenang-wenang, saya kadang-kadang menggunakannya difind
sana ketika saya membutuhkan rekursi.Jawaban:
Nah, karena pertanyaan awal tidak disebutkan
rgrep
, saya akan lanjutkan dan tunjukkan di sini. Ini adalah opsi paling sederhana yang sudah ada di Emacs, dan saya merasa sudah lebih dari cukup untuk sebagian besar hal.Dari dokumentasi,
Pencarian terbatas pada nama file yang sesuai dengan pola shell FILES.
Jadi, misalnya, untuk mencari semua file python di bawah direktori home saya untuk penggunaan
some_function
, saya akan menyebutnya dengansome_function
,*.py
,~/
sebagai argumen. Hasil ditampilkan dalam buffer baru.sumber
find-grep-dired
juga karena OP menyebutkan "hasil yang disajikan sebagai buffer dired atau ..."find-grep-dired
diriku, silakan menambahkannya ke jawabannya.rgrep
melakukan pekerjaan yang baik menargetkan pencarian sehingga tidak ada perbedaan kecepatan yang signifikan di antara mereka. (Saya ingin mengatakan bahwa rgrep fraksional lebih cepat dalam beberapa kasus, tapi saya tidak ingat pasti.)next-error
danprevious-error
dapat digunakan untuk menavigasi melalui set hasil. Saya menemukanM-g M-n
danM-g M-p
yang paling nyaman dari binding standar.find-grep-dired
tidak memberi saya buffer dengan tautan referensi silang.rgrep
melakukannya untuk saya dan saran terakhir tentangnext-error
previous-error
itu fantastis! Satu-satunya masalah saya adalah bahwa semua output eksekusi perintah berantakan pada awal buffer.Saya senang menggunakannya
M-x find-grep-dired
selama bertahun-tahun. Ini mengembalikan hasil sebagai buffer dired, yang bisa Anda gunakan.sumber
find-ls-option
) dan setelah semua itu Anda berakhir dengan sesuatu yang sangat bertele-tele karena tidak berfungsi tanpa memiliki tanggal sebelum nama file!Solusi 1 (solusi terbaik):
Pasang nasihat ( https://github.com/abo-abo/swiper/blob/master/counsel.el )
Lalu
M-x counsel-git-grep
.Tidak diperlukan pengaturan (git tahu root proyek dan file yang dikecualikan). Keduanya
git grep
dancounsel
efisien.Proyek perlu dikelola oleh git.
nasihat membutuhkan ivy-mode.
Solusi 2:
Solusi ini menggunakan grep dan bekerja pada proyek apa pun. Ini lebih rendah daripada Solusi 1 karena lebih lambat dan memerlukan pengaturan manual. Ini juga didasarkan pada ivy-mode.
Anda perlu membuat .dir-locals.el untuk pengaturan
simple-project-root
, lihat https://www.gnu.org/software/emacs/manual/html_node/emacs/Directory-Variables.html untuk detail teknisKode dalam solusi 2 hanyalah sebuah prototipe. Implementasi saya yang sebenarnya jauh lebih kompleks. Lihat
counsel-etags-grep
di https://github.com/redguardtoo/counsel-etags/blob/master/counsel-etags.elRingkasan:
Itu adalah dua solusi terbaik yang saya tahu.
Jika ada solusi lain yang lebih baik, mereka setidaknya perlu menyelesaikan masalah di bawah ini agar siap produksi,
cara mendapatkan kata kunci untuk dipahami (misalnya, dapatkan kata kunci dari wilayah yang dipilih)
lepas dari kata kunci
jika ada program grep yang lebih efisien, kita harus menggunakannya (ripgrep, the_silver_searcher / ag, ... dll), atau mundur grep default
jendela kandidat harus menggunakan layar lebar penuh dan pengguna dapat menyaring kandidat secara interaktif (itu sebabnya orang menggunakan ivy atau helm)
kita harus menunjukkan jalur relatif di jendela kandidat
dapat menggunakan kembali hasil grepped sebelumnya. Jadi hasil sebelumnya harus disimpan. Anda dapat menggunakan
ivy-resume
dariivy
atauhelm-resume
darihelm
Ketika Anda menyimpan hasil grepped sebelumnya, konteks hasil sebelumnya juga harus disimpan. Misalnya, dalam kode Solusi 2.
default-directory
adalah konteks. Lihat https://github.com/abo-abo/swiper/issues/591 untuk rincian lebih lanjut.Ekspresi reguler yang diperluas harus digunakan karena lebih sederhana dan sudah digunakan oleh
counsel-git-grep
dan the_silver_searcher / ag.sumber
Saya ingin menambahkan solusi lain ke solusi @chen bin yang juga menggunakan
counsel
(tetapi Anda tidak perlu memiliki proyek yang dikelolagit
untuk ini).Anda perlu menginstal ag (pencari perak) dan
counsel
memberikan perintahcounsel-ag
yang mencari direktori saat ini untuk string yang dimasukkan.Jika Anda ingin mencari di dalam suatu proyek (bukan hanya direktori kerja saat ini), tambahkan ini ke
.emacs
: -Fungsi ini akan digunakan
ag
untuk mencari direktori root proyek secara rekursif.Sunting : fungsi di atas default ke simbol pada titik untuk pencarian. Jika Anda tidak menyukai perilaku itu, ganti
(thing-at-point 'symbol)
dengannil
. Dan jika Anda ingin hasil pencarian di buffer pers itu sendiriC-c C-oSunting2 : jika Anda sudah
ripgrep
menginstal, Anda dapat mengganticounsel-ag
dengancounsel-rg
di fungsi di atas dan itu akan sama saja :)sumber
projectile-project-root
bisa digunakan untuk menemukan root proyek Rails?rag/...
?rag/
awalan dan itu membuatnya mudah ditemukan di bawahM-x
:)Berikut adalah contoh fungsi grep kustom yang secara rekursif mengambil konten file (menggunakan regexp untuk istilah pencarian) dalam direktori dan subdirektori, dan menampilkan hasilnya dengan garis konteks sebelum dan sesudah. Built-in
compile.el
dangrep.el
perpustakaan menyediakan beberapa metode untuk melompat ke lokasi di file yang berisi hasil pencarian. Tidak perlu menginstal apa pun agar contoh ini berfungsi - yang diperlukan hanyalah versi lengkap Emacs dan komputer yang memilikigrep
utilitas yang diinstal. Variabelgrep-program
dapat disesuaikan untuk menunjuk ke lokasi tertentu darigrep
utilitas jika standarnya tidak memadai.sumber
multiple-cursors
danwgrep
. Itu membuat memodifikasi beberapa file dalam satu gerakan mudah. Namun, pustaka yang disebutkan harus diinstal jika fitur-fitur itu diinginkan.rgrep
?rgrep
memakan waktu untuk menyesuaikan dengan kriteria pencarian regex pilihan saya, dan saya memilih untuk melakukan hard-code segala sesuatu dalam fungsi kustom (yang saya gunakan beberapa kali setiap hari). Jika Anda ingin menulis jawaban alternatif yang menjelaskan cara menyesuaikanrgrep
, itu akan membantu pembaca forum lain di masa mendatang.