Итак, в общем, вы должны найти последнюю скобку, которая не в комментарии и не в строке.
Я не уверен, что это за синтаксис, поэтому я поместил эти строки в буфер и сделал
: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', и это означает, что символ под курсором находится в комментарии или в строке.
Если вы поместите курсор на последний столбец последней строки и выполните ту же команду, вы получите '0'.
Теперь вы можете перебирать круглые скобки в обратном порядке, проверять их на соответствие «комментарию» и «строке» и получать последние открытые скобки.
Вы можете проверить этот архив "LISP: Баланс несопоставленных скобок в Vim" , чтобы увидеть, как закрыть непревзойденные скобки с помощью vimscript.