Vimscript: найти последнюю открытую скобку или скобку - PullRequest
9 голосов
/ 08 октября 2010

Я хотел бы написать функцию в vimscript, которая находит последнюю открытую скобку или скобку в строке.Это не обязательно простая проблема, потому что она должна уметь обрабатывать все следующее:

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

Как видите, необходимо обрабатывать вложенные скобки, различные символы и токены строк.разумно.Это вообще возможно?Существуют ли инструменты с регулярными выражениями vimscript для выполнения контекстного поиска, который знает разницу между незамкнутыми скобками и круглыми скобками в строках?

Учитывая, что вы можете использовать синтаксис для выделения несбалансированных скобок, должна быть возможность найти последние незамкнутые скобкискобка на линии.Как это можно сделать?

Ответы [ 3 ]

4 голосов
/ 09 октября 2010

Используйте [( и ]):

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

Для фигурных скобок: [{ и [}.

4 голосов
/ 10 октября 2010

Итак, в общем, вы должны найти последнюю скобку, которая не в комментарии и не в строке.

Я не уверен, что это за синтаксис, поэтому я поместил эти строки в буфер и сделал

: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.

1 голос
/ 09 октября 2010

У меня нет прямого ответа, но вы, возможно, захотите проверить код в плагине matchparen.vim, который является стандартным плагином, включенным в установки Vim (в каталоге плагинов). Этот плагин используется для выделения совпадающих скобок, если у вас включена эта функция. Код является более общим, чем вам нужно, так как он совпадает между строками, но вы можете работать с ним и проверить, находит ли он совпадение в той же строке, или, по крайней мере, получить некоторые идеи из своего кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...