在vim中如何将项目设置为更高的突出显示优先级

9
我希望非ASCII字符能像这里讨论的那样显示,但当非ASCII字符在注释中时,语法高亮会消失。我研究了一下这个问题,在vim-manual中发现了一个早期开始的条目具有更高优先级(第三项)。来自help :syn-priority的信息如下:

当多个语法项可能匹配时,使用以下规则:

  1. 当多个Match或Region项从同一位置开始时,最后定义的项具有优先权。

  2. 关键词优先于Match和Region项。

  3. 在较早的位置开始的项优先于以后开始的项。

我目前正在使用以下内容:

syntax match nonascii "[^\x00-\x7F]" 
highlight nonascii cterm=underline ctermfg=red ctermbg=none term=underline

我尝试使用选项nextgroup来赋予非ASCII匹配项更高的优先级:

syntax match nonascii "[^\x00-\x7F]" nextgroup=Comment

包含 contains 选项:

syntax match nonascii "[^\x00-\x7F]" contains=ALL

但它没有起作用。我还尝试了暂时禁用评论(highlight clear Comment),但没有达到预期的效果(我的评论没有高亮显示,但非 ASCII 字符没有高亮显示)。我错过了什么?

2个回答

9
是的,你的自定义语法组没有匹配成功,因为已经有了对注释(或其他来自现有语法脚本的语法元素)的匹配。
解决方法是告诉Vim,你的nonascii组被包含在那些组中,这样Vim会尝试在那里匹配(而不仅仅是在未着色的顶层匹配)。使事情变得复杂的是,注释的语法组取决于语法脚本,因此也取决于文件类型(但命名相当规则)。在下面的示例中,我使用了C和Vimscript文件的名称:
:syntax match nonascii "[^\x00-\x7F]" containedin=cComment,vimLineComment

3

有人已经回答了这个问题。但是,对于仍然遇到问题的其他人,这里提供另一种解决方法来突出显示注释中的非ASCII字符(或任何组)。这不是最好的方法,但它是一个暂时修复。

可以尝试以下方法:

:syntax match nonascii "[^\u0000-\u007F]" containedin=ALL contained |
            \ highlight nonascii ctermfg=yellow guifg=yellow

这个实现与其他解决方案非常接近。你甚至可以移除contained,但是根据文档,可能会存在递归问题(就我所知)。要查看其他定义的模式,syn-contains部分将包含它。

:help syn-containedin
:help syn-contains 

containedin=ALLBUT,nonascii 可能避免递归。 - Zoe stands with Ukraine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接