在vim中,向后搜索匹配的花括号/括号


10

如您大多数人所知,您可以%在行上向前搜索以查找下一个配对的括号/括号/括号,然后移至与其匹配的伙伴:

|a|rray[index] = value;
" |e| is the cursor; hit %:
array[index|]| = value;

我希望有一个类似的键可以向后搜索,例如:

array[index] = value|;|
" |;| is the cursor again, hit the key I'm looking for:
array|[|index] = value;

大多数vim命令都有向后和向前,因此似乎应该这样做。没有伙伴吗?如果是这样,那是因为一旦将其放在配对的角色上,他们的行为就会一样吗?


应该注意的是,%不仅在同一行搜索成对的括号,而且在文件的更下方。我喜欢它,特别是对于任何选择的程序语言中的循环等。
伯恩哈德(Bernhard)2012年

1
@Bernhard是的,但仅当它在行中找到大括号之一时。
凯文(Kevin)

如果您不反对插件脚本,那么matchit插件会提供g%与您所寻找的命令相似的命令。
2012年

愚蠢的,但是,您的问题表明您想知道为什么没有伴侣。您的意思是“有我不认识的伙伴吗?” :)
rjewell 2012年

@rjewell好,我将其拆分,因此从技术上讲不再是这样。
凯文(Kevin)

Answers:


4

如果您确实想向后搜索常见的匹配字符,则可以使用以下vim特定命令之一:

  • [(...(转到上一个不匹配的(字符)
  • [{...(转到上一个不匹配的{字符)

这两个命令具有匹配的转发伙伴:

  • ])...(转到下一个不匹配的)字符)
  • ]}...(转到下一个不匹配的}字符)

#ifdef对于C注释,还有其他类似的命令。

vim使用时,您可以找到更多信息:help %


我知道这些,问题是它们找到不匹配的对,我需要找到匹配的对。
凯文(Kevin)

@Kevin:我误会了文档(叹气)。当然,一旦使用%完,它就会双向进行-找到匹配的伙伴。同样,如果在一个块内,则上述命令将找到适当的匹配项。
2012年

4

%找到匹配的括号。因此,如果您在(或{上,它将向前搜索。

如果您在}或)上,它将向后搜索。

%不是定向的,它只是找到匹配的括号。


如果我落后于一对,%会找到它的伴侣。如果我在一行的末尾,则不会在该行的较早位置找到该对。
凯文(Kevin)

不应该选择正确的答案吗?
杰克

2

我刚刚尝试过:map ^] ^%%(在这里使用^]= Ctrl+ v Ctrl+ 5,与%= Shift+ 类似5)。

它适用于给定的特定情况,但是因为它不会从游标向后搜索,所以它将始终选择行上的第一个打开括号,如果找不到任何匹配项,则将光标留在行的开头。


这是一个更好的解决方案。这很丑陋,可能还有很多需要简化的空间,但是我认为语义是完全正确的(如果没有开放式括号,则不移动光标,而移至当前列之前的第一个开放式括号)。

:map ^] ^[:call search("[({[]", "bes", line("."))^M

对于

  • ^]= Ctrl+ v Ctrl+5
  • ^[= Ctrl+v Esc
  • ^M= Ctrl+v Return

如果一行上有两个非嵌套对,这将不太一样,但是,到目前为止,这无疑是最好的建议,谢谢。
凯文(Kevin)

这只会在一个街区内起作用,对吗?如果是这样,那么[(它将同样有效,并且不需要map
2012年

还有必须是块开始在当前行的,是的。我找到了一个更完整的解决方案,请编辑...
无用的2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.