【问题标题】:Vim syntax highlighting: overlapping regexVim 语法高亮:重叠正则表达式
【发布时间】:2012-05-16 11:06:27
【问题描述】:

我尝试在 vim 中为 javascript 添加一些语法高亮,但我一直遇到一个问题:当字符已经高亮时,它们似乎被所有其他正则表达式完全忽略了。

例如,我尝试为函数的参数列表添加语法高亮。在创建正确的 rexex 时,我禁用了 function 关键字的语法突出显示,这样更容易看到我的 regex 做了什么。我最终得到了以下(工作)正则表达式:

syn match javaScriptArguments "[(=\:\s,]function.\{-}(\zs.\{-}\ze)"

但是,一旦我再次启用 function 关键字的突出显示,此行就不再起作用了。 vim 似乎只是简单地排除了已经突出显示的所有内容,因此它不会找到与上面的正则表达式匹配的任何匹配项,即使它不会导致字符被突出显示两次。

我该如何解决/解决这个问题?

【问题讨论】:

    标签: vim syntax-highlighting vim-syntax-highlighting


    【解决方案1】:

    语法定义必须是contained,才能在其他语法项中匹配。在:help syn-contains找到所有可怕的细节。

    在您的情况下,您依赖于通过\zs 对“function”关键字进行前瞻。以我的经验,这必然会导致问题,但一旦您使用contained,这可能会变得不必要。一般来说,很难在不修改原始脚本的情况下扩展现有的语法定义(我想这是您打算做的)。看看:help :syn-containedin:help :syn-nextgroup

    【讨论】:

    • 非常感谢!根据您的提示,我创建了一个识别整个函数定义的正则表达式,并使用包含和包含的参数,我可以识别单独的正则表达式中的每个单独部分。
    • 是的,这正是大多数语法定义执行此操作的方式。我很高兴这对你有用。如果您认为您的扩展语法通常很有用(并且与其他 Vim 语法没有太大的偏差),您可以将您的修改发送给原始语法维护者;他列在文件的标题中。另请注意,在 vim.org(作者 Yi Zhao)上还有另一种 javascript 语法。
    • 这是个好主意!我还看到 Yi Zhao 的替代语法突出显示,但他也没有突出显示参数。我把它发给他,也许他也有兴趣。
    猜你喜欢
    • 2014-05-14
    • 2016-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-01
    • 1970-01-01
    相关资源
    最近更新 更多