Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何覆盖vim中的默认语法突出显示?_Vim_Vim Syntax Highlighting - Fatal编程技术网

如何覆盖vim中的默认语法突出显示?

如何覆盖vim中的默认语法突出显示?,vim,vim-syntax-highlighting,Vim,Vim Syntax Highlighting,在VIM中,我需要执行一个简单的任务—突出显示“(“and”)”。我可以通过发出两个命令轻松做到这一点: :syn match really_unique_name display "[()]" :hi really_unique_name guifg=#FF0000 但是,如果我向empty.vimrc和restart-VIM添加相同的命令(当然没有“:”),则“(“and”)”在.cpp文件中不再突出显示。看起来,若我创建/load.cpp文件,VIM会为它加载语法文件,覆盖我的自定义高亮

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

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

但是,如果我向empty.vimrc和restart-VIM添加相同的命令(当然没有“:”),则“(“and”)”在.cpp文件中不再突出显示。看起来,若我创建/load.cpp文件,VIM会为它加载语法文件,覆盖我的自定义高亮显示。如何在.vimrc文件中配置突出显示,使其在标准语法定义之后发生,或不受标准语法定义的影响?

使用匹配,而不是使用syn match。例如:

hi really_unique_name guifg=#FF0000
match really_unique_name "[()]"
match
的优先级高于syn-match(即:其高亮显示将覆盖syn-match生成的高亮显示),并且(行为良好的)语法文件不应与之混淆

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

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


有关更多信息,请参见Vim中的帮助:匹配。

将设置置于~/.Vim/after/syntax/cpp.Vim

有四个选项(其中两个是其他人建议的):

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

  • 对当前窗口使用匹配:

    :match really_unique_name "[()]"
    
  • 再次对当前窗口使用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的插件,根据缩进级别以不同颜色突出显示支架

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

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

    您可能还对我的答案感兴趣,其中包括更一般的运算符高亮显示。

    我通常这样做:

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

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

    谢谢。它在我的windows设备上正常工作。但在MacOS机上,“hi really_unique_name guifg=#FF0000”不起作用。即使它是.vimrc中的唯一一行,在启动vim并执行“hi really_unique_name”之后,我看到“really_unique_name xxx clear”。为什么它被“清除”?感谢“au BufEnter”,它在Windows和Macos盒上都能很好地工作(嗨,Macos盒不起作用-它是在处理了vimrc之后以某种方式被清除的)。只有在缓冲区打开后才应该创建缓冲区本地AutoCMD。我列出的建议都不应该在.vimrc中:使用vimfiles/after/syntax/cpp.vim或类似选项之一。或者,你可以用“au BufEnter,BufNew,BufReadPost*.cpp call CreateBracketMatcher()”来敷衍它,但这有点敷衍。@DrAl我刚刚根据你的回答写了一段话:谢谢!那个rainbow.vim导致了一个死链接。这似乎是一个更新版本:嗯,似乎是一个很好的解决方案。但对我来说不起作用。。。
    :help after-directory
    :help :match
    :help matchadd()
    :help matchdelete()
    :help clearmatches()
    :help function!
    :help autocmd
    :help autocmd-buffer-local
    :help BufEnter
    
    :hi really_unique_name guifg=#FF0000
    :au BufNewFile,BufRead * :syn match really_unique_name display "[()]"