Vim:从任意行重启语法高亮显示

pho*_*594 7 vim makefile syntax-highlighting

我在Vim语法高亮中发现了一个有趣的边缘情况.请考虑公司Makefile中的以下代码段:

LDSCRIPT := $(subst ",,$(CONFIG_SYS_LDSCRIPT))
Run Code Online (Sandbox Code Playgroud)

上面的行只是删除给定的双引号LDSCRIPT.什么都没有语法错误; make按预期运行,没有问题.

问题

由于上面的行只包含一个双引号,因此突出显示规则错误地认为Makefile正文的其余部分是引用文本并将其作为颜色.对于简单的Makefile,这是一个不便之处; 对于1KLOC + Makefile,这变得非常麻烦(特别是因为这个预处理接近文件的顶部).

问题

有没有办法根据匹配某些给定正则表达式的行(例如.subst[ \t]*['"],.*)或类似的东西禁用语法高亮?如果失败了,有没有办法在保留上面的亮点的同时重启Vim在任意一行的突出显示?

如果可能的话,我想避免编辑Makefile,因为这个脚本在很多部门之间共享.

我愿意写/修改vimscript来达到这个目的,但我之前没有这样做(在任何合理的程度上).任何提示,指示或其他有用的提示将非常感激.

我试过了什么

:syntax sync minlines=1
:syntax sync fromstart
:syntax sync clear
Run Code Online (Sandbox Code Playgroud)

在编辑器中运行时,以上所有内容都不会对突出显示产生任何影响.通过Vim帮助文档,似乎:syn-sync-fourth可能能够做到我所追求的,但是我不确定它将如何以相反的方式起作用(例如,禁用突出显示而不是应用它).

Ing*_*kat 3

我认为您能做的最好的事情就是添加一个额外的语法规则(在~/.vim/after/syntax/make.vim)以匹配有问题的构造。这似乎有效:

syn match makeIgnore /subst[ \t]*['"],,/ containedin=makeIdent
Run Code Online (Sandbox Code Playgroud)

containedin=是必要的,因为它在$(...)构造中使用。