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

gri*_*yvp 12 vim vim-syntax-highlighting

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

:syn match really_unique_name display "[()]"
:hi really_unique_name guifg=#FF0000
Run Code Online (Sandbox Code Playgroud)

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

DrA*_*rAl 24

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

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

    :help after-directory
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用匹配当前窗口:

    :match really_unique_name "[()]"
    
    Run Code Online (Sandbox Code Playgroud)
  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)
    
    Run Code Online (Sandbox Code Playgroud)
  4. 安装Dr Chip的rainbow.vim插件,根据缩进级别获得不同颜色的支撑突出显示.

对于这种情况,我建议选项1,因为它看起来像你想要使它成为一般语法的一部分.如果你想使用匹配并且你希望它们是缓冲区特定的(而不是特定于窗口的),你需要这样的东西:

function! CreateBracketMatcher()
    call clearmatches()
    call matchadd('really_unique_name', "[()]")
endfunc
au BufEnter <buffer> call CreateBracketMatcher()
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅:

:help after-directory
:help :match
:help matchadd()
:help matchdelete()
:help clearmatches()
:help function!
:help autocmd
:help autocmd-buffer-local
:help BufEnter
Run Code Online (Sandbox Code Playgroud)

您可能也对我对这个问题的回答感兴趣,这个问题涵盖了更多的一般操作员突出显示.


ram*_*ion 9

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


Lau*_*ves 5

而不是使用同步匹配,只需使用匹配。例如:

hi really_unique_name guifg=#FF0000
match really_unique_name "[()]"
Run Code Online (Sandbox Code Playgroud)

match 具有比同步匹配更高的优先级(即:它的突出显示将覆盖同步匹配生成的突出显示),并且(行为良好的)语法文件不应与它混淆。

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

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

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