Çö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 grep
ve counsel
verimlidir.
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-resume
gelen ivy
veya helm-resume
gelenhelm
Önceki açılmış sonucu kaydettiğinizde, önceki sonucun içeriği de kaydedilmelidir. Örneğin, Çözüm 2 kodunda default-directory
bağ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-grep
the_silver_searcher / ag tarafından zaten kullanılır .
helm-projectile-grep
Komut kullanmayı denediniz mi (yüklü dümen merminiz varsa) veyaprojectile-grep
?