Emacs搜索并打开多个文件并搜索所有缓冲区

时间:2010-09-25 20:34:07

标签: emacs elisp

我目前正处于转换过程的开始,转发Emacs。但是我有两个基本问题。

  1. 如何从特定路径递归搜索多个文件?我假设我必须使用find / grep / dired,但我不确定。例如,我想在路径*.scala找到所有C:/src/xxx个文件。当找到这些文件时,我还想立即在缓冲区中打开它们。我目前熟悉的唯一方法是 C-x C-f

  2. 当所有这些文件都在缓冲区中时,我如何搜索所有缓冲区,并获得某种结果列表和/或可能从结果导航到结果?说我想找到文字case Int =>的所有地方。

5 个答案:

答案 0 :(得分:9)

我同意phimuemue的回答,但我也会指出M-x rgrep,它将运行必要的find / grep,以便在不实际打开文件的情况下显示所有匹配项。选择匹配然后打开该行号的相关文件。在某些情况下,这可能比打开所有这些文件更好。

另见:

答案 1 :(得分:3)

对于A部分,您可能会看here

对于B部分,您可能会看一下multi-occur-in-matching-buffers,它可以让您指定要使用的缓冲区(例如,所有缓存.*.scala以查找所有scala文件)以及要查找的内容(例如case Int =>)。这将为您提供所有出现的列表。

答案 2 :(得分:1)

您正在尝试查找所有“case Int =>”在C:/ src中的* .scala文件中

最简单的方法(假设默认的Emacs设置)是使用M-x rgrep。它会询问您搜索字符串,文件类型和目录(按此顺序,并且提示标记为没有混淆)。只需输入case Int =>*.scalaC:/src/xxx

您应该看到的是一个新缓冲区,其中包含“case Int =>”的出现列表在该目录中的所有.scala文件中。如果单击某个匹配项,Emacs将打开该文件并导航到包含该文件的行。

请注意,如果您尝试搜索并替换多个文件,则可以使用dired选项执行此操作。您可以找到有关该选项的信息here

答案 3 :(得分:1)

*问题A ***

Icicles 中, C-x C-f 默认为多命令。这意味着当你完成一组文件名时:

  • 您可以选择性地(例如,访问)多个候选人(例如 C-RET C-mouse-2 )。

    < / LI>
  • 您可以对名称与当前输入相匹配的所有文件采取行动 - 例如,全部访问它们。

其他 Icicles 文件命令也是如此,包括那些允许您匹配绝对文件名的命令,这意味着您的迷你缓冲区模式不仅可以匹配文件名的非目录部分,目录部分也是如此。

例如,带有前缀arg的 C-x C-f 匹配绝对文件名。并且M-x icicle-locate-file对给定目录下的所有文件执行相同的操作。

(您可以使用多命令作为普通命令: Cx Cf 在使用 RET mouse-2 时正常工作如果你不使用额外的键绑定来处理多个文件,那么你永远不会知道它们之间的区别。)

请参阅http://www.emacswiki.org/emacs/Icicles_-_File-Name_Input


*问题B ***

你想要的是冰柱搜索。

  • 命令icicle-search-file搜索您指定的集合中的所有文件。
  • 命令icicle-search-buffer搜索您指定的集合的所有缓冲区。
  • 命令icicle-search同时执行:带有前缀为负的文件arg,带有非负前缀arg的缓冲区。

这些命令允许您指定正则表达式来定义搜索上下文:要搜索的文件或缓冲区的各个部分。例如,.*表示搜索每一行。

定义搜索上下文后,在迷你缓冲区中键入一些文本,并将候选搜索上下文缩小为与文本匹配的内容。你可以点击 M-SPC 来组合多个这样的模式。

然后您可以导航到所选的搜索命中: C-RET C-mouse-2 来访问,或使用 C-down循环/访问。您甚至可以通过各种方式对匹配的候选项进行排序,轻松比较它们或更改周期顺序。

请参阅http://www.emacswiki.org/emacs/Icicles_-_Search_Commands%2c_Overview

答案 4 :(得分:0)

我认为你是人为地限制了答案。您不需要将所有文件加载到Emacs中以查找这些事件。而且,一旦你发现了正则表达式的出现,你就可以通过击键轻松跳转到文件中的那一行。

我最喜欢的方法是使用 M-x igrep-find ,因为我比Emacs的igrep更喜欢grep-find界面。

您可以在emacswiki上找到igrep库:igrep.el

用法是

M-x igrep-find case Int => RET

将填充所有匹配的缓冲区,然后(如发生,grep-find,编译等),您可以使用 Cx` Mx next-error < / kbd>循环比赛。