如何仅突出显示vim中的关键字?

时间:2015-12-22 17:40:20

标签: vim color-scheme

我只想突出显示关键字并将其他所有内容都保留为黑色。

这样的事情显然会以我想要的方式突出显示关键字,但不会禁用其他所有内容:

hi keyword ctermfg=DarkBlue

到目前为止,我只是通过手动列出所有密钥来实现这一目标:

sy off
sy reset
sy keyword myKeyword if for while
hi link myKeyword Keyword
hi keyword ctermfg=DarkBlue

但我想重新使用所有预定义的键。这可能吗?

1 个答案:

答案 0 :(得分:1)

据我所知,没有办法轻易做到;也许我错过了一些东西,但似乎vim缺乏获得关于高亮配置的完整信息(带功能)的可能性。

为了得到你想要的东西,一个想法是解析:syn list命令的输出,以获得用于特定高亮组的关键字列表; 但是以完美的方式解析它是不可能的,因为输出中的特殊含义只能通过颜色而不是可解析的模式来区分。

一些可能的解决方法:

  • 要设置一个列表,其中包含您不想要的每个突出显示组的名称,然后根据需要丢弃它们,可能取决于当前的文件类型;例如:

    let s:discard_hi_filetypes = {
    \   'vim' : [ 'Comment', 'Identifier', 'Constant', 'PreProc', 'Special', 'Type', 'vimOper' ],
    \   'cpp' : [ 'cComment', 'cInclude', 'cIncluded', 'cppSTLtype', 'cCppString', 'cTodo', 'cDefine', 'cNumber', 'cType' ],
    \ }
    
    function! KWHighlight()
        " Applies to all buffers; run ':syn on' to reset
        if !has_key(s:discard_hi_filetypes, &ft) | return | endif
        for g in s:discard_hi_filetypes[&ft]
            exe "hi clear " . g
            exe "hi link " . g . " NONE"
        endfor
    endf
    

    以下内容可以帮助您快速找到突出显示组的名称:

    command! ShowHL augroup ShowHL | exe "au! ShowHL" | au CursorMoved * echo synIDattr(synID(line('.'), col('.'), 1), 'name') | augroup END
    command! HideHL au! ShowHL
    
  • 以下代码可让您快速(但)手动丢弃高亮组,即光标下的当前组:

    command! HLDisable exe "hi clear " . synIDattr(synIDtrans(synID(line('.'), col('.'), 1)), 'name')
    noremap __ :HLDisable<cr>
    

    键入__几次,在不同的不需要的突出显示的单词上,让你得到所需的结果,但它根本不是自动的。