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

标签 vim syntax vim-syntax-highlighting

我正在尝试编写一组语法规则来匹配可嵌套语法。基本上,在最简单的层面上,一切要么是一个 token ,要么是一个括号。以下是此类语法的示例:

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

我希望每个“列表”的第一个元素是彩色的,因此在本例中,a1foo。我还希望每个列表的第二个元素被着色,但以不同的方式。在本例中,为 b2baz。我不关心其他任何事情。除了空格之外,项目之间没有分隔符。

如何使用 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 使用正向后查找仅匹配区域的开头。 FirstTokenFirstTuple 使用 nextgroup 属性尝试匹配紧随其后的 SecondToken,忽略空格、换行符和空行。 SecondToken 使用 contained 属性来避免自身到处匹配。

关于Vim 语法递归匹配第一个和第二个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14408398/

相关文章:

Vim 折叠 HTML5 样板 CSS?

vim - 默认情况下,为VIM或GVIM的某些文件扩展名添加语法突出显示

c++ - Vim 中的自动补全

python - 内联 for 循环

vim - Vim为什么用红色突出显示我所有的JSON注释?

vim - vim 语法优先级可以颠倒吗?

vim - 为什么 vim 中行突出显示不起作用?

vim - 如何告诉 Vim 不要使用 ~/.vim

java - Android SQLite 不喜欢语法

Mysql where子句语法