我正在尝试编写一组语法规则来匹配可嵌套语法。基本上,在最简单的层面上,一切要么是一个 token ,要么是一个括号。以下是此类语法的示例:
[
[a b c]
[1 2 3]
[foo
[bar baz]]
]
我希望每个“列表”的第一个元素是彩色的,因此在本例中,a
、1
、foo
和栏
。我还希望每个列表的第二个元素被着色,但以不同的方式。在本例中,为 b
、2
和 baz
。我不关心其他任何事情。除了空格之外,项目之间没有分隔符。
如何使用 vim 模式系统做到这一点?我已经成功地让一个简单的系统正常工作,但它处理嵌套列表的能力很差。我遇到的麻烦是可靠地分别匹配每个列表的第一个和第二个项目,而不与其他项目发生冲突。
有什么帮助吗?
最佳答案
以下规则集突出显示您的语法:
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
用于所有其他元组。这是通过互斥的lookbehind 完成的,并且自动处理正确的嵌套。 FirstToken
使用正向后查找仅匹配区域的开头。 FirstToken
和 FirstTuple
使用 nextgroup
属性尝试匹配紧随其后的 SecondToken
,忽略空格、换行符和空行。 SecondToken
使用 contained
属性来避免自身到处匹配。
关于Vim 语法递归匹配第一个和第二个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14408398/