【问题标题】:How to make an intricate multi-buffer search?如何进行复杂的多缓冲区搜索?
【发布时间】:2014-01-19 01:08:37
【问题描述】:

在 Python 的正则表达式方言(正确的术语?)中,我们有 (?<=...),可用于缩小针对给定模式之前的搜索范围。

尝试在 Emacs 上执行一些复杂的多缓冲区搜索,例如仅搜索那些 content 包含 "x" 和/或 "y" 的缓冲区,然后在匹配缓冲区的 content 中搜索 "foo" 并列出结果,不是t 硕果累累,因为:

(multi-occur-in-matching-buffers "." "\\(?<=:x\\|y\\)foo")

没有匹配任何东西。

Regexp Syntax Summary 声明它不适用于 GNU Emacs/Elisp。

我该如何解决这个问题?

【问题讨论】:

  • 你不能这样分两个阶段吗?收集包含第一个查询匹配项的缓冲区列表,然后创建缓冲区名称的正则表达式以在其中搜索第二个表达式。
  • @tripleee 问题已更新
  • 轻微更新,(multi-occur-in-matching-buffers "." "\\(x\\|y\\).*\\(\n.*\\)*foo\\|foo.*\\(\n.*\\)*\\(x\\|y\\)") 对我有用,但当然,正则表达式不是很优雅。不幸的是,multi-occur-in-matching-buffers 不会返回匹配列表,因此您必须分两步解析*Occur* 缓冲区。

标签: regex emacs elisp icicles


【解决方案1】:

这很容易使用Icicles

  • C-x b,它选择缓冲区,让您还可以通过他们的contents matching 选择您的输入模式(可以是正则表达式)。它是一个multi-command,这意味着您可以通过一次使用C-x b来选择任意数量的缓冲区。

  • Progressive completion 允许您使用任意数量的模式(例如正则表达式),将它们组合起来以获得它们的交集(与)。并且您可以减去其他模式的匹配项(互补)。

  • 您可以将选定的缓冲区“标记”或“保存”为一组saved completion candidates。 (你甚至可以保存这样的一组persistently。)

这意味着您可以轻松选择与xy 匹配的所有缓冲区。或者,如果您想要所有匹配 xy 的内容,只需将匹配 y 的内容添加到您标记为匹配 x 的缓冲区中。

鉴于已标记或“已保存”的缓冲区集,您可以使用 Icicles search 或 vanilla Isearch 在其中搜索 foo

另一方面,如果您只想找到匹配foo 以及xy 的缓冲区,那么只需使用C-x b。还要注意,用于查找缓冲区的最后一个内容匹配模式(例如,foo)会自动保存为最后一个 Isearch 正则表达式。因此,当您随后访问缓冲区时,您可以立即使用C-M-s 搜索单个事件。

【讨论】:

  • 我曾两次尝试将 Icicles 带入我的工作流程,但它干扰了许多其他软件包。事实上,它使用起来非常不方便,并且减慢了我的工作速度。所以我不得不摆脱它两次。我再试一次。
  • 这看起来肯定火了。感人的。我会尝试一下。谢谢。
  • 对于您尝试 Icicles 时遇到的麻烦,我们深表歉意。就干扰而言,原则上您可以轻松关闭几乎所有您喜欢的默认 Icicles 行为。可能开始的地方是自定义选项icicle-top-level-key-bindings。将其设置为 nil 意味着 Icicles 不会绑定 any 全局键。它默认绑定的所有 minibuffer 键也很容易定制。见Icicles Key Bindings。但是,是的,使用 Icicle 次要模式意味着您可能会改变工作方式。
  • 糟糕,我刚刚检查了Drew Adams 并获得了连接;)。这是MHO。感谢您的建议,我一定会尝试的。
  • 在“选择所有匹配xy的缓冲区”中,它与缓冲区的名称或它的内容匹配>?虽然我仍在尝试但没有成功获得预期的结果。问题已更新。
猜你喜欢
  • 2013-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-12
  • 2021-03-28
  • 2014-12-28
  • 1970-01-01
相关资源
最近更新 更多