【问题标题】:Emacs search and open multiple files and search on all buffersEmacs 搜索并打开多个文件并搜索所有缓冲区
【发布时间】:2011-04-17 06:22:21
【问题描述】:

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

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

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

【问题讨论】:

标签: emacs elisp


【解决方案1】:

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

另请参阅:

【讨论】:

    【解决方案2】:

    对于 A 部分,您可以查看 here

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

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        【解决方案4】:

        *对于问题 A***

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

        • 您可以有选择地对多个候选人采取行动(例如访问)(例如 C-RETC-mouse-2)。

        • 您可以对名称与您当前输入匹配的所有文件执行操作——例如,访问所有文件。

        对于其他 Icicles 文件命令也是如此,包括那些让您匹配绝对文件名的命令,这意味着您的 minibuffer 模式不仅可以匹配文件名的非目录部分,还可以匹配目录部分也是如此。

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

        (您始终可以将多命令用作普通命令:如果您使用 RETmouse-2Cx Cf 会正常执行. 如果您不使用额外的键绑定来操作多个文件,那么您将永远不会知道其中的区别。)

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


        *对于问题 B***

        你想要的是Icicles搜索。

        • 命令icicle-search-file 搜索您指定的集合中的所有文件。
        • 命令icicle-search-buffer 搜索您指定的集合的所有缓冲区。
        • 命令icicle-search 两者兼而有之:带有负前缀 arg 的文件,带有非负前缀 arg 的缓冲区。

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

        定义搜索上下文后,您在 minibuffer 中键入一些文本,它会将候选搜索上下文缩小到与您的文本匹配的那些。你可以点击 M-SPC 来组合多个这样的模式。

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

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

        【讨论】:

          【解决方案5】:

          我认为您人为地限制了答案。您无需将所有文件加载到 Emacs 中即可找到这些事件。而且,一旦你找到了正则表达式的出现,你可以很容易地通过击键跳到文件中的行。

          我最喜欢的方法是使用 M-x igrep-find,因为我更喜欢 igrep 接口而不是 Emacs 的 grep-find

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

          而用法是

          M-x igrep-find case Int => RET
          

          它将用所有匹配项填充缓冲区,然后(如发生、grep-find、编译等)您可以使用 Cx `Mx next-error 循环匹配。

          【讨论】:

            猜你喜欢
            • 2017-07-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-08-12
            • 1970-01-01
            相关资源
            最近更新 更多