提高语法匹配正则表达式的性能

Improving performance of syntax match regular expression

我正在通过添加对自动折叠的支持来改进 Verilog 语法。 最初我在做以下事情:

syn region verilogFold start="\<task\>" end="\<endtask\>" transparent keepend fold

但是因为 task 也被用作 syntax keyword,所以没有检测到折叠。 所以,为了避免匹配我现在使用的 task 关键字:

syn region verilogFold start="\(^\s*task\)\@<=\s\+\w\+" end="\<endtask\>" transparent keepend fold

不幸的是,这会导致处理每个文件的时间 vim 大幅增加。

对于如何改进此表达式以获得更好的性能,有没有人有任何想法?

是的,正面回顾 可能会很慢。在最近的 Vim 7.4 版本中,您可以将搜索限制为 4 个字节(通过 \@4<=),但我认为在这种情况下,最好删除单独的关键字定义并为区域开始和结束着色通过 matchgroup:

syn region verilogFold matchgroup=verilogStatement start="\<task\>" end="\<endtask\>" transparent keepend fold

如果这不起作用,请尝试删除 transparent 属性;我不确定这是否适用于 matchgroup,但我想不是。