这似乎是一个愚蠢的问题,也许应该将其定向到 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 知道可执行文件在哪里吗?
我的
.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 find.exe 在执行搜索之前扩展通配符
我下载了上面答案中列出的unxutils.zip,并将 find.exe 从那里提取到我的 emacs bin 文件夹中。我不建议将复制到 emacs bin 文件夹作为最佳实践,但它可以避免大量配置开销,并且可以让您立即启动并运行。
老问题,但它仍然适用。 我使用的是 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