Подсветка синтаксиса Vim: заставьте регион только соответствовать на одной строке

Я определил пользовательский тип файла с этими строками:

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

Я включаю все свои заголовки в этом виде документа как это:

==== Biggest Heading ==== // this will be bold and light blue

  ===Sub heading === // this will be yellow 

    bla bla bla  // this will be normally formatted

Однако прямо сейчас, когда когда-либо я использую равняние, входят в систему мой код, он думает, что это - заголовок. Есть ли так или иначе, что я могу вынудить соответствие быть только на одной строке?

7
задан sixtyfootersdude 17 March 2010 в 13:08
поделиться

1 ответ

UPDATE: Мой предыдущий ответ был неверным, вы можете сделать это с регионом, просто сделайте

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

Смотрите :help syn-oneline и :help syn-arguments. Полагаю, это показывает, что я не могу запустить vim прямо сейчас, а?


Предыдущий ответ

Согласно моему чтению :help syntax, нет способа сделать это с регионом. Однако, вы можете сделать это с помощью syn-match:

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

В /=\@ говорится, что нет = непосредственно перед вашим совпадением, а в /=\@! / говорит, что нет = сразу после него, поэтому совпадает ровно один =, куча не= (не включая новые строки - чтобы включить новые строки, это должно быть \_[^=]), затем ровно один =.

Остальное аналогично

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

Вы все еще можете делать совпадения внутри syn-matches, так что если у вас есть вложенность, она все равно будет работать.

Например

syn match Todo /\<TODO\>/ containedin=SubSubtitle,Subtitle,Title,MasterTitle contained
7
ответ дан 7 December 2019 в 07:43
поделиться