【问题标题】:Vim global command with two search ranges to yank multiple sections具有两个搜索范围的 Vim 全局命令以抽出多个部分
【发布时间】:2015-02-17 05:07:36
【问题描述】:

我想创建一个全局命令来拉取多个文本部分:

:g/BEGIN/.,/END/yank A

我的想法是,我将在寄存器 A 中组装文件中出现在标记“BEGIN”和“END:”之间的(多个)部分

BEGIN
Section 1
END

BEGIN
Section 2
END

不幸的是,这在 VIM 上似乎有些混乱。有时全局似乎选择了多个部分(即它不会在它找到的第一个“END”处停止选择,而是选择更远的部分,有时是单个部分。同一全局选择的行数似乎根据不相关的编辑随机更改同一文件。

显然我做错了什么。是否有正确的语法 - 选择和拉动由标记描绘的多个部分?我没有在网上找到太多来验证这种语法 - 尽管有很多关于 ex 范围、搜索范围和带全局变量的范围的文档,但我从未见过像这样将所有三个组合在一起。

【问题讨论】:

  • 对于您给定的输入,我没有发现任何问题,并且我经常使用这样的构造而没有问题(到目前为止)。您可以将其缩短为g/BEGIN/,/END/y A。你能提供像你提到的那样被破坏的输入吗?

标签: vim


【解决方案1】:

在 Lieven 验证我的语法正确(确实如此)之后,我发现问题与我在文本中使用折叠有关。当我展开所有文本时,我得到了预期的行为。

当我折叠文本时,全局命令并不总能找到第一个“END”标记 - 有时它似乎会拉动整个文档。

这对我来说似乎是一个错误 - 为什么尽管存在折叠,全局命令的第一个搜索词仍然有效,但第二个搜索词无效?但也许这是预期的行为。

以下是一些显示问题的示例文本:

 {{{
 BEGIN
 111
 END
 }}}
 {{{
 BEGIN
 222
 END
 }}}

当展开时,命令g/BEGIN/.,/END/yank A 找到正确的文本,当折叠时,全局返回错误。

在我的场景中,“展开文本”是一个可行的解决方案,所以我在这里发帖是为了后代。

【讨论】:

  • 我不知道这是否是一个错误,但这不是我所期望的。很高兴知道,谢谢。
  • 正确分析。这不是错误;像 :yank 这样的 Ex 命令适用于所有折叠行;你真的需要放弃折叠以避免这种情况。
猜你喜欢
  • 2018-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-15
  • 2022-09-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多