題 如何在沒有cygwin的Windows中的emacs中搜索“在文件中搜索關鍵字”?


我想在我的帶有Emacs的Windows PC中的一堆文件中搜索關鍵字,“動作”。

部分原因是因為我想學習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


3
2017-10-16 07:53


起源




答案:


  1. 如果你使用 Dired + 和 冰柱 然後,您可以遞歸搜索Dired緩衝區中的所有標記文件,包括標記在子標記中的文件,依此類推。

    冰柱搜索是一種不同的增量搜索。你定義 搜索上下文,這是您要搜索的文本的一部分。您可以通過提供匹配的正則表達式來定義上下文。在一個簡單的情況下 rgrep類似行為,上下文只是單獨的文本行,因此上下文定義正則表達式 .* (匹配除換行符之外的任何內容)。

    這裡 是一個概述 冰柱搜索(和替換) 行為。

    如果您同時加載了Icicles和Dired +,那麼搜索當前Dired緩衝區中和下方所有標記文件的命令都是在鍵上 M-s M-s m,它在Dired模式菜單欄中 Multiple > Marked Here and Below > Icicles >Icicles Search (and Replace)

  2. 如果你使用 只要  Dired + 而且也不是 冰柱,您仍然可以逐步搜索當前Dired目錄和所有子目錄中標記的所有文件(遞歸)。在這種情況下,搜索使用普通的Emacs Isearch。在Dired模式下,其關鍵是 M-+ M-s a C-s (字符串搜索,命令 diredp-do-isearch-recursive)和 M-+ M-s a C-M-s (正則表達式搜索,命令 diredp-do-isearch-regexp-recursive)。還有非增量版本命令 diredp-do-search-recursive,這是必然的 M-+ A。 (還有用於查詢的鍵/命令 - 替換當前Dired目錄中和下方的標記文件。)

  3. 如果你有 Dired + 和 冰柱 並且您只對查找給定文件集中的哪一個包含給定關鍵字感興趣,也就是說,您沒有搜索該關鍵字的出現但只想知道它是否存在,那麼您可以使用 M-+ C-F (命令 icicle-visit-marked-file-of-content-recursive,菜單 Multiple > Marked Here and Below > Icicles > Open File of Content)。

  4. 關於處理標記為“此處和下方”的文件的最後一句話:您可以標記子目錄而不標記其任何文件,以獲得與標記其每個文件相同的效果。看到 Dired + 了解更多信息。


2
2017-11-03 23:47





打開要搜索的目錄 dired-mode。然後標記要搜索的所有文件,最後完成 M-x dired-do-search RET keyword RET

這將搜索標記的文件 keyword


1
2017-10-16 16:48



是的,它確實回答了這個問題。它唯一不做的是遞歸地搜索子目錄和子子目錄等中的文件。是, rgrep 搜索這樣的後代目錄,但@Dror的答案響應OP請求搜索“一堆文件”: A (dired-do-search)是一個很好的答案。沿著同樣的路線,更好的答案是 M-s a C-s (dired-do-isearch)。 - Drew
你也可以打 i 當該點位於子目錄中時,這將使其位於同一緩衝區中的列表中。 - Dror