解决方案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进行设置simple-project-root
,有关技术细节,请参见https://www.gnu.org/software/emacs/manual/html_node/emacs/Directory-Variables.html
解决方案2中的代码只是一个原型。我的实际实现要复杂得多。见counsel-etags-grep
在https://github.com/redguardtoo/counsel-etags/blob/master/counsel-etags.el
摘要:
这些是我所知道的最好的两个解决方案。
如果还有其他更好的解决方案,那么他们至少需要解决以下问题才能投入生产,
如何获取grep的关键字(例如,从选定区域获取关键字)
转义关键字
如果存在更有效的grep程序,则应使用它(ripgrep,the_silver_searcher / ag等),否则回退默认grep
候选窗口应使用整个屏幕宽度,并且用户可以交互过滤候选对象(这就是人们使用常春藤或头盔的原因)
我们应该在候选窗口中显示相对路径
能够重用以前的grepped结果。因此,应保存以前的结果。您可以使用ivy-resume
from ivy
或helm-resume
fromhelm
保存先前的grepped结果时,也应保存先前结果的上下文。例如,在解决方案2的代码中default-directory
是context。有关更多详细信息,请参见https://github.com/abo-abo/swiper/issues/591。
应该使用扩展的正则表达式,因为它更简单并且已经被counsel-git-grep
the_silver_searcher / ag使用。
helm-projectile-grep
命令(如果已安装头盔弹丸)或projectile-grep
?