Emacs中的lgrep和rgrep

时间:2009-02-17 02:43:30

标签: emacs grep

我遇到了Emacs中的greps问题。

a)grep似乎并不理解。[ch]用于搜索.c和.h文件。这是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并找到v4.2.20。

我错过了什么?

更新

太糟糕了,不能接受多个答案......因为我的问题的解决方案已经散布开来。

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

这解决了第一个问题。谢谢luapyad!

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

emacs确实使用了Windows find.exe。强制gnu32找到修复了第二个问题。谢谢scottfrazer。

但是,我仍然最喜欢ack

6 个答案:

答案 0 :(得分:6)

我发现使用:

(setq find-program "\"C:/path/to/GnuWin32/bin/find.exe\"")
(setq grep-program "\"C:/path/to/GnuWin32/bin/grep.exe\"")

在Windows中可以更好地工作,因为你可以在路径周围放置一个空间并最终搞砸。

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

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

答案 1 :(得分:5)

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

对于b)Windows正在尝试使用自己的find而不是GNU W32 Utils中的find。尝试:

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

答案 2 :(得分:5)

好吧,总有AckAck.el

答案 3 :(得分: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

答案 4 :(得分:2)

我认为一般的问题是windows cmd“shell”在文件名扩展regexps和通配符方面与unix shell的行为非常不同。

要回答上述(a),请尝试使用:

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

(如果不存在* .c或* .h,您仍会得到“无效参数”。)

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

答案 5 :(得分: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找到它为止。

抱歉,我对Windows选项无法提供更多帮助,但我对它们并不熟悉。