Как использовать тот же шаблон, что и begin и end в области синтаксиса vim? - PullRequest
0 голосов
/ 07 января 2019

Итак, я пытаюсь создать синтаксис для Менгира генератора парсера для OCaml.

На этом языке в файле есть три раздела, разделенных %% (нет, это не красиво; к сожалению, оно унаследовано от древнего ocamlyacc.)

Я пытаюсь создать отдельную область синтаксиса для каждого из этих трех, плюс один для чего-либо после постороннего, третий %%:

this should be in `menhirDeclarations`
%%
this should be in `menhirRules`
%%
this should be in `menhirOcamlFooter`
%%
this should be in `menhirSeparatorError`
%%
this should still be in the same `menhirSeparatorError`

Сегодня я просматривал документы :h syn-define и дошел до определения группы, которая соответствует всему в первом объявлении:

syn region menhirDeclarations start=/\%^/ end=/%%/
    \ contains=@menhirComments

… но у меня много проблем с расширением для соответствия следующим разделам. Наивный подход не работает для меня, например:

" These break each document into the three sections of a Menhir parser definition:
syn region menhirSeparatorError start=/%%/ end=/%%/
    \ contained contains=@menhirComments
syn region menhirOcamlFooter start=/%%/ end=/%%/
    \ contained contains=@menhirCommentsnextgroup=menhirSeparatorError
syn region menhirRules start=/%%/ end=/%%/
    \ contained contains=@menhirComments nextgroup=menhirOcamlFooter
syn region menhirDeclarations start=/\%^/ end=/%%/
    \ contains=@menhirComments nextgroup=menhirRules

Как заставить Vim разделить подсветку синтаксиса файла на несколько разделов, как это?

1 Ответ

0 голосов
/ 08 января 2019

Ваша проблема заключается в том, что разделители @@ включены в начальный и конечный шаблоны региона, поэтому конечное совпадение одного региона скрывает потенциальное начальное совпадение следующего региона. Другими словами, ваш код будет работать, если разделы будут разделены @@@@ вместо @@.

Поскольку вам нужно подтвердить обе стороны раздела, вы можете остановить сопоставление конечной области с помощью :help :syn-pattern-offset. Смещение me=s-1 ( конец совпадения - один символ перед началом совпадения ) все еще утверждает, что раздел заканчивается на @@, но больше не использует эти два символа. При этом nextgroup может творить свою магию и начинать следующую группу сразу после окончания предыдущей:

syn region menhirDeclarations start=/\%^./ end=/%%/me=s-1 nextgroup=menhirRules
syn region menhirRules start=/%%/ end=/%%/me=s-1 contained nextgroup=menhirOcamlFooter
syn region menhirOcamlFooter start=/%%/ end=/%%/me=s-1 contained nextgroup=menhirSeparatorError
syn region menhirSeparatorError start=/%%/ end=/\%$/ contained

Обратите внимание, что мне как-то нужно было сопоставить хотя бы один символ в начале буфера; /\%^/ не работал для меня (в Vim версии 8.1.536). Чтобы избежать реализации нескольких повторяющихся совпадений последней группы menhirSeparatorError (что также может быть решено с помощью того же подхода), я просто позволяю ей заканчиваться в конце буфера с помощью /\%$/.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...