我在Vim语法高亮中发现了一个有趣的边缘情况。请考虑公司Makefile中的以下代码段:
LDSCRIPT := $(subst ",,$(CONFIG_SYS_LDSCRIPT))
上述行只是删除了给定LDSCRIPT
的双引号。什么都没有语法错误; make按预期运行,没有问题。
问题
由于上面的行只包含一个双引号,因此突出显示规则错误地认为Makefile正文的其余部分是引用文本并将其作为颜色。对于简单的Makefile,这是一个不便之处;对于1KLOC + Makefile,这变得非常麻烦(特别是因为这个预处理接近文件的顶部)。
问题
有没有办法根据匹配某些给定正则表达式的行(例如subst[ \t]*['"],.*
)或类似的东西禁用语法高亮?如果不这样做,是否有某种方法可以在保留上面的亮点的同时重新启动Vim在任意一行的突出显示?
如果可能的话,我想避免编辑Makefile,因为这个脚本在很多部门之间共享。
我愿意写/修改vimscript来实现这一目标,但我之前没有这样做(在任何合理的程度上)。任何提示,指示或其他有用的提示将非常感激。
我尝试过什么
:syntax sync minlines=1
:syntax sync fromstart
:syntax sync clear
在编辑器中运行时,上述任何一项都不会对突出显示产生任何影响。通过Vim帮助文档,似乎:syn-sync-fourth
可能能够完成我所追求的目标,但是我不确定它将如何以相反的方式起作用(例如,禁用突出显示而不是应用它) )。
答案 0 :(得分:3)
我认为您可以做的最好的事情是添加一个额外的语法规则(在~/.vim/after/syntax/make.vim
中)以匹配有问题的构造。这似乎有效:
syn match makeIgnore /subst[ \t]*['"],,/ containedin=makeIdent
containedin=
是必要的,因为它在$(...)
构造中使用。
答案 1 :(得分:0)
此外,您可以修改makefile以使双引号保持平衡,如下所示:
dquote := $(firstword " ")
LDSCRIPT := $(subst $(dquote),,$(CONFIG_SYS_LDSCRIPT))
类似的东西可以用来平衡其他字符,例如单引号。
生成的makefile可能更冗长,但不会混淆任何文本编辑器(也许对人类也不会造成混淆)。