Emacs 查找文件:获取由包含文本的筛选器指定的文件的dired缓冲区

Emacs 查找文件:获取由包含文本的筛选器指定的文件的dired缓冲区,emacs,dired,Emacs,Dired,这似乎是一个非常典型的用例,但如果我能弄明白的话,我会被诅咒的。一定有什么基本的东西我错过了 find dired基本上是find命令的前端,它生成结果的dired缓冲区 《寻找格雷普》似乎比《寻找》更像是格雷普的前端。并生成一个dired缓冲区,但它搜索目录树中的所有文件 我想要的是能够从给定的路径开始,搜索*.css中的某个id,并让它为我提供一个dired缓冲区以供进一步处理 似乎所有的碎片都在那里,但我还没有弄明白。所以我想这是我可能错过的基本点 听起来您正在寻找的函数是。它将使用您提供

这似乎是一个非常典型的用例,但如果我能弄明白的话,我会被诅咒的。一定有什么基本的东西我错过了

find dired基本上是find命令的前端,它生成结果的dired缓冲区

《寻找格雷普》似乎比《寻找》更像是格雷普的前端。并生成一个dired缓冲区,但它搜索目录树中的所有文件

我想要的是能够从给定的路径开始,搜索*.css中的某个id,并让它为我提供一个dired缓冲区以供进一步处理


似乎所有的碎片都在那里,但我还没有弄明白。所以我想这是我可能错过的基本点

听起来您正在寻找的函数是。它将使用您提供的表达式调用grep实用程序,并在交互式缓冲区中收集输出。您可以选择缓冲区中的任何匹配行,以跳转到匹配源文件中的该行

例如,如果运行M-x grep,您应该在迷你缓冲区中得到以下提示:

像这样运行grep:grep-n

然后添加要传递给grep的regexp和glob模式:

像这样运行grep:grep-n some id*.css


它应该为您提供一个列表,列出当前目录中与*.css匹配的所有文件中的某个id的匹配项。如果您想在子目录中递归,那么您需要使用rgrep而不是grep。这听起来像是你在寻找的,还是我完全误解了你的要求?

我会给你一个。利维积分。但我想我明白了。看起来find dired确实是这项工作的工具,但在我的windows机器上,它没有预先在args中填充-exec grep,我也不知道该怎么做。然而,我的linux机器确实预先填充了grep

所以

  #on Linux
  M-x find-dired
  Run Find in Directory: <current_path> 
  Run find(with args): -type f -exec grep -q -e \{\} \; 

  #on windows
  M-x find-dired
  Run Find in Directory: <current_path> 
  Run find(with args): 

  #Solution
  M-x find-dired
  Run Find in Directory: <current_path> 
  Run find(with args): -type f -iname "*.css" -exec grep -q -e #some-id \{\} \; 

这有点晚了,但下面是我经常使用的emacs lisp函数:

(defun find-iname-grep-dired (dir pattern regexp)
  (interactive
   "DFind-name (directory): \nsFind-name (filename wildcard): \nsFind-grep (grep regexp): ")
  (find-dired dir (concat "-iname " (shell-quote-argument pattern) " "
                          "-type f -exec " grep-program " " find-grep-options " -e "
                          (shell-quote-argument regexp) " "
                          (shell-quote-argument "{}") " "
                          (shell-quote-argument ";"))))
它将find grep dired和find name dired与不区分大小写的文件名匹配结合起来。

您在评论中说:

唯一缺少的是输出到一个dired缓冲区,这样我就可以一次选择/移动/复制所有这些文件


对不起,我直到现在才看到这个问题。该功能可用于。命令diredp grepped files other窗口打开grep hits指示的文件上的Dired。它也适用于从编译模式派生的任何其他模式。

还有什么进一步的处理?搜索搜索和替换?还有什么?搜索和替换可能很常见是的,但在dired缓冲区中,我可能希望将它们移动/复制到另一个目录,或者基本上删除dired中可以执行的任何命令。我建议查找dired,标记文件%m,然后使用a regex search和Q regex search&replace命令。但你需要一个更通用的解决方案。几乎,我需要它与find结合起来递归,除非grep可以做到这一点。试试rgrep。它使用find在子目录中递归,grep.ah rgrep中的所有文件更接近,唯一缺少的是输出到dired缓冲区,这样我就可以一次选择/移动/复制所有这些文件。