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
dan counsel
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.
(defvar simple-project-root "~/.emacs.d")
(defun simple-grep ()
(interactive)
(unless (featurep 'ivy)
(require 'ivy))
(let* ((default-directory (file-name-as-directory simple-project-root))
(keyword (read-string "Keyword:")))
(ivy-read (format "Grep at %s:" simple-project-root)
(split-string (shell-command-to-string (format "grep -rsnI %s ." keyword)) "\n" t)
:action (lambda (val)
(let* ((lst (split-string val ":"))
(linenum (string-to-number (cadr lst))))
;; open file
(find-file (car lst))
;; goto line if line number exists
(when (and linenum (> linenum 0))
(goto-char (point-min))
(forward-line (1- linenum))))))))
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 teknis
Kode 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.el
Ringkasan:
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
dari ivy
atau helm-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.
helm-projectile-grep
perintah (jika Anda memiliki proyektil helm terpasang) atauprojectile-grep
?