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

时间:2014-11-05 17:11:51

标签: vim makefile syntax-highlighting

我在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可能能够完成我所追求的目标,但是我不确定它将如何以相反的方式起作用(例如,禁用突出显示而不是应用它) )。

2 个答案:

答案 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可能更冗长,但不会混淆任何文本编辑器(也许对人类也不会造成混淆)。