12

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

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

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

4

4 回答 4

24

有四个选项(其中两个已由其他人建议):

  1. 使用aftervimfiles (~/.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插件以根据缩进级别以不同颜色突出显示大括号。

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

您可能还对我对这个问题的回答感兴趣,它涵盖了更一般的运算符突出显示。

于 2009-07-31T12:26:29.463 回答
9

将设置放入 ~/.vim/after/syntax/cpp.vim

于 2009-07-31T11:26:01.160 回答
6

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

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

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

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

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

更多信息请参见:help :matchVim。

于 2009-07-31T09:38:50.313 回答
2

我通常这样做:

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

au代表autocmd。帮助会告诉更多。

于 2012-12-10T10:50:28.577 回答