9

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

function(abc
function(abc, [def
function(abc, [def], "string("
function(abc, [def], "string(", ghi(

如您所见,嵌套括号、不同符号和字符串标记都需要智能处理。这甚至可能吗?是否有带有 vimscript 正则表达式的工具来进行上下文感知搜索,这些搜索知道字符串中未闭合括号和括号之间的区别?

鉴于您可以语法突出显示不平衡的括号,因此应该可以在一行中找到最后一个未闭合的括号/括号。如何才能做到这一点?

4

3 回答 3

4

使用[(])

[(          go to [count] previous unmatched '('.
])          go to [count] next unmatched ')'.

对于花括号:[{[}.

于 2010-10-09T16:49:05.810 回答
4

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

我不确定这种语法是什么,所以我将这些行放在缓冲区中并做了

:set ft=javascript

使字符串突出显示

function(abc
function(abc, [def
function(abc, [def], "string("
function(abc, [def], "string(", ghi(

Now put your cursor to the 3rd line open parenthese and issue the following command:

:echo synIDattr(synID(line('.'), col('.'), 0), 'name') =~? '\(Comment\|String\)'

It'll echo you '1' and it means that character under the cursor is in comment or in a string.

If you place the cursor to the last col of the last line and do the same command you'll get '0'.

Now you can iterate backwards over parenthesis and test them against 'comment' and 'string' and get the last open parenthese.

You can check this archive of "LISP: Balance unmatched parentheses in Vim" to see how to close unmatched parenthesis using vimscript.

于 2010-10-09T20:05:20.803 回答
1

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

于 2010-10-09T16:38:21.097 回答