Vim: Как мне начать сложение синтаксиса в строке после соответствия регулярному выражению?(функции питона) - PullRequest
4 голосов
/ 01 января 2012

Я хочу свернуть определения функций в коде Python, используя свертывание на основе синтаксиса Vim. Поэтому я добавил следующее в мой .vim / syntax / python.vim:

setlocal foldmethod=syntax
syn sync fromstart
syn region  pythonFunctionFostart="^\z(\s*\)\%(def\|class\) " skip="^\s*$" end="^\ze\%(\z1\s\)\@!." fold transparent

Это работает; он также поглощает пустые строки между функциями (в отличие от foldmethod = indent), что я хочу. Однако я не хочу, чтобы строка def function (): была свернута. Насколько я понял документы, я мог сделать следующее:

syn region  pythonFunctionFold  start="^\z(\s*\)\%(def\|class\) .*\n\zs." skip="^\s*$" end="^\ze\%(\z1\s\)\@!." fold transparent

Но это заставляет vim вообще не создавать сгиб. (Я пробовал запустить регулярное выражение, используя обычный поиск, и это работает). Не работает следующее:

syn region  pythonFunctionFold  start="^\z(\s*\)\%(def\|class\) .*\n."ms=e skip="^\s*$" end="^\ze\%(\z1\s\)\@!." fold transparent

и при этом hs = e, rs = e

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

Редактировать: я также попробовал следующее:

syn match pythonFunctionFold "^\(\s*\)\%(def\|class\) .*\n\zs\(\s*\n\|\1\s\+.*\n\)\+" fold transparent

Когда я ищу шаблон (используя /), он совпадает с точно областями, которые я хочу сложить, и ":help syntax" заявляет о поддержке многострочных совпадений. Но я все еще не складываюсь.

1 Ответ

1 голос
/ 17 января 2012

Боюсь, это невозможно.Начиная с syntax.txt, ниже :syn-multi-line:

При использовании стартового шаблона со смещением начало матча не разрешается начинать со следующей строки.Выделение может начаться в следующей строке.Использование элемента "\ zs" также требует, чтобы начало матча не перемещалось на другую строку.

...