Ну, это непростая задача, и ее сложность во многом зависит от того, насколько сильной она будет ...
Я только что написал те функции, которые создают для вас регулярное выражение:
function! RecursiveBuild(nb)
if a:nb <= 0
return '[^}]\{-}'
endif
return '\([^{]\|{'.RecursiveBuild(a:nb-1).'}\)\{-}'
endfunction
function! BuildRegex(command, nb)
return '\\'.a:command.'\(\zs{\ze' . RecursiveBuild(5) . '}\)\{'.a:nb.'}'
endfunction
Затем вам нужно просто выполнить:
:let @/ = BuildRegex('command', 2)
Чтобы выделить открывающую фигурную скобку 2-й группы
Если вы хотите сопоставить что-то еще, вы Необходимо только переместить \zs
(начало захвата) и \ze
(конец захвата) в функцию BuildRegex
Снимки экрана
Вот несколько примеров:


Отказ от ответственности
Это будет обрабатывать только 5 уровней вызовов, что означает:
# This works:
\command1{\command2{\command3{\command4{\command5{Hey there}}}}}
# This doesn't works:
\command1{\command2{\command3{\command4{\command5{\command6{Hey there}}}}}}
Вы можете увеличить поддерживаемый уровень, изменив аргумент, переданный функции RecursiveBuild
, но в какой-то момент регулярное выражение станет слишком большим, и vim это не понравится. Я могу go до 8 лично.