我希望能够使用正常M-x rgrep
工作流程(输入路径,模式并在*grep*
缓冲区中显示链接结果),但使用git grep
代替正常find
命令:
find . -type f -exec grep -nH -e {} +
我尝试直接设置grep-find-command
变量:
(setq grep-find-command "git grep")
并使用grep-apply-setting
(grep-apply-setting 'grep-find-command "git grep")
但似乎都不起作用。当我运行M-x rgrep
时,它只使用与以前相同的find
命令。
事实上,我现在很确定rgrep
甚至没有使用grep-find-command
变量,但我无法弄清楚它在哪里?{s}}命令 存储。
答案 0 :(得分:13)
M-x vc-git-grep
(C-x v f
)怎么样?不能满足你的需求吗?
它会提示您:
很适合我。
答案 1 :(得分:12)
原来相关的变量实际上是grep-find-template
。这需要一个带有一些附加参数的命令:
<D>
作为基本目录<X>
用于限制目录列表的查找选项<F>
用于限制匹配文件的查找选项<C>
,如果搜索不区分大小写,则放置-i
的位置<R>
用于搜索默认模板如下所示:
find . <X> -type f <F> -exec grep <C> -nH -e <R> {} +
要使命令与git grep
一起使用,我必须传递一些选项以确保git
不使用寻呼机并以正确的格式输出内容。我还忽略了一些模板选项,因为git grep
已经以自然的方式限制了搜索的文件。但是,以某种方式将它们添加回来可能是有意义的。
grep-find-template
的新值
git --no-pager grep --no-color --line-number <C> <R>
经过一些粗略的测试,似乎有效。
请注意,您应该使用grep-apply-setting
设置此变量,而不是直接修改它:
(grep-apply-setting 'grep-find-template "git --no-pager grep --no-color --line-number <C> <R>")
由于我没有使用rgrep
的两个输入,我编写了自己的git-grep
命令,暂时隐藏旧的grep-find-template
并将其替换为我的(defcustom git-grep-command "git --no-pager grep --no-color --line-number <C> <R>"
"The command to run with M-x git-grep.")
(defun git-grep (regexp)
"Search for the given regexp using `git grep' in the current directory."
(interactive "sRegexp: ")
(unless (boundp 'grep-find-template) (grep-compute-defaults))
(let ((old-command grep-find-template))
(grep-apply-setting 'grep-find-template git-grep-command)
(rgrep regexp "*" "")
(grep-apply-setting 'grep-find-template old-command)))
。这感觉有点hacky,但似乎也有效。
{{1}}
答案 2 :(得分:0)
使用适用于Windows的Emacs和Git Bash确保PATH查找 git.exe 或vc-git-grep
无效:
(let ((dir "C:/Program Files/Tools/Git/bin"))
(setenv "PATH" (concat (getenv "PATH") ";" dir))
(setq exec-path (append exec-path '(dir))))
exec-path
还不够...原因在这里说明:Using git with emacs
由于vc-git-grep
使用了从中运行函数的缓冲区目录,所以我还发现了一个方便的包装器:
(global-set-key [(control f8)]
(lambda() (interactive)
(with-current-buffer ROOT (call-interactively #'vc-git-grep))))
这里ROOT是一个从其目录开始搜索的缓冲区(或评估缓冲区的函数)。