vim: Как мне синтаксически выделить строку, чтобы одна ее часть была отформатирована как A, а другая - как B? - PullRequest
0 голосов
/ 02 июня 2019

Я занимаюсь этим часами сегодня, изучаю онлайн и читаю руководство по vim.Я почти сошел с ума.Я хочу отформатировать строки с метками времени, чтобы они имели зеленый текст, а сами метки выделялись жирным шрифтом.Например, если у меня есть следующие 4 строки:

1  [ 20:42:57 20190601 ] Apple car truck a whole bunch of other nonsense
2  ball baby zebra more nonsense
3  [ 20:43:12 20190601 ] dog blah blah blah
4  circle mouse rat up down left right b a b a select start

Тогда обе строки, содержащие метки времени (строки 2 и 4), будут иметь зеленый текст, а сами метки времени ([ 20:42:57 20190601 ]* 1006)* и [ 20:43:12 20190601 ]) будут выделены жирным шрифтом.

Моей первой мыслью было просто использовать шаблон регулярного выражения, чтобы сопоставить все строки с отметкой времени и покрасить их в зеленый цвет, а затем использовать другой шаблон регулярного выражения.только для самих отметок времени и выделите их жирным шрифтом, например:

syntax match timestampline "\[ \([0-9]\{2}\:\)\{2}[0-9]\{2} [0-9]\{8} \].*$"
highlight timestampline ctermfg=green ctermbg=NONE
syntax match timestamponly "\[ \([0-9]\{2}\:\)\{2}[0-9]\{2} [0-9]\{8} \]"
highlight timestamponly cterm=bold

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

Тогда я подумал, что, возможно, мне нужносообщать каждому синтаксису, где останавливать или начинать сопоставление, например, так:

syntax match timestampline "\[ \([0-9]\{2}\:\)\{2}[0-9]\{2} [0-9]\{8} \]\{-}\zs.*$"
highlight timestampline ctermfg=green ctermbg=NONE
syntax match timestamponly "\[ \([0-9]\{2}\:\)\{2}[0-9]\{2} [0-9]\{8} \]\ze"
highlight timestamponly ctermfg=green ctermbg=NONE cterm=bold

Но это просто приводит к тому, что метки времени становятся зелеными и жирными, а все остальное не форматируется.

Я непонимаю, что я делаю не так.Почему вторые основные утверждения полностью отрицают первые?Разве они не должны просто форматировать то, что им соответствует, и не влиять на то, что им не соответствует?

1 Ответ

0 голосов
/ 02 июня 2019

:help :syn-priority:

Когда несколько элементов синтаксиса могут совпадать, используются следующие правила:

  1. Когда несколько элементов Match или Region начинаются в одной позиции,элемент, определенный последним, имеет приоритет.

Таким образом, в вашем коде timestamponly всегда побеждает, а timestampline никогда не используется.

Вы можете получить желаемый эффект, подобный этому:

syntax match timestampline /.*$/ contained
highlight timestampline ctermfg=green

syntax match timestamponly /\[ \d\{2}:\d\{2}:\d\{2} \d\{8} \]/ nextgroup=timestampline
highlight timestamponly ctermfg=green cterm=bold
...