Çözüm 1 (en iyi çözüm):
Danışmanı kurun ( https://github.com/abo-abo/swiper/blob/master/counsel.el )
Sonra M-x counsel-git-grep.
Kurulum gerekmez (git, proje kökünü ve hariç tutulacak dosyaları bilir). Hem git grepve counselverimlidir.
Projenin git tarafından yönetilmesi gerekiyor.
öğüt sarmaşık modu gerektirir.
Çözüm 2:
Bu çözüm grep kullanır ve herhangi bir projede çalışır. Çözüm 1'den daha düşüktür, çünkü daha yavaştır ve manuel kuruluma ihtiyaç duyar. Ayrıca sarmaşık moduna da dayanıyor.
(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))))))))
Kurulum için .dir-locals.el oluşturmanız gerekir simple-project-root, teknik ayrıntılar için https://www.gnu.org/software/emacs/manual/html_node/emacs/Directory-Variables.html adresine bakın.
Çözüm 2'deki kod sadece bir prototiptir. Benim gerçek uygulamam çok daha karmaşık. Bkz counsel-etags-grep. Https://github.com/redguardtoo/counsel-etags/blob/master/counsel-etags.el
Özet:
Bunlar bildiğim en iyi iki çözüm.
Başka daha iyi çözümler varsa, üretime hazır olmak için en azından aşağıdaki sorunları çözmeleri gerekir,
anahtar kelimenin grep'e nasıl getirileceği (örneğin, seçilen bölgeden anahtar kelime nasıl alınır)
anahtar kelimeden kaç
daha verimli bir grep programı varsa, onu kullanmalıyız (ripgrep, the_silver_searcher / ag, ... vb) veya başka bir şekilde varsayılan grep
aday penceresi tam ekran genişliğini kullanmalıdır ve kullanıcılar adayları etkileşimli olarak filtreleyebilir (bu yüzden insanlar sarmaşık veya dümen kullanır)
göreceli yolu aday penceresinde göstermeliyiz
önceki açılmış sonucu yeniden kullanabilir. Bu yüzden önceki sonuç kaydedilmelidir. Sen kullanabilirsiniz ivy-resumegelen ivyveya helm-resumegelenhelm
Önceki açılmış sonucu kaydettiğinizde, önceki sonucun içeriği de kaydedilmelidir. Örneğin, Çözüm 2 kodunda default-directorybağlamdır. Daha fazla bilgi için https://github.com/abo-abo/swiper/issues/591 adresine bakın.
Genişletilmiş normal ifade kullanılmalıdır çünkü daha basittir ve counsel-git-grepthe_silver_searcher / ag tarafından zaten kullanılır .
helm-projectile-grepKomut kullanmayı denediniz mi (yüklü dümen merminiz varsa) veyaprojectile-grep?