在Emacs中搜索文件的命令

74

我想在当前文件夹中的所有文件中搜索宏CODE_INIT_PARAMETERS

我可以使用Alt+XoccurReturn CODE_INIT_PARAMETERS Return,但这只显示已打开的缓冲器中的条目。

是否有一种方法可以从Emacs中搜索当前文件夹中的所有文件,而不需要切换到M-x shell,然后使用grep?我想要避免使用grep,因为对于某些命令(如M-x occur),Emacs会跳转到有问题的代码,我也希望如此。

7个回答

134
你可以尝试M-x rgrep
它会询问:
  • 您想要递归搜索的目录
  • 要包含在搜索中的文件模式
  • 您要搜索的模式
额外地,它将从搜索中排除源代码控制私有目录(如 CVS、.svn 或 .git)。

5
你需要使用 GnuWin32 中的 grep 和 find 命令,并且 GNU 的 find 命令必须在 Windows 的 find.exe 命令之前出现在 PATH 环境变量中。EmacsW32 已经安装了 grep 和 find 命令。 - Jazz
我还要补充一点,rgrep 有些问题。例如,当我输入文件的模式时,它找不到任何内容。经过一番努力,我发现了原因:它不知道点的含义。也就是说,我想在 .h.c.cpp 文件中搜索一个模式,但是我输入的模式 .*\.[ch].* 是错误的,正确的应该是 *\.[ch]* - Hi-Angel

14

Emacs提供了一个内置命令:

M-x grep RET CODE_INIT_PARAMETERS *.c

虽然我更喜欢外部包igrep提供的界面(它提供了命令igrepigrep-find,并且可以搜索子目录)。


M-x grep-find 还允许您像 occur 一样迭代结果。 - seth
1
你不需要像这样做吗?M-x grep "CODE_INIT_PARAMETERS" *.c值得一提的是,使用前缀参数将自动设置搜索以寻找光标所在位置和你所处文件类型的内容。C-U M-x grep - justinhj
@justinhj,非常正确。我没有使用M-x grep的缺点显而易见。 - Trey Jackson
谢谢,我对emacs还很陌生,之前不知道M-x grep和igrep.el这两个工具。它们非常完美地完成了我的工作。谢谢。 - grayasm

8
如果您在dired中打开一个文件夹,并标记了所有的文件(使用“m”),您可以运行“dired-do-search”(我的绑定中是“A”)来搜索所有标记的文件。要进入下一个文件,请运行“tags-loop-continue”(M-,)。
我已经设置了几个ELisp函数来标记各种文件子集(.h文件,.cpp文件等),并创建递归的dired以搜索整个目录树...

1
我必须为我的绑定做些事情。它能工作,但目前不太方便。谢谢。 - grayasm

6

M-x find-grep-dired与rgrep类似,也是用于搜索文本的命令。


6
这是对Trey Jackson建议的改进。
M-x grep 您将看到grep命令,例如grep -nH -e 在第一组标志中添加R(递归),并在-e后放置您的搜索词。
grep -nHR -e CODE_INIT_PARAMETERS

按下RET键。结果将被Emacs解释并且你可以像M-x occur一样点击或者导航到它们,这个和IT技术有关。你可能需要在命令的末尾加上搜索目录:

grep -nHR -e CODE_INIT_PARAMETERS /path/to/root/of/search

1
是的,这就是为什么我喜欢 'igrep,它的界面更加直观。 - Trey Jackson

2

在以下情况下:

  1. 您可能会重复搜索;并且
  2. etags 可以工作

您可以考虑使用 etags 并调用 find-tag(默认绑定为 M-.)或 tags-search(没有默认绑定,但可以使用 M-, 继续)。


1

Emacs 也有 ack-grep mode,它使用专门为“grepping”编程语言设计的ack-grep工具,并且在我看来比 M-x grep 的输出更漂亮。

但是如前所述,etags 应该是正确的方法!


RipGrep 的性能比 Ack、Ag、pt、git grep 等工具都要快得多...(来源:https://blog.burntsushi.net/ripgrep/) - ocodo

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