2

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

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

我希望每个“列表”的第一个元素都被着色,所以在这种情况下,a1foobar。我还希望每个列表的第二个元素被着色,但以不同的方式。在这种情况下,b2baz。我不关心其他任何事情。除了空格之外,项目之间没有分隔符。

我怎样才能用 vim 模式系统做到这一点?我设法让一个简单的系统工作,但它处理嵌套列表很差。我遇到的麻烦是分别可靠地匹配每个列表的第一项和第二项,而不会与其他项发生冲突。

有什么帮助吗?

4

1 回答 1

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使用正向回溯仅匹配区域的开头。FirstTokenFirstTuple使用该nextgroup属性尝试SecondToken在自己之后立即匹配,忽略空格、换行符和空行。SecondToken使用该contained属性来避免自己到处匹配。

于 2013-01-18T23:00:43.587 回答