如何在 Vim 中正确扩展高亮组?

Sum*_*mit 4 vim color-scheme highlight

我想创建一个名称Italic完全相同 Normal但文本为斜体的组。我的Normal组设置为

Normal   ctermfg=251 ctermbg=234 guifg=#cccccc guibg=#242424
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  1. 正确的做法是term=italic 按如下方式添加到设置中吗?

    hi Italic term=italic ctermfg=251 ctermbg=234 guifg=#cccccc guibg=#242424
    
    Run Code Online (Sandbox Code Playgroud)
  2. 我想以一种通用的方式来做,即定义Italic这样的设置适用于所有颜色方案(以上仅适用于我当前的颜色方案)。有办法实现吗?就像是

    hi Italic extends Normal term=italic 
    
    Run Code Online (Sandbox Code Playgroud)

ib.*_*ib. 5

要解决此问题,您可以通过脚本创建突出显示组。下面的函数采用三个字符串参数:要高亮显示的组的名称、要创建的组的名称以及包含其他高亮属性(或要覆盖的属性)的字符串。

function! ExtendHighlight(base, group, add)
    redir => basehi
    sil! exe 'highlight' a:base
    redir END
    let grphi = split(basehi, '\n')[0]
    let grphi = substitute(grphi, '^'.a:base.'\s\+xxx', '', '')
    sil exe 'highlight' a:group grphi a:add
endfunction
Run Code Online (Sandbox Code Playgroud)

因此,调用

:call ExtendHighlight('Normal', 'Italic', 'term=italic')
Run Code Online (Sandbox Code Playgroud)

创建一个名为的新组ItalicNormal通过term=italic属性字符串扩展突出显示 。

请注意,自定义突出显示组在配色方案切换时保持不变。要纠正此行为,您可以在当前配色方案更改时更新组。

:autocmd ColorScheme * call ExtendHighlight('Normal', 'Italic', 'term=italic')
Run Code Online (Sandbox Code Playgroud)