【问题标题】:Vim: changing/deleting up to the end of a "block"Vim:更改/删除到“块”的末尾
【发布时间】:2011-11-16 13:30:27
【问题描述】:

当你有一个用括号或引号分隔的文本块时,你可以使用

ci"
da(

等等以更改该文本块。但是有没有办法从光标更改或删除到该块的末尾(就像cw 为文字所做的那样)?

【问题讨论】:

  • “块”文本是指一个段落吗?
  • 不,我的意思是用引号、括号、大括号、花括号等分隔的东西。我不知道它通常叫什么。

标签: vim editor


【解决方案1】:

使用ct) 来“c更正t右括号”。

带有 t、f、T 和 F 的 Vim 运动非常非常有用。 :help t, :help f.

更新:如果您所在的位置有嵌套括号:

  • vi)o`` 将选择直到右括号(将选择括号内,然后切换到选择的另一端并将其移动到您所在的位置(``
  • vi)`` 将选择直到左括号(相同的机制,但不需要o

第一个有效,因为当您执行vi) 时,会记住光标跳转,而`` 会转到上一个光标位置。看来o在可视模式下不影响这个。

【讨论】:

  • 一个细节:我猜这与原始问题略有不同,因为这将适用于下一个右括号,而 vi( 例如会寻找匹配的那个。例如,在(text (more)) 中的x 上键入vi( 也会选择(more),而键入vt) 将无法选择第一个右括号。
  • @Philippe:你有一个完全正确的解决方案吗?
  • 在 Philippe 的示例中,vf) 选择 xt (more)v2t) 会做同样的事情,但我的口味需要太多的计数和打字。
  • 现在我想知道为什么在 7 年后的 vimtutor 中找不到这些非常有用的命令和动作。
【解决方案2】:

Benoit 使用t f TF 的答案是我所知道的最好的方法。当涉及到删除到带括号的块的末尾时,您可以使用])。这将考虑任何嵌套括号。还有对应的[(]}[{

【讨论】:

  • 这些动作怎么称呼?我想在 vim 手册中了解它们。
  • 恐怕没有太多可阅读的内容,但您可以通过:help [( 找到它们。
  • 谢谢! d]} 完全符合我的要求(从光标处删除到块的末尾)。
  • 有没有办法删除直到关闭](考虑到嵌套的[])? d]] 似乎不起作用
【解决方案3】:

参见 Vim 帮助的“Text object selection”部分。您可以在此处使用删除和更改操作定义选择序列。它展示了如何选择由以下任何一个(以及更多)分隔的块:

  • {}
  • ()
  • 行情 (' or ")

例如:

d}c} 将从光标处删除并更改为段落末尾。

【讨论】:

  • 这太棒了。差点忘了那个,谢谢!
【解决方案4】:

我不知道有一种通用的方法来做你想做的事,但是,假设你在k in:

The (quick (brown) fox) jumps over the lazy dog.
  • v2t) 会选择:

    (The quick (brown) fox) jumps over the lazy dog.
             ^^^^^^^^^^^^^
    

    如果您不想计算,可以链接t) 以扩大您的选择范围:vt)t) 将首先选择:

    (The quick (brown) fox) jumps over the lazy dog.
             ^^^^^^^^
    

    然后:

    (The quick (brown) fox) jumps over the lazy dog.
             ^^^^^^^^^^^^^
    
  • vT( 会选择:

    (The quick (brown) fox) jumps over the lazy dog.
     ^^^^^^^^^
    

【讨论】:

  • 我最喜欢这个答案,但我认为它缺少vi)v])v[(。定义如下: 1. vi) - select in ) 块。 2. v]) - 选择直到 ) 块结束。 3. v[( - 选择直到 ( 块开始。
猜你喜欢
  • 2021-11-21
  • 1970-01-01
  • 1970-01-01
  • 2011-11-03
  • 2016-04-13
  • 1970-01-01
  • 2014-11-09
  • 2019-11-18
  • 1970-01-01
相关资源
最近更新 更多