I want to syntax highlight a header region in custom style and a body region with the existing markdown style:

Title: Test Note
Id: 147648d8-8680-4847-8f50-dd4a67f870b5
Created-At: 2018-02-26 22:44:20.784550+00:00
Updated-At: 2018-02-26 22:44:20.784550+00:00

# A heading
Some text

The common start and end of the regions Header and markdownBody is the blank line. I tried this:

syn match HeaderValue contained '.*$'
syn match HeaderKey contained '^.*:' nextgroup=HeaderValue

syn region Header start="\%^" end="\ze\n\n" transparent contains=HeaderKey

unlet! b:current_syntax
syn include @MARKDOWN syntax/markdown.vim
let b:current_syntax = "mystyle"

syn region MarkdownBody start="\n\n" end="\%$" contains=@MARKDOWN

hi def link HeaderKey Type
hi def link HeaderValue Comment

This works for the header, but not for the body. If I replace the two occurrences of \n\n with, e. g., END and replace the blank line in the text with END, it works, though.

This seems to mean there is a special handling of \n\n. How can I use a blank line as a start and end marker?


Ok, I found the solution: differently from what I assumed, syn region works line-oriented already, so a single \n instead of \n\n does it. Take a look at the working code if you’re interested.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.