【问题标题】:Multiple matches for syntax highlighting in VIMVIM 中语法高亮的多重匹配
【发布时间】:2013-05-07 03:43:06
【问题描述】:

我正在编写一个语法文件来匹配日志格式(基本上基于列;类似的例子可以考虑 syslog),并且我正在尝试为列设置一种继承类型。

我有两个主要目标。

首先,我想说第 3 列是“组件”字段(假设它由标题标记;它也可以位于固定位置)并将背景设置为灰色。然后我想说组件“foo”的前景色为红色,组件“bar”的前景色为绿色,但它们应该继承“组件”列的背景色。在这种情况下,该字段实际上应该有两个语法匹配;这也使得隐藏整个列变得容易(比如Toggling the concealed attribute for a syntax highlight in VIM

其次,有一个级别字段;我想将关键级别消息的整行背景设置为红色,但应继续通过正常突出显示设置前景(组件、源等;我放弃了大部分其他要求)。

从我在 vim 文档中看到的内容来看,这似乎是不可能的。我错过了什么吗?或者,任何人都可以提出一个好的解决方法吗?

谢谢

【问题讨论】:

    标签: vim


    【解决方案1】:

    你不能(还)。对于每个字符,Vim 只使用一个特定的高亮组,由最后的“最内部”非透明语法组匹配决定。

    要解决这个问题,您需要定义一个组合的高亮组和相应的:syntax 命令。一些语法(例如 $VIMRUNTIME/syntax/html.vim 和各种 Wiki 格式)使用它来组合粗体、斜体和下划线,但之后会变得乏味和重复。

    有一个patch proposed 可以为:syntax 命令添加一个combine 修饰符;它在 Bram 的待办事项列表中。

    【讨论】:

    • 我害怕那个。我可能可以编写所有组合的生成脚本,而不是自己写出来……关于如何实现隐藏效果的任何建议?我总是可以有一些特殊的值来遍历所有可能的类型,但我希望通过这种方式让用户查看 synID 并知道要隐藏什么。
    • 链接隐藏解决方案在用于外部语法时看起来像一个不错的 hack,但在您自己的语法中(特别是如果您必须编写定义脚本,无论如何),我宁愿使用配置变量确定哪些语法组获得conceal 属性。要更改,您必须更改变量,然后再次更改:syntax on
    • 现在,我有用于隐藏公共列的地图,因此无论哪种方式都可以;然而,我有这样的想法,让用户调用 ConcealCurrentGroup() 并让它自动隐藏光标所在的任何列。哦,好吧。
    猜你喜欢
    • 1970-01-01
    • 2013-09-06
    • 2018-06-21
    • 2012-08-16
    • 2014-11-14
    • 1970-01-01
    • 2017-07-30
    • 2011-01-19
    • 2015-08-08
    相关资源
    最近更新 更多