Vim соответствует нескольким аргументам латексных команд - PullRequest
0 голосов
/ 01 мая 2020

Я хотел бы знать, как сопоставить команду Latex с несколькими аргументами в Vim. Например, я хотел бы сопоставить вещи вида:

\command{SOME LATEX}{SOME LATEX}{SOME LATEX}

, где детали 'НЕКОТОРЫЕ ЛАТЕКСЫ' могут иметь любой нормальный латекс, выделенный внутри. например,

\command{\anothercommand{a}}{\anothercommand{b}}{\command{a}{b}{c}}

Мне особенно интересно сопоставить \command{, каждый }{ и окончательный }. Возможно ли это в Vim, и если да, то как?

Ответы [ 2 ]

0 голосов
/ 03 мая 2020

Вот ответ, имеющий дело с двумя аргументами, из которых можно перейти к случаям с более высокой арностью. Он имеет дело с отображением \braket{a}{b} как <a|b> с помощью функции скрытия Vim.

" This matches the '\braket' portion and displays it as '<'
syn match texStatement "\\braket\s*{\@=" conceal cchar=< contained containedin=@texmathzones

" This matches the first set of braces and hides the first, displaying the second as '|'.
syn region braketInner matchgroup=Delimiter start=+\%(\\braket\)\@<={+ end="}" contained transparent containedin=@texMathZones concealends cchar=|

" This matches the second set of braces and hides the first, displaying the second as '>'.
syn region braketInner matchgroup=Delimiter start=+\%(\\braket.*}\)\@<={+ end="}" contained transparent containedin=@texMathZones concealends cchar=>

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

0 голосов
/ 02 мая 2020

Ну, это непростая задача, и ее сложность во многом зависит от того, насколько сильной она будет ...

Я только что написал те функции, которые создают для вас регулярное выражение:

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

Снимки экрана

Вот несколько примеров:

demo1

demo2

Отказ от ответственности

Это будет обрабатывать только 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 лично.

...