如何让grep在Windows上的Emacs中工作(EmacsW32)

如何让grep在Windows上的Emacs中工作(EmacsW32),windows,emacs,grep,emacsw32,Windows,Emacs,Grep,Emacsw32,M-x grep、M-x lgrep、M-x rgrep在EmacsW32中不适合我 我做M-x lgrep,它说grep不是命令: grep -i -n "hello" * NUL 'grep' is not recognized as an internal or external command, operable program or batch file. Grep finished with no matches found at Sun Jan 31 05:59:06 那是什么

M-x grep、M-x lgrep、M-x rgrep在EmacsW32中不适合我

我做M-x lgrep,它说grep不是命令:

grep -i -n "hello" * NUL
'grep' is not recognized as an internal or external command,
operable program or batch file.

Grep finished with no matches found at Sun Jan 31 05:59:06
那是什么玩意儿?EmacsW32主页上说它附带了Gnuwin32实用程序,但似乎将配置为实际使用Gnuwin32 grep的工作留给了用户


如何将其配置为使用附带的Gnuwin32 grep或cygwin grep?两者都很好吗?

Windows没有
grep
实用程序(事实上它确实有
findstr
,但并不完全相同),因此您需要安装类似或的工具。安装后,您需要将它们添加到
%PATH%
,以便windows知道在何处查找它们。您可以在命令行中运行
cmd.exe
并发出命令
set PATH=;%PATH%
或在某些设置中,右键单击“我的电脑”图标(称为类似于环境变量的东西是它的一些图片)即可获得

请注意,windows有一个名为
find
的实用程序,它也位于system
%PATH%
中,可以使某些命令(如
M-x grep find
)无法正常工作,因此将unix find放在
%PATH%
的第一位非常重要。您有一些关于如何使其工作的提示

我在前几天做了这个工作,您可以在emacs中设置PATH环境变量,如果您安装了cygwin和/或gnuw32,只需将路径设置为这些。这是my.emacs中的一个片段,仅适用于windows。我将变量(cygwin-bin,gnu-bin)设置为安装程序的路径。然后构建通往这些目标的路径。一个缺点是它吹走了我剩下的路。到目前为止,这还不是个问题,但如果我能更聪明地使用LISP,我可能会想出一些办法。不管怎样,希望这有帮助

;;windows only stuff

(when (string-equal system-type "windows-nt")

(progn

(setq cygwin-bin "c:\\apps\\cygwin\\bin")

(setq gnu-bin "C:\\apps\\GnuWin32\\gnuwin32\\bin")

(setenv "PATH"

(concat cygwin-bin ";" gnu-bin ";"))

(setq exec-path

'(cygwin-bin gnu-bin)))) 

我应该补充一点,我得出这个解决方案是因为在windows中把qnuwin32放在路径前面似乎是一个危险的提议,你可能会弄乱机器上的其他程序。因此,这似乎是一个很好的折衷方案。

我认为EmacsW32用户首先需要通过菜单
Options>Customize EmacsW32
设置用户选项
W32 shell
,该菜单最初设置为none,用户应该将其设置为cmd或cygwin。将其设置为cmd意味着M-x grep将使用内置的Gnuwin32 grep(并将cmd.exe作为shell),如果设置保存正确,则dotemacs将包含如下行:

(custom-set-variables
 ...  
 '(w32shell-shell (quote cmd))
 ...)
自定义设置变量表单应尽可能靠近dotemacs的开头

由于某种原因,在我的系统中,这是不够的,M-x grep将坚持使用“grep-n”作为其模板,而不是“grep-nH-e”,并且它总是附加“NUL”。在这种情况下,在dotemacs文件中添加以下行

(grep-compute-defaults)

下面是一个毫无意义的答案:


享受吧

我使用Cygwin(旧版本)。对于Emacs,我使用库,并按该顺序加载。很好。

是的,两个grep都可以
NUL
是一个伪文件,相当于Unix中的
/dev/null
,其行为类似于一个空文件。我认为这样做的目的是,如果您忘记将文件列表放在命令行上,
grep
不会失败并显示错误消息(因为存在文件NUL),但是如果您确实考虑提供文件,NUL将被忽略(因为它从不匹配)。如果这是原因的话,这对Emacs创建者来说有点令人毛骨悚然。您是否将PATH变量设置为包含具有
grep
命令的目录?如果EmacsW32提供了
grep
,则它应该位于显著位置。如果安装了
git bash
,则可以在Windows路径变量中包含
…\git\usr\bin
,其中。。。是git bash安装的路径。如果您已经安装了git for windows,请在路径末尾添加以下内容:C:\Program Files\git\usr\b如果设置变量
exec path
,是否仍然需要
setev“path”