代码之家  ›  专栏  ›  技术社区  ›  ELLIOTTCABLE

如何在文档开始时启动VIM语法区域,同时允许在同一位置匹配关键字?

  •  1
  • ELLIOTTCABLE  · 技术社区  · 6 年前

    多亏了 another question ,我已经成功地为文档分配了一个语法区域 从一开始( \%^ )文件的 :

    syn region menhirDeclarations start=/\%^./rs=e-1 end=/%%/me=s-1
    

    要使其生效,开始模式必须匹配文档的第一个字符。也就是说,上述方法不适用于 start=/\%^/ 它需要最后一个 . (比赛成功后, 排除 那个角色,但在那之前必须匹配

    问题是,任何 :syn-keyword 在同一位置匹配,即使在 :syn-priority ___基本上,这意味着我不能 任何 keyword 允许在文档开始处匹配,或者在放置关键字时,该关键字将阻止上述“文档的整个顶部”区域完全匹配。

    具体例子。使用以下语法:

    syn keyword menhirDeclarationKeyword %parameter %token " ...
    syn region menhirDeclarations start=/\%^./rs=e-1 end=/%%/me=s-1
    

    文件

    %token <blah> blah
    blah blah blah
    

    _将不包含必要的 menhirDeclarations 区域,因为 menhirDeclarationKeyword 匹配第一个字符,消耗它,并防止 菜单声明 从匹配。

    我可以通过声明 一切 在语法定义中作为 :syn-match :syn-region 最后定义上述区域,但这可能是性能问题,更重要的是,很难管理。

    DR: 是否有任何方法可以匹配文档开头的区域, 允许关键字在同一位置匹配?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Ingo Karkat    6 年前

    要保留关键字,必须使它们 contained .否则,vim的语法规则总是给予它们优先权,并且它们不允许您的区域匹配。如果我从上一个问题中正确地记得,整个文档将被解析为不同区域的序列;那将是非常好的。否则,您必须为文档中尚未覆盖但也可能包含关键字的部分创建新的区域或匹配项。

    syn keyword menhirDeclarationKeyword contained %parameter %token
    syn region menhirDeclarations start=/\%^%token\>/rs=e-1 end=/%%/me=s-1 contains=menhirDeclarationKeyword
    

    如果这不可行,你就必须使用 :syntax match 而是:

    syn match menhirDeclarationKeyword "\<%token\>"
    

    不要以为这会变慢;通过 :help :syntime ,在各种复杂的输入文件上。

    “难以管理”部分可以通过vimscript元编程解决。例如,可以将所有关键字保留在列表中,并使用循环动态构建定义:

    for s:keyword in ['parameter', 'token']
        execute printf('syntax match menhirDeclarationKeyword "\<%%%s\>"', s:keyword)
    endfor