定义自定义emacs的查找-搜索快捷键

3

Emacs支持M-x find-grep命令,该命令可以搜索字符串并打开两个缓冲区。其中一个缓冲区显示搜索结果,另一个缓冲区则显示包含搜索字符串的文件。

目前,M-x find-grep展开为以下命令:Run find (like this): find . -type f -exec grep -nH -e {} +

如何修改find-grep(或定义新的快捷键),以添加更多选项到grep和find命令中(例如:忽略日志文件或仅包括Java文件find . -iname '*.java')。

2个回答

1
快速且简单的方法是在find-grep前加上前缀,即C-u M-x find-grep。这样可以在执行之前编辑命令行。
如果您想永久更改它,可以定义一个包装器。这适用于rgrep,但find-grep应该类似。
(defvar grep-context-lines 2
  "Default number of context lines (non-matching lines before and
  after the matching line) for `rgrep-context'.")

(defun rgrep-context (arg)
  "Like `rgrep', but adds a '-C' parameter to get context lines around matches.

Default number of context lines is `grep-context-lines', and can
be specified with a numeric prefix."
  (interactive "p")
  (setq arg (or arg grep-context-lines))
  (let ((grep-find-template
         (format "find <D> <X> -type f <F> -print0 | xargs -0 -e grep <C> -nH -C %d -e <R>"
                 arg))
        grep-host-defaults-alist
        current-prefix-arg)
    (call-interactively 'rgrep)))

注意:您的grep-find-template可能不同;最好修改默认值而不是仅复制此值。默认值由grep-compute-defaults生成。

1
在我的系统上(mac osx,emacs 25.3.1),我不得不调整grep-find-template的格式。这个设置不使用xargs并且失败了。将其调整为更好地匹配grep-find-tempate的当前内容很容易解决这个问题。我的格式规范现在是(format "find <D> <X> -type f <F> -exec grep <C> -nH -C %d -e <R> {} +" arg)。由于emacs rgrep使用外部程序(grep),这对其他系统也可能是一个问题。 - Iain
@Iain 谢谢,生成默认值的逻辑相当复杂,而且在不同的系统中可能会有所不同。我已经记录下来修改您的默认值,而不仅仅是复制我的。 - jpkotta

1
请勿修改 find-grep 命令。如果需要,可以参考该命令的代码编写类似的命令。如果需要,可以从该命令的代码中复制一份作为起点。在实现 find . -type f -exec grep -nH -e () + 部分时,替换为自己喜欢的命令行。可以根据个人口味进行简化和调整(例如,find . -iname '*.java')。 findgrep 都有自己的语言(语法),尤其是 find。要使用它们,您需要知道 (1) 您想要做什么,以及 (2) 如何使用它们的语言来实现。
除非您明确说明您要做什么,否则我们在此只能提供有关从 Emacs 调用 findgrep 的一般指导 -- 请参考上面的 find-grep 代码。

感谢您的回复。我该如何编写我的find-grep呢?比如说java-find-grep,它包括一个额外的选项来查找命令(-iname '*.java')。 - user462455
正如我所说的,复制find-grep的定义,将副本的命令名称更改为java-find-grep,并将您想要的find命令替换为find-grep定义中使用的命令。 要查找find-grep的定义,请使用C-h f find-grep RET - Drew
C-h f find-grep RET 给出了 find-grep 函数的描述,但我无法找到该函数的源代码。 - user462455
点击C-h f帮助缓冲区顶部附近的文件名(grep.el)。这应该会带您到命令定义处。如果没有,那么尝试使用M-x find-library grep.el来找到文件。(如果您没有源文件,则没有完整的Emacs安装。) - Drew
注意:如果需要,请搜索其他关于找不到源代码的问答。 - phils

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接