Я хочу свернуть определения функций в коде 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
" заявляет о поддержке многострочных совпадений. Но я все еще не складываюсь.