vim自定义语法高亮显示

Pon*_*ars 3 vim syntax-highlighting vim-syntax-highlighting

我想在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
Run Code Online (Sandbox Code Playgroud)

任务纸上的突出显示文件适用于前两个,但不适用于后两个.作为一个解决方法的黑客,我尝试了上面的最后一个案例:

syn region multLineDoneItem start="{" end="}" fold
HiLink multLineDoneItem NonText
Run Code Online (Sandbox Code Playgroud)

但现在,我被迫用大括号标记多行完成项目,如下所示:

- {Multi-line completed item. This item continues
  on to the line below. (workaround works).}
Run Code Online (Sandbox Code Playgroud)

我已经搜索过stackexchange和其他地方了.我将不胜感激任何帮助!:)

Gre*_*ton 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
Run Code Online (Sandbox Code Playgroud)

我根本没有测试过这个,但我认为它或类似的东西应该可行.如果您希望考虑缩进,\z则regex atom将允许您使用相同的缩进来保持匹配的行.

更新:

试试这个:

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
Run Code Online (Sandbox Code Playgroud)

哦,这也适用于所有四种情况,而不仅仅是多行项目.