Vim syntax highlighting: make region only match on one line

unix, vim

Solution

UPDATE: My previous answer was wrong, you can do this with a region, just do

syn region SubSubtitle start=+=+ end=+=+ oneline

See `:help syn-oneline` and `:help syn-arguments`. Guess it shows that I can't actually run vim right now, hunh?

Previous answer

According to my reading of the :help syntax, there's no way to do this with a region. However, you could do this with a syn-match:

syn match SubSubtitle /=\@<!=[^=]*==\@!/

The `/=\@<!/` says there's no `=` immediately before your match, and the `/=\@!/` says there's no `=` immediately after, so this matches exactly one `=`, a bunch of non-`=` (not including newlines - to include newlines it would have to be `\_[^=]`), then exactly one `=`.

The rest are similar

syn match Subtitle    /=\@<!=\{2}[^=]*=\{2}=\@!/
syn match Title       /=\@<!=\{3}[^=]*=\{3}=\@!/
syn match MasterTitle /=\@<!=\{4}[^=]*=\{4}=\@!/

You can still do matches within syn-matches, so if you have any nesting going on, it will still work.

For example

syn match Todo /\<TODO\>/ containedin=SubSubtitle,Subtitle,Title,MasterTitle contained

Problem

I have defined a custom file type with these lines: ``` syn region SubSubtitle start=+=+ end=+=+ highlight SubSubtitle ctermbg=black ctermfg=DarkGrey syn region Subtitle start=+==+ end=+==+ highlight Subtitle ctermbg=black ctermfg=DarkMagenta syn region Title start=+===+ end=+===+ highlight Title ctermbg=black ctermfg=yellow syn region MasterTitle start=+====+ end=+====+ highlight MasterTitle cterm=bold term=bold ctermbg=black ctermfg=LightBlue ``` I enclose all of my headings in this kind of document like this: ``` ==== Biggest Heading ==== // this will be bold and light blue ===Sub heading === // this will be yellow bla bla bla // this will be normally formatted ``` However right now when ever I use an equals sign in my code it thinks that it is a title. Is there anyway that I can force a match to be only on one line?

Original source