如何在Emacs中使用M-x rgrep和git grep命令?

时间:2014-09-02 22:38:24

标签: emacs grep elisp

我希望能够使用正常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}}命令 存储。

3 个答案:

答案 0 :(得分:13)

M-x vc-git-grepC-x v f)怎么样?不能满足你的需求吗?

它会提示您:

  • 搜索模式(默认:点或区域的标记)
  • filename pattern(默认值:当前文件后缀)
  • 基本搜索目录(默认,当前目录)

很适合我。

答案 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是一个从其目录开始搜索的缓冲区(或评估缓冲区的函数)。