персонализирано осветяване на синтаксиса на vim

Искам да създам персонализирано подчертаване на синтаксиса във vim за списък със задачи.

Елементите на задачите започват с тире. Уместни са два типа задачи: (а) елементи без етикет „@done“. (б) елементи с етикет @done. (a) и (b) трябва да бъдат подчертани по различен начин.

Използвам 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