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

时间:2009-07-31 09:34:54

标签: vim vim-syntax-highlighting

在VIM中,我需要执行一个简单的任务 - 突出显示“(”和“)”。我可以通过发出两个命令轻松地做到这一点:

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

但是如果我添加相同的命令(当然没有':')来清空.vimrc并重新启动VIM - “(”和“)”在.cpp文件中不再突出显示。看来,如果我创建/加载.cpp文件,VIM会加载语法文件,覆盖我的自定义高亮显示。如何在我的.vimrc文件中配置高亮显示,以便在标准语法定义之后进行,或者不受标准语法定义的影响?

4 个答案:

答案 0 :(得分:24)

有四种选择(其中两种已被其他人建议):

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

    :help after-directory
    
  2. 对当前窗口使用匹配:

    :match really_unique_name "[()]"
    
  3. 再次对当前窗口使用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)
    
  4. 安装Dr Chip的rainbow.vim插件,根据缩进级别以不同的颜色突出显示大括号。

  5. 对于这种情况,我建议选项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
    

    您可能也对我对this question的回答感兴趣,其中涵盖了更为一般的运营商突出显示。

答案 1 :(得分:9)

将设置放在〜/ .vim / after / syntax / cpp.vim

答案 2 :(得分:4)

不使用syn匹配,只需使用匹配。例如:

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

match具有比syn-match更高的优先级(即:它的突出显示将覆盖由syn-match生成的突出显示),并且(表现良好的)语法文件不应该与它混淆。

匹配的一个警告是它是每个窗口,而不是每个缓冲区。

如果您需要其他匹配项,则可以使用2match和3match。

有关详细信息,请参阅Vim中的:help :match

答案 3 :(得分:2)

我通常这样做:

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

au代表autocmd。帮助会说明更多信息。