Vim语法递归地匹配第一和第二元素

时间:2013-01-18 22:03:58

标签: vim syntax vim-syntax-highlighting

我正在尝试编写一组用于匹配可嵌套语法的语法规则。基本上,在最简单的层面上,一切都是令牌或括号。以下是这种语法的示例:

[
    [a b c]
    [1 2 3]
    [foo
        [bar baz]]
]

我希望每个“列表”的第一个元素都是彩色的,所以在这种情况下,a1foobar。我还希望每个列表的第二个元素都是彩色的,但是以不同的方式。在这种情况下,b2baz。我不在乎别的什么。除了空格之外,项目之间没有分隔符。

如何使用vim模式系统执行此操作?我设法让一个简单的系统工作,但它处理嵌套列表很差。我遇到的麻烦是分别可靠地匹配每个列表的第一个第二个项目,而不会与其他列表紧密相关。

任何帮助?

1 个答案:

答案 0 :(得分:2)

以下规则突出显示了您的语法:

highlight       FirstToken      ctermfg=green       guifg=green
highlight       SecondToken     ctermfg=red         guifg=red

syntax region   FirstTuple      start="\(\[\_s*\)\@<=\["    end="]"
            \ containedin=FirstTuple,OtherTuple
            \ nextgroup=SecondToken
            \ skipwhite skipnl skipempty
syntax region   OtherTuple      start="\(\[\_s*\)\@<!\["    end="]"
            \ containedin=FirstTuple,OtherTuple

syntax match    FirstToken      "\(\[\_s*\)\@<=[^ [\]]\+"
            \ containedin=FirstTuple,OtherTuple
            \ nextgroup=SecondToken
            \ skipwhite skipnl skipempty
syntax match    SecondToken     "[^ [\]]\+"
            \ contained

FirstTuple区域匹配标记或其他元组的元组,它们是父元组中的第一个元组; OtherTuple用于所有其他元组。这是通过互斥的lookbehinds完成的,并且自动处理正确的嵌套。 FirstToken使用正向lookbehind仅匹配区域的开头。 FirstTokenFirstTuple使用nextgroup属性尝试立即匹配SecondToken,忽略空格,换行符和空行。 SecondToken使用contained属性来避免在任何地方进行匹配。