【问题标题】:emacs rgrep fails in find command (Windows 7)emacs rgrep 在 find 命令中失败(Windows 7)
【发布时间】:2013-06-19 17:37:47
【问题描述】:

这似乎是一个愚蠢的问题,也许应该将它定向到 gnuwin32 的论坛,但我会在这里尝试一下。

我在 Windows 的 emacs 中使用 grep。我不得不使用 grep-find vs rgrep,我更喜欢使用它,因为它清除了许多我不想 grep 的文件。不幸的是,rgrep 似乎创建了一个“查找”命令,该命令太长以至于阻塞并给出错误。

使用 M-x rgrep 在我的 python 文件中搜索“导入”(我知道这是个愚蠢的例子)给出以下输出:

找到 . -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" {} + find:路径必须在表达式之前 用法:find [-H] [-L] [-P] [路径...] [表达式]

如果我将此命令剪切并粘贴到 cygwin 窗口中,该窗口从 /usr/bin 中提取 find,它可以正常工作并找到多个实例。如果我将相同的命令粘贴到然后使用 gnuwin32/bin/find.exe 的 cmd 窗口中,我会得到与上面相同的错误(查找:路径必须在表达式之前)。我还在 mingw shell 中尝试了该命令,它在那里工作(使用 /msys/1.0/bin/find.exe)。更复杂的是,将 find 的 mingw 版本复制到 /gnuwin32/bin/ 没有帮助。没有错误,但 grep 从来没有真正找到任何东西。更糟糕的是,这样做会以同样的方式破坏“grep-find”;什么都找不到。

我猜在使用 gnuwin32 版本的 'find' 时,我在这里击中的整个命令的长度是有限制的。

我想我可以放弃 gnuwin32 并将我的路径更改为指向 /msys/1.0/bin 以获取我使用的命令,但这些命令将不再在 cmd 窗口中运行,至少没有访问 mingw DLL。我的一部分想知道为什么 gnuwin32 版本的 find 令人窒息。有任何想法吗?抱歉这个冗长的问题。

【问题讨论】:

标签: emacs find gnuwin32


【解决方案1】:

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")))

【讨论】:

  • 实际上,我必须确保在 gnuwin32 之前添加了 mingw 的东西来设置优先级。在我的 .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")
【解决方案2】:

对我来说,这个问题的正确答案是在这里找到的:

Gnuwin32 find.exe expands wildcard before performing search

我下载了上述答案中列出的unxutils.zip,并将 find.exe 从那里提取到我的 emacs bin 文件夹中。我不建议将复制到 emacs bin 文件夹作为最佳实践,但它可以避免大量配置开销,并且可以让您立即启动并运行。

【讨论】:

  • 感谢您的交叉引用。我支持您,并认为您的答案与我使用的答案一样有效。
猜你喜欢
  • 2023-04-06
  • 1970-01-01
  • 2014-02-08
  • 1970-01-01
  • 1970-01-01
  • 2010-10-08
  • 1970-01-01
  • 1970-01-01
  • 2014-10-10
相关资源
最近更新 更多