Vimscript:查找最后一个圆括号或括号

Vimscript:查找最后一个圆括号或括号,vim,viml,Vim,Viml,我想在vimscript中编写一个函数,用于查找行中的最后一个圆括号或方括号。这不一定是一个容易的问题,因为它需要能够处理以下所有问题: function(abc function(abc, [def function(abc, [def], "string(" function(abc, [def], "string(", ghi( 如您所见,嵌套括号、不同符号和字符串标记都需要智能处理。这可能吗?是否有使用vimscript正则表达式的工具来进行上下文感知搜索,以了解未闭合圆括号和字符串中

我想在vimscript中编写一个函数,用于查找行中的最后一个圆括号或方括号。这不一定是一个容易的问题,因为它需要能够处理以下所有问题:

function(abc
function(abc, [def
function(abc, [def], "string("
function(abc, [def], "string(", ghi(
如您所见,嵌套括号、不同符号和字符串标记都需要智能处理。这可能吗?是否有使用vimscript正则表达式的工具来进行上下文感知搜索,以了解未闭合圆括号和字符串中圆括号之间的区别


如果可以通过语法突出显示不平衡的括号,那么应该可以在一行中找到最后一个未闭合的括号/括号。如何做到这一点?

我没有任何直接的答案,但您可能希望查看matchparen.vim插件中的代码,这是vim安装中包含的标准插件(在插件目录中)。如果您启用了该功能,则该插件用于突出显示匹配参数。代码比您需要的更一般,因为它跨行匹配,但您可以使用它并测试它是否在同一行上找到匹配项,或者至少从代码中获得一些想法

使用
[(
])


对于大括号:
[{
[}

因此,基本上,您必须找到最后一个括号,它不在注释中,也不在字符串中

我不确定这个语法是什么,所以我把这些行放在一个缓冲区中

:set ft=javascript
使字符串高亮显示

function(abc
function(abc, [def
function(abc, [def], "string("
function(abc, [def], "string(", ghi(
现在将光标放在第三行的圆括号内,并发出以下命令:

:echo synIDattr(synID(line('.'), col('.'), 0), 'name') =~? '\(Comment\|String\)'
它将回显“1”,表示光标下的字符位于注释或字符串中

如果将光标放在最后一行的最后一列,并执行相同的命令,则会得到“0”

现在,您可以在括号上反向迭代,并根据“comment”和“string”对它们进行测试,得到最后一个开括号


您可以查看如何使用vimscript关闭不匹配的括号。

很有趣。这是如何实现的?有没有找到不匹配的方括号的等效方法?有没有简单的方法可以在vimscript函数中使用它而不实际移动光标?查找
searchpair()
在帮助/文档中。谢谢!它仍然有点复杂(考虑以“function(abc,def(),ghi)”结尾的一行,最后一个括号不是最后一个不匹配的括号),但synIDattr正是我能够完成其余工作所需要的。一对括号的一半称为括号。如果目的是帮助高亮显示,请注意此处的问题和答案:。插件
vim matchopen
高亮显示最后一个括号、相对于光标的括号和大括号(无论是否关闭)。
:echo synIDattr(synID(line('.'), col('.'), 0), 'name') =~? '\(Comment\|String\)'