emacs rgrep 在 find 命令中失败(Windows 7)

问题描述 投票:0回答:3

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

我在 Windows 版 emacs 中使用 grep。 我不得不使用 grep-find 与 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-名称“.pif”-o-名称“.lnk”-o-名称“.a”-o-名称“.ln”-o-名称“.blg” -o -名称“.bbl”-o -名称“.dll”-o -名称“.drv”-o -名称“.vxd”-o -名称“.386”-o-名称“.elc”-o-名称“.lof”-o-名称“.glo”-o-名称“.idx”-o-名称“.lot” -o -name ".fmt" -o -name ".tfm" -o -name ".class" -o -name ".fas" -o -名称“.lib”-o-名称“.mem”-o-名称“.x86f”-o-名称“.sparcf”-o-名称“.dfsl”-o-名称“。 pfsl" -o -name ".d64fsl" -o -name ".p64fsl" -o -name “.lx64fsl”-o-名称“.lx32fsl”-o-名称“.dx64fsl”-o-名称“.dx32fsl”-o-名称“.fx64fsl”-o-名称“.fx32fsl” -o -名称“.sx64fsl”-o -名称“.sx32fsl”-o-名称“.wx64fsl”-o-名称“.wx32fsl”-o-名称“.fasl”-o-名称“.ufsl”-o-名称“。 fsl" -o -name ".dxl" -o -name ".lo" -o -name “.la”-o-名称“.gmo”-o-名称“.mo”-o-名称“.toc”-o-名称“.aux”-o-名称“.cp” -o -name ".fn" -o -name ".ky" -o -name ".pg" -o -name ".tp" -o -name “.vr”-o-名称“.cps”-o-名称“.fns”-o-名称“.kys”-o-名称“.pgs”-o-名称“.tps” -o -name ".vrs" -o -name ".pyc" -o -name ".pyo" ")" -prune -o -type f "(" -iname "*.py" ")" -exec grep -i -nH -e "导入" {} + 查找:路径必须位于表达式之前 用法:find [-H] [-L] [-P] [路径...] [表达式]

如果我将此命令剪切并粘贴到 cygwin 窗口中,该窗口从 /usr/bin 中提取 find ,它就可以正常工作并找到多个实例。 如果我将相同的命令粘贴到 cmd 窗口中,然后使用 gnuwin32/bin/find.exe,我会得到与上面相同的错误(查找:路径必须在表达式之前)。 我还在 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 令人窒息。 有什么想法吗? 抱歉问了这么长的问题。

emacs find gnuwin32
3个回答
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")))

3
投票

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

Gnuwin32 find.exe 在执行搜索之前扩展通配符

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


0
投票

老问题,但它仍然适用。 我使用的是 Windows 11、emacs 29.4 .

我安装了

unxUtils
包,希望 find、grep、xargs 能够在 emacs 中的递归 grep 中正常工作。但没有喜悦。 在一般情况下,xargs 会发出类似“无法分叉”的错误。 这已经被观察了很长时间了。

但是我今天了解到的是,Git 在

GIT-INSTALL-DIR\usr\bin
中为 Windows 安装了类似 unix 的实用程序。 就我而言,它是
c:\progra~1\Git\usr\bin
,其中有 grep、find、xargs 等。 它们工作正常,xargs 不会抱怨。

所以

(cond
 ((eq system-type 'windows-nt)
  ;; The unxUtils commands don't work, xargs "cannot fork". Git ships with
  ;; unix-ish tools that actually work.
  (let ((git-bin-dir "c:\\progra~1\\Git\\usr\\bin"))
    (if (file-exists-p git-bin-dir)
        (progn
          (grep-apply-setting 'grep-command
                              (replace-regexp-in-string "PATH" git-bin-dir "PATH\\grep.exe -i -n "))

          ;; i don't know why there is both grep-find-command and grep-find-template
          (grep-apply-setting 'grep-find-command
                              (replace-regexp-in-string "PATH" git-bin-dir
                                                        "PATH\\find.exe . -type f -print0 | PATH\\xargs.exe -0 PATH\\grep.exe -i -n "))

          (grep-apply-setting 'grep-find-template
                              (replace-regexp-in-string "PATH" git-bin-dir
                                                        "PATH\\find.exe <D> <X> -type f <F> -print0 | PATH\\xargs.exe -0 PATH\\grep.exe <C> -n --null -e <R>")))))))

然后我就可以

M-x rgrep
并且它按预期工作。

HTH

© www.soinside.com 2019 - 2024. All rights reserved.