我想在vimscript中编写一个函数,找到一行中最后一个打开的括号或括号。这不一定是一个简单的问题,因为它需要能够处理以下所有问题:
function(abc
function(abc, [def
function(abc, [def], "string("
function(abc, [def], "string(", ghi(
如您所见,嵌套括号,不同符号和字符串标记都需要智能处理。这甚至可能吗?是否有使用vimscript正则表达式的工具进行上下文感知搜索,这些搜索知道未闭合括号和字符串中的括号之间的区别?
鉴于您可以使用语法突出显示不平衡括号,应该可以在一行上找到最后一个未闭合的括号/括号。怎么办呢?
答案 0 :(得分:4)
使用[(
和])
:
[( go to [count] previous unmatched '('.
]) go to [count] next unmatched ')'.
花括号:[{
和[}
。
答案 1 :(得分:4)
所以,基本上,你必须找到最后一个不在评论中但不在字符串中的括号。
我不确定这种语法是什么,所以我将这些行放在缓冲区中并执行
:set ft=javascript
获取字符串突出显示
function(abc
function(abc, [def
function(abc, [def], "string("
function(abc, [def], "string(", ghi(
现在将光标移至第3行打开括号并发出以下命令:
:echo synIDattr(synID(line('.'), col('.'), 0), 'name') =~? '\(Comment\|String\)'
它会回显你'1',这意味着光标下的字符在注释或字符串中。
如果将光标放在最后一行的最后一个col并执行相同的命令,则会得到'0'。
现在你可以在括号上向后迭代并针对'comment'和'string'测试它们并获得最后一个打开的括号。
您可以查看this archive of "LISP: Balance unmatched parentheses in Vim",了解如何使用vimscript关闭不匹配的括号。
答案 2 :(得分:1)
我没有任何直接的答案,但您可能想查看matchparen.vim插件中的代码,这是Vim安装中包含的标准插件(在插件目录中)。如果您启用了该功能,该插件将用于突出显示匹配的parens。代码比你需要的更通用,因为它匹配不同的行,但你可以使用它并测试它是否在同一行找到匹配,或者至少从代码中获得一些想法。