我遇到了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。
答案 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)
答案 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选项无法提供更多帮助,但我对它们并不熟悉。