【问题标题】:Vim: Restart Syntax Highlighting from Arbitrary LineVim:从任意行重新启动语法突出显示
【发布时间】:2015-01-01 23:48:56
【问题描述】:

我在 Vim 语法高亮中发现了一个有趣的边缘案例。考虑来自公司 Makefile 的以下 sn-p:

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

上面的行只是从给定的LDSCRIPT 中删除双引号。语法上没有错; make 按预期运行,没有问题。

问题

由于上面的行只包含一个双引号,高亮规则错误地认为 Makefile 的其余部分是带引号的文本并对其进行着色。对于简单的 Makefile,这是一个不便;对于 1KLOC+ Makefiles,这真的很麻烦(特别是因为这个预处理在文件顶部附近)。

问题

有什么方法可以禁用基于与某些给定正则表达式匹配的行(例如subst[ \t]*['"],.*)或类似内容的语法突出显示?如果做不到这一点,有没有办法在保留上面的高亮显示的同时在任意行重新启动 Vim 的高亮显示?

如果可能的话,我希望避免对 Makefile 进行编辑,因为该脚本在多个部门之间共享。

我愿意编写/修改 vimscript 来实现这一点,但是我以前没有这样做过(在任何合理的程度上)。任何提示、指针或其他有用的提示将不胜感激。

我的尝试

:syntax sync minlines=1
:syntax sync fromstart
:syntax sync clear

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

【问题讨论】:

  • 搜搜搜,终于,你帮了我老大:)

标签: vim makefile syntax-highlighting


【解决方案1】:

此外,您可以修改您的 makefile 以平衡双引号,如下所示:

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

类似的东西可以用来平衡其他字符,比如单引号。

生成的 makefile 可能更冗长,但不会混淆任何文本编辑器(也可能不会对人类造成混淆)。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 太棒了,这就像一个魅力。一个特定于平台的小差异:在我的 Fedora 18 机器上,要编辑的文件是 /usr/share/vim/vim73/syntax/make.vim
    • 不要编辑软件包提供的系统文件!您将在下次更新时丢失更改。如果您绝对需要编辑原始文件,请在~/.vim/syntax/make.vim 中创建一个克隆。但是对于,使用 after 位置就可以了,不需要弄乱原始脚本。
    • 抱歉耽搁了;出国了。我尝试在~/.vim/after/syntax/make.vim 处添加上述行(我必须首先创建文件),但它似乎不起作用。我需要将系统make.vim 复制到我的家庭位置并进行修改吗?
    • 对我来说,只需将行添加到后文件即可。尝试将系统make.vim 复制到~/.vim/syntax/make.vim。如果这仍然不起作用,请在此处编辑单行更改(并且不要使用后文件)。任何一个都比原地修改要好。
    • 复制系统 make.vim 并在那里进行编辑对我有用。再次感谢您的帮助!
    猜你喜欢
    • 2016-08-17
    • 2011-01-10
    • 2015-11-26
    • 1970-01-01
    • 2011-05-03
    • 2010-11-22
    • 1970-01-01
    • 1970-01-01
    • 2013-01-19
    相关资源
    最近更新 更多