подсветка пользовательского синтаксиса vim

Я хочу создать пользовательскую подсветку синтаксиса в vim для списка задач.

Элементы задачи начинаются с дефиса. Релевантны два типа элементов задачи: (а) элементы без тега «@done». (b) элементы с тегом @done. (а) и (б) должны быть выделены по-разному.

Я использую taskpaper, который отлично работает, но проблема в том, что я пытаюсь заставить это работать для элементов задач, которые охватывают несколько строк. Например:

- Regular item (works)
- Completed item @done (works)
- Multi-line item. This item continues on to 
  the line below. (doesn't work)
- Multi-line completed item. This item continues
  on to the line below. (doesn't work). @done

Файл выделения в taskpaper работает для первых двух, но не для вторых двух. В качестве обходного пути я попробовал это для последнего случая выше:

syn region multLineDoneItem start="{" end="}" fold
HiLink multLineDoneItem NonText

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

- {Multi-line completed item. This item continues
  on to the line below. (workaround works).}

Я уже искал stackexchange и в других местах. Буду признателен за любую помощь! :)


person PonyEars    schedule 26.03.2011    source источник


Ответы (1)


Вы можете попробовать использовать атом регулярного выражения \ze в конце области синтаксиса. Это позволит вам сопоставить все, но не включая следующую задачу. Я не смотрел, как вы выполняете сопоставление, но что-то вроде этого может сработать.

syn region muiltLineItem     start="^-" end="\(\s*\n)\+\ze^-" fold    
syn region multiLineDoneItem start="^-" end="@done\s*\n\(\s*\n\)*\ze^-" fold
HiLink multiLineItem Normal
HiLink multiLineDoneItem NonText

Я вообще не проверял это, но я думаю, что это или что-то в этом роде должно работать. Если вы хотите принять во внимание отступ, атом регулярного выражения \z позволит вам сопоставлять строки с одним и тем же отступом.

ОБНОВЛЕНИЕ:

Попробуй это:

syn match multilineItem "^-\_.\{-}\ze\(\n-\|\%$\)" fold
syn match multilineDoneItem "^-\(\%(\_^-\)\@!\_.\)\{-}@done\s*\n\ze" fold
command -nargs=+ HiLink highlight default link <args>
HiLink multilineItem Normal
HiLink multilineDoneItem NonText
delcommand HiLink

О, также это должно работать для всех четырех случаев, а не только для многострочных элементов.

person Greg Sexton    schedule 27.03.2011
comment
Хм, спасибо, но проблема, похоже, в том, что в том, что вы предложили выше, все в конечном итоге соответствует multiLineDoneItem, потому что оно начинается с ^_ . Таким образом, vim запускает multiLineDoneItem с самого первого элемента (даже если он неполный) и не прекращает сопоставление до конца файла. :( - person PonyEars; 28.03.2011
comment
О да. Я определенно упростил это. Попробуйте это обновление и дайте мне знать, как у вас дела. Я проверил это на вашем примере, и, похоже, он работает нормально. Вероятно, его можно немного расширить, чтобы позаботиться о любом другом тексте в буфере, но это должно послужить хорошей отправной точкой. - person Greg Sexton; 28.03.2011
comment
Вау, это потрясающее регулярное выражение, большое спасибо! Да, это отличная отправная точка, поэтому я отмечу это как ответ. Есть куча случаев (ни один из которых я не упомянул), которые не работают прямо сейчас, но я собираюсь попробовать кое-что, прежде чем задавать вам дополнительные вопросы. Однако я не совсем понимаю одну вещь: почему у вас есть '\ ze' в конце регулярного выражения multilineDoneItem? `(\%(_^-)\@!' все равно перестанет совпадать, когда будет найден начальный шаблон, верно? - person PonyEars; 31.03.2011
comment
Да, ты прав. Последний \ze в muiltlineDoneItem не нужен, он просто остался от нескольких других вещей, которые я пробовал. Оказывается, это было сложнее, чем я думал! Рад, что это работает для вас, хотя. - person Greg Sexton; 31.03.2011