Vim:从任意行重新启动语法高亮

8

我在Vim语法高亮方面发现了一个有趣的边界案例。考虑以下来自公司Makefile的片段:

LDSCRIPT := $(subst ",,$(CONFIG_SYS_LDSCRIPT))

上面的一行代码只是从给定的LDSCRIPT中删除双引号。语法上没有问题;make按预期运行,没有问题。
问题在于,由于上述行只包含一个双引号,因此高亮规则错误地认为文件的其余部分是引用文本,并将其着色。对于简单的Makefile,这只是个不方便;但对于超过1KLOC的Makefile来说,这将成为真正的麻烦(特别是因为这个预处理过程接近文件顶部)。
问题是:是否有任何方法可以基于匹配某些给定正则表达式的行(例如subst[ \t]*['"],.*)禁用语法高亮或类似的东西?如果无法实现,是否有一种方法可以在保留上面的高亮的同时重新启动Vim的高亮处理?
如果可能的话,我想避免对Makefile进行编辑,因为此脚本共享在许多部门之间。
我愿意编写/修改vimscript来实现这一点,但我以前没有做过这样的事情(至少不是到合理的程度)。任何提示、指针或其他有用的提示都将不胜感激。
:syntax sync minlines=1
:syntax sync fromstart
:syntax sync clear

似乎以上任何操作都没有影响编辑器中的高亮显示。通过查看 Vim 帮助文档,发现 :syn-sync-fourth 可能能够实现我想要的功能,但是我不确定如何以相反的方式运行它(例如禁用高亮而不是应用它)。


搜索了很久,最终你帮了我老板 :) - Pulathisi Bandara
2个回答

3

我认为最好的方法是添加一个额外的语法规则(在~/.vim/after/syntax/make.vim中),以匹配有问题的构造。以下语法规则似乎可以起到作用:

syn match makeIgnore /subst[ \t]*['"],,/ containedin=makeIdent

containedin= 是必须的,因为它会在 $(...) 结构中使用。


太棒了,它像魔法一样奏效。仅有一个小的平台特定差异:在我的 Fedora 18 中,要编辑的文件是 /usr/share/vim/vim73/syntax/make.vim - MysteryMoose
不要编辑软件包提供的系统文件!在下次更新时,您将失去更改。如果您绝对需要编辑原始文件,请在“~/.vim/syntax/make.vim”中创建一个克隆副本。但是,对于此情况,使用“_after_”位置就可以正常工作,无需操作原始脚本。 - Ingo Karkat
抱歉回复晚了,出国了。我尝试将上述代码添加到 ~/.vim/after/syntax/make.vim 中(我必须先创建该文件),但似乎不起作用。我需要将系统中的 make.vim 复制到我的主目录并进行修改吗? - MysteryMoose
对我而言,只需将该行代码添加到后置文件中即可。尝试将系统make.vim复制到~/.vim/syntax/make.vim。如果仍然无效,请在其中进行单行更改(不要使用后置文件)。任何一种方法都比直接修改原文件更好。 - Ingo Karkat
复制系统中的 make.vim 并在那里进行编辑对我很有帮助。再次感谢您的帮助! - MysteryMoose

0

此外,您可以修改您的 makefile 以使双引号保持平衡,像这样:

dquote := $(firstword " ")
LDSCRIPT := $(subst $(dquote),,$(CONFIG_SYS_LDSCRIPT))

类似的方法也可以用于平衡其他字符,比如单引号。

生成的 makefile 可能会更冗长,但不会混淆任何文本编辑器(或许对人类来说也会更清晰易懂)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接