我正在尝试编写一组用于匹配可嵌套语法的语法规则。基本上,在最简单的层面上,一切都是令牌或括号。以下是这种语法的示例:
[
[a b c]
[1 2 3]
[foo
[bar baz]]
]
我希望每个“列表”的第一个元素都是彩色的,所以在这种情况下,a
,1
,foo
和bar
。我还希望每个列表的第二个元素都是彩色的,但是以不同的方式。在这种情况下,b
,2
和baz
。我不在乎别的什么。除了空格之外,项目之间没有分隔符。
如何使用vim模式系统执行此操作?我设法让一个简单的系统工作,但它处理嵌套列表很差。我遇到的麻烦是分别可靠地匹配每个列表的第一个和第二个项目,而不会与其他列表紧密相关。
任何帮助?
答案 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仅匹配区域的开头。 FirstToken
和FirstTuple
使用nextgroup
属性尝试立即匹配SecondToken
,忽略空格,换行符和空行。 SecondToken
使用contained
属性来避免在任何地方进行匹配。