Я решил узнать больше о vim и его подсветке синтаксиса.
Используя примеры для других, я создаю свой собственный файл синтаксиса для Markdown. Я видел mkd.vim , и у него тоже есть эта проблема.
Моя проблема связана с элементами списка и выделением блока кода.
Кодовый блок определение :
- первая строка пуста
- вторая строка начинается минимум с 4 пробелов или 1 табуляции
- блок заканчивается пустой строкой
Пример:
Regular text
this is code, monospaced and left untouched by markdown
another line of code
Regular Text
Синтаксис My Vim для блока кода:
syn match mkdCodeBlock /\(\s\{4,}\|\t\{1,}\).*\n/ contained nextgroup=mkdCodeBlock
hi link mkdCodeBlock comment
Неупорядоченный элемент списка определение :
- первая строка пуста
- вторая строка начинается с [- + *], за которым следует пробел
- список заканчивается пустой строкой, затем обычной (не-списочной) строкой
- между позициями можно добавить любое количество пустых строк
- подсписок указывается с помощью отступа (4 пробела или 1 табуляция)
- строка обычного текста после элемента списка включается как продолжение этого элемента списка
* +1040 * Пример: * * тысяча сорок один
Regular text
- item 1
- sub item 1
- sub item 2
- item 2
this is part of item 2
so is this
- item 3, still in the same list
- sub item 1
- sub item 2
Regular text, list ends above
Синтаксис My Vim для определения элемента неупорядоченного списка (я только выделяю [-+*]
):
syn region mkdListItem start=/\s*[-*+]\s\+/ matchgroup=pdcListText end=".*" contained nextgroup=mkdListItem,mkdListSkipNL contains=@Spell skipnl
syn match mkdListSkipNL /\s*\n/ contained nextgroup=mkdListItem,mkdListSkipNL skipnl
hi link mkdListItem operator
Я не могу заставить подсветку работать с последними двумя правилами для списка и с блоком кода.
Это пример, который нарушает мою подсветку синтаксиса:
Regular text
- Item 1
- Item 2
part of item 2
- these 2 line should be highlighted as a list item
- but they are highlighted as a code block
В настоящее время я не могу понять, как заставить подсветку работать так, как я этого хочу
Забыл добавить "глобальное" синтаксическое правило, используемое в обоих правилах, перечисленных ниже. Это делается для того, чтобы они начинались с пустой строки.
syn match mkdBlankLine /^\s*\n/ nextgroup=mkdCodeBlock,mkdListItem transparent
Еще одно примечание: я должен был быть более ясным. В моем файле синтаксиса правила List отображаются перед Правилами Blockquote