솔루션 1 (최상의 솔루션) :
상담 설치 ( https://github.com/abo-abo/swiper/blob/master/counsel.el )
그런 다음 M-x counsel-git-grep
.
설정이 필요하지 않습니다 (git은 프로젝트 루트와 제외 할 파일을 알고 있습니다). 모두 git grep
와 counsel
효율적이다.
프로젝트는 git에 의해 관리되어야합니다.
상담에는 아이비 모드가 필요합니다.
해결책 2 :
이 솔루션은 grep을 사용하며 모든 프로젝트에서 작동합니다. 속도가 느리고 수동 설정이 필요하므로 솔루션 1보다 열등합니다. 또한 아이비 모드를 기반으로합니다.
(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))))))))
설정하려면 .dir-locals.el을 만들어야합니다. 자세한 기술 정보는 https://www.gnu.org/software/emacs/manual/html_node/emacs/Directory-Variables.html 을 simple-project-root
참조 하십시오.
솔루션 2의 코드는 단지 프로토 타입입니다. 내 실제 구현은 훨씬 더 복잡합니다. 보기 counsel-etags-grep
에 https://github.com/redguardtoo/counsel-etags/blob/master/counsel-etags.el
요약:
이것이 내가 아는 최고의 두 가지 솔루션입니다.
다른 더 나은 솔루션이 존재하면 프로덕션 준비가 되려면 최소한 아래의 문제를 해결해야합니다.
키워드를 grep하는 방법 (예 : 선택한 지역에서 키워드 가져 오기)
키워드를 피하십시오
보다 효율적인 grep 프로그램이 존재하면이를 사용하거나 (ripgrep, the_silver_searcher / ag 등) 기본 grep을 대체해야합니다.
후보 창은 전체 화면을 사용해야하며 사용자는 대화식으로 후보를 필터링 할 수 있습니다 (그러므로 사람들이 아이비 또는 투구를 사용하는 이유)
후보 창에 상대 경로를 표시해야합니다
이전에 잘린 결과를 재사용 할 수 있습니다. 따라서 이전 결과를 저장해야합니다. 당신은 사용할 수 있습니다 ivy-resume
에서 ivy
또는 helm-resume
에서helm
이전에 잘린 결과를 저장할 때 이전 결과의 컨텍스트도 저장해야합니다. 예를 들어 솔루션 2의 코드에는 default-directory
컨텍스트가 있습니다. 자세한 내용은 https://github.com/abo-abo/swiper/issues/591 을 참조하십시오.
확장 정규 표현식은 더 단순하고 counsel-git-grep
the_silver_searcher / ag에서 이미 사용하기 때문에 사용해야합니다 .
helm-projectile-grep
(헬멧 발사체가 설치된 경우) 명령 을 사용해 보셨습니까projectile-grep
?