Подсветка Vim Markdown (элементы списка и конфликты блоков кода) - PullRequest
10 голосов
/ 26 сентября 2008

Я решил узнать больше о 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


Ответы [ 3 ]

6 голосов
/ 26 сентября 2008

Просто убедитесь, что определение mkdListItem соответствует определению mkdCodeBlock, например:

syn match mkdCodeBlock   /\(\s\{4,}\|\t\{1,}\).*\n/ contained nextgroup=mkdCodeBlock  
hi link mkdCodeBlock  comment

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

syn match mkdBlankLine   /^\s*\n/    nextgroup=mkdCodeBlock,mkdListItem transparent

В документации Vim написано :help :syn-define:

"Если в одной и той же позиции совпадает несколько предметов, то определены последние победы. Таким образом, вы можете переопределить ранее определенные элементы синтаксиса используя элемент, который соответствует тому же тексту. Но ключевое слово всегда идет перед матч или регион. И ключевое слово с соответствующим регистром всегда идет перед ключевое слово с игнорированием регистра. "

1 голос
/ 27 сентября 2008

hcs42 был верным. Я помню, что сейчас читал этот раздел, но забыл об этом, пока hcs24 не напомнил мне об этом.

Вот мой обновленный синтаксис (несколько других настроек), который работает:

"""""""""""""""""""""""""""""""""""""""
" Code Blocks:

"   Indent with at least 4 space or 1 tab
"   This rule must appear for mkdListItem, or highlighting gets messed up
syn match mkdCodeBlock   /\(\s\{4,}\|\t\{1,}\).*\n/ contained nextgroup=mkdCodeBlock  

"""""""""""""""""""""""""""""""""""""""
" Lists:

"   These first two rules need to be first or the highlighting will be
"   incorrect

"   Continue a list on the current line or next line
syn match mkdListCont /\s*[^-+*].*/ contained nextgroup=mkdListCont,mkdListItem,mkdListSkipNL contains=@Spell skipnl transparent

"   Skip empty lines
syn match mkdListSkipNL /\s*\n/ contained nextgroup=mkdListItem,mkdListSkipNL 

"   Unorder list
syn match  mkdListItem /\s*[-*+]\s\+/ contained nextgroup=mkdListSkipNL,mkdListCont  skipnl 
0 голосов
/ 23 марта 2014

Тао Чжин, это может охватывать ваши варианты использования, но не распространяется на синтаксис Markdown. В Markdown элемент списка может содержать блок кода. Вы можете взглянуть на мое решение здесь

TL; DR; проблема в том, что vim не позволяет вам сказать что-то вроде: блок, имеющий тот же отступ, что и его контейнер + 4 пробела . Единственное решение, которое я нашел, - это сгенерировать правила для каждого типа блоков, которые могли бы содержаться в элементах списка для каждого уровня отступа (фактически я поддерживаю 42 уровня отступа, но это произвольное число)

Итак, у меня есть markdownCodeBlockInListItemAtLevel1, который должен должен содержаться в markdownListItemAtLevel1, и в нем должно быть как минимум 8 начальных пробелов, тогда markdownCodeBlockInListItemAtLevel2, который должен должен состоять в markdown содержится в markdownListItemAtLevel1 муравей должен иметь как минимум 10 ведущих пробелов, ecc ...

Я знаю, что прошло несколько лет, но, возможно, кто-то посчитает этот ответ полезным, поскольку весь синтаксис, основанный на отступе, страдает той же проблемой

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...