Emacs中的lgrep和rgrep

6

我在Emacs中使用grep时遇到了问题。

a) grep似乎不理解用于搜索.c和.h文件的.[ch]。这是Emacs提供的默认选项,使用lgrep命令。以下示例是在.c/.h文件中搜索单词“global”。

grep -i -nH "global" *.[ch]
grep: *.[ch]: No such file or directory

Grep exited abnormally with code 2 at Mon Feb 16 19:34:36

这个格式是否无效?

b) 使用rgrep时我遇到了以下错误:

find . "(" -path "*/CVS" -o -path "*/.svn" -o -path "*/{arch}" -o -path "*/.hg" -o -path "*/_darcs" -o -path "*/.git" -o -path "*/.bzr" ")" -prune -o  -type f "(" -iname "*.[ch]" ")" -print0 | xargs -0 -e grep -i -nH "global"
FIND: Wrong parameter format

Grep finished (matches found) at Mon Feb 16 19:37:10

我在Windows XP上使用Emacs 22.3.1以及GNU W32 Utils(grep、find、xargs等)。Grep v2.5.3和find v4.2.20。

我缺少什么?

更新:

很遗憾,由于解决方案分散,无法接受多个答案...

grep -i -nH "global" *.c *.h

这解决了第一个问题。感谢luapyad!
(setq find-program "c:\\path\\to\\gnuw32\\find.exe")

实际上,emacs使用的是Windows的find.exe。强制使用gnu32 find解决了第二个问题。感谢scottfrazer。

但是,我仍然最喜欢ack


1
使用rgrep的更简单方式是: grep -r --include=*.[ch] --exclude=*/{CVS,.svn,arch,.hg,_darcs,.git,.bzr} -i -nH global . - Adam Rosenfield
1
你能否修改你的帖子以准确反映find-program的答案?今天你给我造成了一些困难。区别在于需要双反斜杠。(setq find-program "C:\path\to\gnuw32\find.exe") - Matthew Talbert
@Matthew Talbert,我认为Markdown处理器吞噬了额外的反斜杠。我提交了一个编辑来修复它。 - Alan
6个回答

6
我发现使用以下代码可以:
(setq find-program "\"C:/path/to/GnuWin32/bin/find.exe\"")
(setq grep-program "\"C:/path/to/GnuWin32/bin/grep.exe\"")

在Windows系统中更为有效,因为你可能会在路径上留下空格,最终会出现问题。

请注意我在.emacs文件中使用了这两个程序。

希望能对其他需要的程序员有所帮助;)


5

对于a),看起来当前目录中根本没有 .c 或 .h 文件。

对于b),Windows 试图使用自己的查找功能,而不是 GNU W32 Utils 中的查找功能。尝试:

(setq find-program "c:\\path\\to\\gnuw32\\find.exe")


今天这帮了我不少,谢谢! - Matthew Talbert

5

好的,有两个工具可以使用,一个是Ack,另一个是Ack.el


糟糕!我完全忘记了 Ack!在 Vim 中非常喜欢它。谢谢! - cschol

4

Adam Rosenfield的评论值得进一步扩展成为一个答案:

grep -r --include=\*.[ch] --exclude=\*{CVS,.svn,arch} -i -nH

为了让这个问题中给出的示例起作用,请使用以下内容:

为了使本问题中给出的示例起作用,请使用以下内容:

grep -i -nH --include=\*.[ch] "global" *

设置变量grep-command对于提供M-x grep的默认值也是有帮助的:

(setq grep-command "grep -i -nH --include=\*.[ch] ")

此外,这里还有一些其他有用的命令行参数可以用于grep:

-n print the line number

-s suppress error messages

-r recursive

2
我认为总体问题在于Windows cmd“shell”在文件名扩展正则表达式和通配符方面与Unix shell表现非常不同。
要回答您上面的问题(a),请尝试使用以下命令:
grep -i -nH "global" *.c *.h

如果不存在 *.c 和 *.h 文件,您仍将收到“无效参数”的提示。

或者,您可以使用命令行选项 --include=\*.[ch] ,使Windows grep执行“正确”的文件名模式匹配(请参见 grep --help 获取其他选项)。


1

我通常只使用M-x grep,如果需要的话就在提示时更改命令行参数。但是我刚刚尝试运行M-x lgrep,得到了和你一样的结果。这意味着当前目录中没有匹配*.[ch]的文件。您可以自定义默认选项以包括-r并递归搜索子目录:

M-x customize-group RET grep RET

在该缓冲区中搜索lgrep以查找/编辑Grep模板。

就M-x rgrep而言,我怀疑它与Windows版本的find不喜欢默认选项有关。该命令在Linux上对我很好用。在同一自定义缓冲区中搜索rgrep并调整这些选项,直到Windows find满意为止。

很抱歉我无法提供更多有关Windows选项的帮助,因为我不熟悉它们。


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