2011-03-26 145 views
3

我想在vim中为任务列表创建自定义语法突出显示。vim自定义语法突出显示

任务项目以连字符开头。两种类型的任务项目是相关的:(a)没有'@done'标签的项目。 (b)带有@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和其他地方。我将不胜感激任何帮助! :)

回答

5

您可以尝试在您的语法区域的末尾部分使用\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正则表达式原子将允许您保留具有相同缩进的匹配行。

UPDATE:

试试这个:

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 

哦,也是这应该适用于所有的四个案件,而不仅多线项目。

+0

嗯,谢谢,但问题似乎是,在你上面提到的建议中,一切都以匹配multiLineDoneItem结尾,因为它以“^ _”开头。所以vim在第一个项目(即使它不完整)启动multiLineDoneItem,并且不停止匹配直到文件结束。 :( – PonyEars 2011-03-28 01:44:14

+0

嗯,是的,我绝对简化了这个,试试这个更新,让我知道你是怎么做的,我已经用你的例子测试过了,它似乎工作得很好,也许可以做更多的扩展照顾缓冲区中的任何其他文本,但它应该是一个很好的起点。 – 2011-03-28 18:42:44

+0

哇,这是一个了不起的正则表达式,非常感谢!是的,这是一个很好的起点,所以我要将它标记为已回答。现在有很多案例(我没有提到过),但现在还不行,但在我问你更多问题之前,我会尝试几件事情,但我并不完全明白但是:为什么在multilineDoneItem regexp的末尾有一个'\ ze'?当找到起始模式时,'(\%(\ _^- \)\ @!'应该会停止匹配,对吧? – PonyEars 2011-03-31 01:39:16