如何在vim中覆盖默认的语法高亮?

13

VIM中,我需要执行一个简单的任务 - 高亮显示“(”和“)”。我可以通过发出两个命令轻松完成这个任务:

:syn match really_unique_name display "[()]"
:hi really_unique_name guifg=#FF0000

但是,如果我将相同的命令(当然不带 ':')添加到空的.vimrc文件中并重新启动VIM,在.cpp文件中“(”和“)”就不再被突出显示了。似乎如果我创建/加载.cpp文件,VIM会为其加载语法文件,覆盖我的自定义高亮。如何在我的.vimrc文件中配置高亮,使其在标准语法定义之后生效或不受标准语法定义的影响?

5个回答

25

有四个选项(其中两个已由他人提出):

  1. 在vimfiles(~/.vim/after/syntax/cpp.vim)中使用after结构:

:help after-directory
  • 使用 match 对当前窗口进行匹配:

  • :match really_unique_name "[()]"
    
    使用matchadd()函数,可以为当前窗口添加高亮匹配项。如果需要,可以单独删除某个匹配项:
  • 使用matchadd()函数,可以为当前窗口添加高亮匹配项。如果需要,可以单独删除某个匹配项:

  • :call matchadd('really_unique_name', "[()]")
    " Or
    :let MyMatchID = matchadd('really_unique_name', "[()]")
    " and then if you want to switch it off
    :call matchdelete(MyMatchID)
    
  • 安装Dr Chip's的rainbow.vim插件,以便根据缩进级别将大括号高亮显示为不同颜色。

  • 针对这种情况,我建议使用选项1,因为你想让它成为通用语法的一部分。如果你想使用匹配并且希望它们是特定于缓冲区的(而不是窗口特定),则需要类似以下内容的东西:

  • function! CreateBracketMatcher()
        call clearmatches()
        call matchadd('really_unique_name', "[()]")
    endfunc
    au BufEnter <buffer> call CreateBracketMatcher()
    

    更多信息,请参见:

    :help after-directory
    :help :match
    :help matchadd()
    :help matchdelete()
    :help clearmatches()
    :help function!
    :help autocmd
    :help autocmd-buffer-local
    :help BufEnter
    

    您也许会对我对这个问题的回答感兴趣,该回答涵盖了更通用的操作符高亮显示。


    感谢“au BufEnter”,在Windows和MacOS上都完美运行(hi在macOS上不起作用 - 在处理.vimrc后会被清除)。 - grigoryvp
    缓冲区本地的自动命令应该在缓冲区被打开之后才能创建。我所列出的建议都不应该在.vimrc中使用:可以使用vimfiles/after/syntax/cpp.vim或类似选项之一。 或者,您可以使用“au BufEnter,BufNew,BufReadPost *.cpp call CreateBracketMatcher()”来糊弄它,但这有点掩饰。 - DrAl
    @DrAl,我基于您的答案刚刚编写了一个http://vimrcfu.com代码片段:http://vimrcfu.com/snippet/197 谢谢! - Ory Band
    1
    那个 rainbow.vim 链接已经失效了。这似乎是更新版本:https://github.com/kien/rainbow_parentheses.vim - Andy Lester

    9
    把设置放在~/.vim/after/syntax/cpp.vim中。

    嗯,看起来是个不错的解决方案。但对我不起作用... - sixtyfootersdude

    6

    不要使用syn match,直接使用match。例如:

    hi really_unique_name guifg=#FF0000
    match really_unique_name "[()]"
    

    match 的优先级高于 syn-match(即它的高亮会覆盖 syn-match 生成的高亮),而且(表现良好的)语法文件不应该对其进行干扰。

    使用 match 的一个注意事项是,它是针对窗口而不是缓冲区的。

    如果您需要额外的匹配,可以使用 2match 和 3match。

    有关更多信息,请参见 Vim 中的 :help :match


    谢谢。在我的Windows电脑上它运行得很好。但是在MacOS电脑上,“hi really_unique_name guifg=#FF0000”无法正常工作。即使它是.vimrc文件中的唯一一行,在启动vim并执行“hi really_unique_name”后,我看到“really_unique_name xxx cleared”。为什么会被“清除”? - grigoryvp

    3

    我通常是这样做的:

    :hi really_unique_name guifg=#FF0000
    :au BufNewFile,BufRead * :syn match really_unique_name display "[()]"
    

    au 代表着 autocmd。更多信息请查看帮助。


    1

    对于想要覆盖 hi def link 声明的人,请使用 hi! def link


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