Определение областей синтаксиса Vim для смежных строк, начинающихся с одинаковых символов (например, комментарии) - PullRequest
0 голосов
/ 21 сентября 2019

Я пытаюсь расширить синтаксис Python, чтобы определить выделенные области как непрерывные строки комментариев, начинающиеся с #'.Все после #' должно рассматриваться как непрерывный текст уценки и выделяться в соответствии с правилами уценки.

Моя цель - написать файлов Python, которые могут быть скомпилированы с помощью pweave в Vim.

Примером может служить случай, когда абзац, начинающийся с # Foo, будет выделен правилами уценки при игнорировании символов #' в начале.Например, # Foo будет рассматриваться как заголовок 1.

#' # Foo
#' The foo function below returns 1.

def foo():
   return 1

Это то, что я пробовал до сих пор:

syn include @pythonMkd syntax/markdown.vim
syn region pythonDoxygen matchgroup=doxygenDelim start="^\(\s*#\{1,2}' \)" matchgroup=doxygenDelim end="^\s*\(#\{1,2}'\)\@!" contains=doxygenDelim,@pythonMkd,@Spell keepend fold
syn match doxygenDelim "^\s*#\{1,2}'" containedin=pythonDoxygen contained

Vim распознает блок как Markdown, но он не в состоянииигнорируйте символы #' при анализе предложения так, что все, кроме первой строки, рассматривается как заголовок 1.

Я также попробовал следующее.Это обрабатывает регионы как уценку построчно, но все равно не игнорирует #' при применении правил уценки.

syn region pythonDoxygen matchgroup=doxygenDelim start="^\(\s*#\{1,2}' \)" matchgroup=doxygenDelim end="^\s*\(#\{1,2}'\)\@!" contains=doxygenDelim,@pythonMkd,@Spell keepend fold

1 Ответ

0 голосов
/ 23 сентября 2019

Я понимаю, что у вас работает :syntax include синтаксиса Markdown, но подсветка региона Markdown неверна из-за ведущих префиксов #'.

Вы говорите, что ваша вторая попытка обрабатываетобласти как уценка построчно , но этот диапазон (от первого префикса до первой строки без такого префикса) по-прежнему является большой (многострочной) непрерывной областью.

Что работает (отчасти),определяет синтаксис после префикса до конца этой строки:

unlet b:current_syntax
syn include @pythonMkd syntax/markdown.vim
" syn match pythonDoxygen "^\(\s*#\{1,2}' \)" nextgroup=@pythonMkd
" We cannot directly specify a syntax cluster for nextgroup, so define a group that contains the markdown cluster
syn match pythonDoxygenMkdLine ".*$" contained contains=@pythonMkd
syn match pythonDoxygen "^\(\s*#\{1,2}' \)" nextgroup=pythonDoxygenMkdLine

Это будет применять подсветку уценки после префикса до конца этой строки, индивидуально.Однако вы потеряете сворачивание.

Еще хуже, поскольку у разметки есть определенные элементы синтаксиса (например, # heading), которые начинаются в начале строки, теперь они больше не совпадают.Синтаксис уценки использует обычные атомы, такие как ^, для их применения, но в вашем случае ^ должен означать после префикса pythonDoxygen . К сожалению, этого невозможно добиться без сотрудничества с синтаксисом уценки .(Плагин может предлагать переменную конфигурации markdown_startline_pattern, которая по умолчанию ^ и может быть перезаписана вашим плагином на ^\s*#\{1,2}' \zs.)

Большинство проблем можно было бы избежать, если бы существовал блочно-подобныйСинтаксис комментариев (например, /* ... */ в C / C ++), в который вы можете встроить свою уценку. (Будет ли """ ... """ работать для вас?)

...