emacs在Windows 7中的查找命令中出现rgrep失败

4
这似乎是一个愚蠢的问题,也许应该向gnuwin32论坛询问,但我会在这里尝试一下。
我正在使用Windows中的emacs进行grep。由于要过滤掉很多不需要查找的文件,因此我必须使用grep-find而不是rgrep,虽然我更喜欢使用rgrep。不幸的是,rgrep创建的“find”命令太长了,导致出现错误。
在我的Python文件中使用M-x rgrep搜索“import”(这只是一个简单的例子)将产生以下输出:

使用find命令查找指定目录下所有后缀名为.py的文件中包含"import"字符串的行号以及所在文件的路径。

命令如下:

find . -type d "(" -path "/SCCS" -o -path "/RCS" -o -path "/CVS" -o -path "/MCVS" -o -path "/.svn" -o -path "/.git" -o -path "/.hg" -o -path "/.bzr" -o -path "*/_MTN" -o -path "*/_darcs" -o -path "/{arch}" ")" -prune -o "(" -name ".#" -o -name ".o" -o -name "~" -o -name ".bin" -o -name ".bak" -o -name ".obj" -o -name ".map" -o -name ".ico" -o -name ".pif" -o -name ".lnk" -o -name ".a" -o -name ".ln" -o -name ".blg" -o -name ".bbl" -o -name ".dll" -o -name ".drv" -o -name ".vxd" -o -name ".386" -o -name ".elc" -o -name ".lof" -o -name ".glo" -o -name ".idx" -o -name ".lot" -o -name ".fmt" -o -name ".tfm" -o -name ".class" -o -name ".fas" -o -name ".lib" -o -name ".mem" -o -name ".x86f" -o -name ".sparcf" -o -name ".dfsl" -o -name ".pfsl" -o -name ".d64fsl" -o -name ".p64fsl" -o -name ".lx64fsl" -o -name ".lx32fsl" -o -name ".dx64fsl" -o -name ".dx32fsl" -o -name ".fx64fsl" -o -name ".fx32fsl" -o -name ".sx64fsl" -o -name ".sx32fsl" -o -name ".wx64fsl" -o -name ".wx32fsl" -o -name ".fasl" -o -name ".ufsl" -o -name ".fsl" -o -name ".dxl" -o -name ".lo" -o -name ".la" -o -name ".gmo" -o -name ".mo" -o -name ".toc" -o -name ".aux" -o -name ".cp" -o -name ".fn" -o -name ".ky" -o -name ".pg" -o -name ".tp" -o -name ".vr" -o -name ".cps" -o -name ".fns" -o -name ".kys" -o -name ".pgs" -o -name ".tps" -o -name ".vrs" -o -name ".pyc" -o -name ".pyo" ")" -prune -o -type f "(" -iname "*.py" ")" -exec grep -i -nH -e "import" {} +

如果我将此命令复制并粘贴到使用 /usr/bin 中的find的cygwin窗口中,它可以很好地正常工作并找到多个实例。如果我将相同的命令粘贴到使用 gnuwin32/bin/find.exe 的 cmd 窗口中,则会出现与上述相同的错误(find: paths must precede expression)。我还尝试了在 mingw shell 中运行该命令(使用 /msys/1.0/bin/find.exe),并且可以正常运行。为了使事情更加复杂,将mingw版本的find复制到 /gnuwin32/bin/ 中并没有帮助。没有错误,但 grep 永远不会发现任何东西。更糟糕的是,这样做也以相同的方式破坏了 'grep-find' ;完全找不到任何内容。
我猜测我使用 gnuwin32 版本的“find”时,总命令长度达到了限制。
我认为我可以放弃使用 gnuwin32,并将我的路径更改为指向我使用的命令的 /msys/1.0/bin,但是这些命令将不再在 cmd 窗口中运行,至少没有访问 mingw DLL 的情况下不行。部分原因想知道为什么 gnuwin32 版本的 find 发生故障。有任何想法吗?对于这个冗长的问题,我表示抱歉。

1
为什么gnuwin32版本的find命令会出现问题 - 可能是因为gnuwin32-find-exe-expands-wildcard-before-performing-search - npostavs
2个回答

3

Emacs知道可执行文件在哪里吗?

我的.emacs文件中有类似以下的内容,你可以根据自己的文件路径进行调整。

 ;;; excutable paths (for unix commands from MSYS and git from msysgit)
 (setq exec-path (append exec-path
                         '("C:/MinGW/msys/1.0/bin/"
                           "C:/MinGW/bin/"
                           "c:/MinGW/mingw32/bin"

                           "C:/Program Files (x86)/Git/bin")))

1
实际上,我必须确保在设置优先级之前添加mingw的内容,然后再添加gnuwin32。就像这样在我的.emacs文件中:(setenv "PATH" (concat (expand-file-name "C:/mingw/msys/1.0/bin/") path-separator (getenv "PATH"))) (add-to-list 'exec-path "C:/mingw/mingw32/bin") - Rich von Lehe

3
对我来说,这个问题的正确答案在这里找到了:Gnuwin32 find.exe expands wildcard before performing search
我下载了上面答案中提到的unxutils.zip,并从中提取了find.exe放到我的emacs bin文件夹中。虽然我不建议把它复制到emacs bin文件夹中作为最佳实践,但这样做可以避免很多配置开销,并且可以让您立即运行起来。

感谢您提供的交叉参考。我已经为您点赞,并认为您的答案与我使用的答案同样有效。 - Rich von Lehe

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