Rozwiązanie 1 (najlepsze rozwiązanie):
Zainstaluj doradcę ( https://github.com/abo-abo/swiper/blob/master/counsel.el )
Potem M-x counsel-git-grep
.
Nie jest wymagana konfiguracja (git zna katalog główny projektu i pliki do wykluczenia). Zarówno git grep
i counsel
jest wydajny.
Projekt musi być zarządzany przez git.
rada wymaga trybu bluszczu.
Rozwiązanie 2:
To rozwiązanie używa grep i działa na każdym projekcie. Jest gorszy od rozwiązania 1, ponieważ jest wolniejszy i wymaga ręcznej konfiguracji. Opiera się również na trybie bluszczu.
(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))))))))
Aby skonfigurować simple-project-root
, musisz utworzyć plik .dir-locals.el , zobacz https://www.gnu.org/software/emacs/manual/html_node/emacs/Directory-Variables.html w celu uzyskania szczegółowych informacji technicznych
Kod w rozwiązaniu 2 jest tylko prototypem. Moja prawdziwa implementacja jest znacznie bardziej złożona. Zobacz counsel-etags-grep
w https://github.com/redguardtoo/counsel-etags/blob/master/counsel-etags.el
Streszczenie:
To dwa najlepsze rozwiązania, jakie znam.
Jeśli istnieją jakieś inne lepsze rozwiązania, muszą one przynajmniej rozwiązać poniższe problemy, aby były gotowe do produkcji,
jak zmusić słowo kluczowe do grep (na przykład uzyskać słowo kluczowe z wybranego regionu)
uciec od słowa kluczowego
jeśli istnieje bardziej wydajny program grep, powinniśmy go użyć (ripgrep, the_silver_searcher / ag, ... itd.), lub cofnąć domyślny grep
okno kandydata powinno korzystać z pełnej szerokości ekranu, a użytkownicy mogą interaktywnie filtrować kandydatów (dlatego ludzie używają bluszczu lub hełmu)
powinniśmy pokazać ścieżkę względną w oknie kandydata
w stanie ponownie użyć poprzedniego grepowanego wyniku. Poprzedni wynik powinien zostać zapisany. Możesz używać ivy-resume
z ivy
lub helm-resume
zhelm
Kiedy zapisujesz poprzedni grepowany wynik, kontekst poprzedniego wyniku również powinien zostać zapisany. Na przykład w kodzie rozwiązania 2. default-directory
jest kontekst. Więcej informacji na stronie https://github.com/abo-abo/swiper/issues/591 .
Należy użyć rozszerzonego wyrażenia regularnego, ponieważ jest ono prostsze i jest już używane przez counsel-git-grep
the_silver_searcher / ag.
helm-projectile-grep
polecenia (jeśli masz zainstalowany pocisk steru) lubprojectile-grep
?