gpt4 book ai didi

syntax-highlighting - Vim:寻求帮助以创建自定义语法突出显示

转载 作者:行者123 更新时间:2023-12-04 08:10:34 24 4
gpt4 key购买 nike

这是我到目前为止所得到的:

syntax match cfg_Comment '#.*$' contains=cfg_DocTag
syntax match cfg_DocTag '#\s*\zs[\\@]\l\+' contained

highlight default link cfg_Comment Comment
highlight default link cfg_DocTag SpecialComment

完美适用于以下内容:
##
# @brief The maximum.
# @type number
# @default 1

我接下来要做的是突出显示 @type之后的下一个词与 Type团体。所以我做了以下事情:
syntax match cfg_Comment '#.*$' contains=cfg_DocTag,cfg_DocField_type
syntax match cfg_DocTag '#\s*\zs[\\@]\l\+' contained

syntax match cfg_DocTag_type '@type' containedin=cfg_DocTag nextgroup=cfg_DocField_type skipwhite
syntax match cfg_DocField_type '\a\+' contained

highlight default link cfg_Comment Comment
highlight default link cfg_DocTag SpecialComment
highlight default link cfg_DocField_type Type

这有两个问题:
  • 现在 @type没有突出显示,我明白了,因为显然我没有为它指定组,但我希望它从其父容器中继承颜色 cfg_DocTag .
  • 当然现在评论中的所有内容都是Type颜色,而不仅仅是后面的词 @type ,我再次得到它,因为我指定了 cfg_Commentcfg_DocField_type 的容器.

  • 我知道问题的根源,但我不知道如何优雅地解决它们并尽可能少地编写样板代码。

    最后,谁能告诉我为什么
    syntax match cfg_DocTag_type '@type' containedin=cfg_DocTag nextgroup=cfg_DocField_type skipwhite


    syntax keyword cfg_DocTag_type @type containedin=cfg_DocTag nextgroup=cfg_DocField_type skipwhite

    不一样吗? IE。在第一种情况下,就像我上面描述的那样: @type由于未指定组,因此不再突出显示,但这是预期的。但是在第二种情况下,即使没有指定组,它也被突出显示,这是意料之外的,所以感觉就像一个根本不匹配的关键字。并且可以使用最简单的测试用例轻松证明:
  • 突出作品:
    syntax match Test '@type'

    highlight default link Test Keyword
  • 突出显示不起作用:
    syntax keyword Test @type

    highlight default link Test Keyword

  • 更新

    按照 Ingo 的回答,建议的解决方案确实有效。然而,对我来说有趣的是为什么这个没有?
    syntax match cfg_Comment '#.*$' contains=cfg_DocTag
    syntax match cfg_DocTag '#\s*\zs[\\@]\l\+' contained

    syntax match cfg_DocTag_type '@type' transparent containedin=cfg_DocTag nextgroup=cfg_DocField_type skipwhite
    syntax match cfg_DocField_type '\a\+' contained

    highlight default link cfg_Comment Comment
    highlight default link cfg_DocTag SpecialComment
    highlight default link cfg_DocField_type Type

    如果它有效,这将是完美的。它使我们免于重复注释匹配,并进行自然继承。省略 @之前 type顺便说一下,不会改变任何东西,即继承效果保持不变。但为什么 cfg_DocField_type是不是突出显示?有任何想法吗?

    最佳答案

    你已经很接近了。您对 cfg_DocTag_type 的收容在 cfg_DocTag不起作用,因为它们会在同一位置匹配。离开领先@前者会修复它,但 nextgroup=cfg_DocField_type仍然不匹配,因为显然 cfg_DocTag 的匹配结束了(在标签之后)使 Vim 不应用 nextgroup .

    我所做的是把 cfg_DocTag_typecfg_DocTag 处于同一级别,即不包含在后者中。只有赛前的重复#\s*\zs作为一个缺点。

    syntax match cfg_Comment '#.*$' contains=cfg_DocTag,cfg_DocTag_type
    syntax match cfg_DocTag '#\s*\zs[\\@]\l\+' contained

    syntax match cfg_DocTag_type '#\s*\zs@type' nextgroup=cfg_DocField_type skipwhite
    syntax match cfg_DocField_type '\a\+' contained

    highlight default link cfg_Comment Comment
    highlight default link cfg_DocTag SpecialComment
    highlight default link cfg_DocTag_type cfg_DocTag
    highlight default link cfg_DocField_type Type

    回复 1.:它是 不是 包含;只有当你离开 @ .然后,添加 transparent会给你带来继承效应。

    重新“终于”:我怀疑 @不属于 'iskeyword' (它不是默认的),但它必须用于 :syn keyword .

    提示:安装 SyntaxAttr.vim - Show syntax highlighting attributes of character under cursor 后,语法脚本开发更容易插入。

    关于syntax-highlighting - Vim:寻求帮助以创建自定义语法突出显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19594700/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com