Vim regex не создает группу синтаксиса - PullRequest
0 голосов
/ 16 июня 2020

Я пытаюсь получить аргументы (грубо говоря, я просто хочу выделить что-нибудь в скобках) для python функций, которые нужно выделить. У меня есть рабочее регулярное выражение, которое выделяет правильные вещи:

syn match pythonArguments "\vdef.*\(\zs.+\ze\)"
hi def link pythonArguments Special

Теперь у меня есть аналогичная вещь для работы в том же документе (вызовы функций) с этим:

syn match pythonFunctionCall "\v\w+\ze\("
hi def link pythonFunctionCall Function

Но , по какой-то причине регулярное выражение аргументов не превращается в синтаксическую группу. И я попытался запустить их как команду, а не в моем документе ~ / .vim / after / syntax / python .vim, но безрезультатно. Когда мой курсор находится над выражениями, которые выделены поиском /\vdef.*\(\zs.+\ze\), группы синтаксиса нет. Я перепробовал все, что мог придумать.

1 Ответ

0 голосов
/ 19 июня 2020

Итак, для всех, кому интересно, кажется, что vim (8.1 на MacOS) имеет ошибочные группы синтаксиса. В итоге я заставил его работать с:

syn match pythonFunctionDeclaration "\v\(.+\):" contains=ALL transparent
syn match pythonArguments "\v\(\zs.+\ze\)" contained contains=ALL

Я не знаю, почему другие вещи, которые я пробовал, не работали, но это выделит python аргументы функции (и он оставит в покое уже существующие группы синтаксиса).

EDIT: я узнал больше. Итак, проблема с регулярным выражением для синтаксических групп состоит в том, что перекрытие между различными шаблонами игнорируется. Например:

/\vdef|def something будет соответствовать части 'def' в 'def something', потому что vim пропустит часть 'something', потому что она уже соответствует первому шаблону. Я не знаю, имело ли это какое-то значение, проверьте this .

Возвращаясь к улучшению выделения, проблема с синтаксическими группами выше заключается в том, что некоторые операторы if и циклы for также будут соответствие. Однако это работает:

syn clear pythonFunction
syn match pythonFunction "\h\w*" 
nextgroup=pythonFunctionDeclaration display contained
syn match pythonFunctionDeclaration "\v\(.+\):" contains=pythonArguments transparent contained
syn match pythonArguments "\v\(\zs.+\ze\)" contained contains=ALLBUT,pythonFunction
hi def link pythonArguments Special

Это сделает нашу специальную группу синтаксиса только после функций.

TLDR; добавьте второй (более длинный) блок кода к себе ~ / .vim / after / syntax / python .vim файл, чтобы python аргументы функции были выделены так же, как выделена группа специального синтаксиса.

...