如何在Vim中选择括号(或引号或…)?

我确信曾经有一个插件这类的东西,但现在我需要它,我似乎找不到它(自然),所以我只会问nice和简单。

在括号、引号或匹配字符列表中选择最简单的方法是什么?

   write ( *, '(a)' ) 'Computed solution coefficients:'

例如,在这里我想选择(a)Computed solution coefficients:

我对多行不感兴趣,只对发生在一行上的情况感兴趣。

129721 次浏览

使用括号内的任意导航键,然后可以使用yi(yi)复制匹配括号内的所有内容。这也适用于方括号(例如yi])和花括号。除了y,你还可以删除或更改文本(例如ci)di])。

我尝试了双引号和单引号,它似乎也在那里工作。为了你的数据,我:

write (*, '(a)') 'Computed solution coefficients:'

将光标移动到C,然后键入yi'。将光标移动到空行,点击p,然后get

Computed solution coefficients:

作为CMS指出,这也适用于视觉模式选择-只需使用vi)vi}vi'等。

这种选择方法是内置的,并且在Vim帮助中有很好的介绍。它涵盖了XML标记等内容。

看到:help text-objects

使用箭头或hjkl进入其中一个括号表达式,然后使用v选择可视(即选择)模式,然后使用%跳转到另一个括号。

使用searchpair内置函数在.vimrc中编写一个Vim函数:

searchpair({start}, {middle}, {end} [, {flags} [, {skip}
[, {stopline} [, {timeout}]]]])
Search for the match of a nested start-end pair.  This can be
used to find the "endif" that matches an "if", while other
if/endif pairs in between are ignored.
[...]

(http://vimdoc.sourceforge.net/htmldoc/eval.html)

为了在单引号之间进行选择,我通常使用vi'(“选择内部单引号”)。

在圆括号块中,我使用vib ("select inner block")

在花括号块中,可以使用viB(“大写B”)

为了使选择具有“包容性”(同时选择引号、圆括号或大括号),可以使用a代替i

你可以阅读更多关于手册中的文本对象选择,或vim中的:help text-objects

要在单引号内进行选择,请使用vi'

要在括号内进行选择,请使用vi(

在vim中使用一个简单的键映射就可以解决这个问题。 map viq F " lvf " hh 上面的命令将viq映射到用于在引号之间搜索的键。将“替换为任何字符并创建您的键映射。 在启动期间将此插入vimrc,您应该能够每次都使用它

我已经创建了一个插件vim-textobj-quotes: https://github.com/beloglazov/vim-textobj-quotes

它为任何类型的最接近的引号对提供文本对象。仅使用iqaq,它允许您操作当前环绕光标的单(')、双(")或后(')引号的内容,这些引号位于光标的前面或后面(按优先顺序)。换句话说,它在需要达到引号时向前或向后跳转。

通过查看示例更容易理解(游标显示为|):

  1. 前:foo '1, |2, 3' bar;按diq: foo '|' bar
  2. 前:foo| '1, 2, 3' bar;按diq: foo '|' bar
  3. 前:foo '1, 2, 3' |bar;按diq: foo '|' bar
  4. 前:foo '1, |2, 3' bar;按daq: foo | bar
  5. 前:foo| '1, 2, 3' bar;按daq: foo | bar
  6. 前:foo '1, 2, 3' |bar;按daq: foo | bar

上面的例子是单引号的例子,插件对双引号(")和反引号(')的工作方式完全相同。

你也可以使用任何其他运算符:ciqdiqyiqviq,等等。

请看看上面链接的github页面了解更多细节。

我想在投票最多的答案中添加一个细节:

如果您正在使用gvim并希望复制到剪贴板,请使用

"+<command>

复制括号(或括号或花括号)之间的所有内容

例如:"+yi}将把光标所在花括号之间的所有内容复制到剪贴板。

我想补充一些已经很好的答案。我来这里寻找一种方法来改变html括号内的文本,所以我想为其他人提供一个答案,也在寻找它。

你可能认为ci<可以工作,但实际上只有当你在其中一个标签本身中时,它才会工作:

<would work inside here> But not here </would work inside here>

我想要的是改变html标签之间的文本本身:

<div>change me</div>

我想要的是“改变内部标签”:cit

感谢你提到文档(:help text-objects)的另一个答案,这就是我如何找到我正在寻找的东西。