我想使用 Emacs 在 Windows PC 中的一堆文件中搜索关键字“action”。
一方面是因为想学习 emacs 的更多高级功能,另一方面是因为 Windows PC 被公司政策锁定了,没法随意安装 cygwin 等有用的应用程序。
所以我尝试了这个命令:M-x rgrep
它抛出以下错误消息:
*- mode: grep; default-directory: "c:/Users/me/Desktop/Project" -*-
Grep started at Wed Oct 16 18:37:43
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 "*.sh" ")" -exec grep -i -n "action" {} NUL ";"
FIND: Parameter format not correct
Grep exited abnormally with code 2 at Wed Oct 16 18:37:44
我相信rgrep
尝试过创建一个进程并使用所有参数调用“FIND”。但是,由于它是 Windows,默认Find
可执行文件根本不知道如何处理。
在 Windows 平台的 Emacs 中,在多个文件中搜索关键字的更好方法是什么,而无需依赖外部程序?
Emacs 版本:24.2.1
答案1
如果你使用迪雷德+和冰柱然后您可以递归搜索 Dired 缓冲区中的所有标记文件,包括在标记子目录中标记的文件,依此类推。
冰柱搜索是一种不同的增量搜索。你定义搜索上下文,即您要搜索的文本部分。您可以通过提供它们匹配的正则表达式来定义上下文。在
rgrep
类似行为的简单情况下,上下文只是单独的文本行,因此上下文定义正则表达式是.*
(匹配除换行符之外的任何内容)。这里概述冰柱搜索(和替换)行为。
如果你已经加载了 Icicles 和 Dired+,那么搜索当前 Dired 缓冲区内及下方所有标记文件的命令就在键上
M-s M-s m
,它在 Dired 模式菜单栏中为Multiple > Marked Here and Below > Icicles >
Icicles Search (and Replace)
。如果你使用仅有的 迪雷德+并且也不是冰柱,您仍然可以递增地搜索当前 Dired 目录和所有子目录中标记的所有文件(递归)。在这种情况下,搜索使用普通的 Emacs Isearch。在 Dired 模式下,此功能的键为
M-+ M-s a C-s
(string search, commanddiredp-do-isearch-recursive
) 和M-+ M-s a C-M-s
(regexp search, commanddiredp-do-isearch-regexp-recursive
)。还有非增量版本 commanddiredp-do-search-recursive
,它绑定到M-+ A
。(还有用于查询替换当前 Dired 目录中及下方标记文件的键/命令。)如果你有迪雷德+和冰柱并且您只对查找给定的一组文件中哪个文件包含给定的关键字感兴趣,也就是说,您不是在搜索该关键字的出现位置,而只想知道它是否存在,那么您可以使用
M-+ C-F
(commandicicle-visit-marked-file-of-content-recursive
,menuMultiple > Marked Here and Below > Icicles > Open File of Content
)。最后再说一下如何处理标记为“此处及下方”的文件:您可以标记子目录而不标记其任何文件,这与标记其每个文件具有相同的效果。请参阅迪雷德+了解更多信息。
答案2
打开您要搜索的目录dired-mode
。然后标记所有您要搜索的文件,最后执行M-x dired-do-search RET keyword RET
。
这将在标记的文件中搜索keyword
。