如何修改vim中现有的突出显示组?

如何修改vim中现有的突出显示组?,vim,syntax-highlighting,Vim,Syntax Highlighting,例如,如果我通过链接在vim中有一个现有的突出显示组 hi link my_highlight_group my_default_color 是否可以在不更改我的默认颜色的情况下将“粗体”添加到我的\u突出显示\u组?以下操作不起作用: hi my_highlight_group gui=bold 令人惊讶的是,如果直接定义了我的_highlight组(而不是通过链接),我可以添加粗体: 假设您只希望一种语法类型使用此选项,则只需创建一个新的组名my_bold_default_color,并

例如,如果我通过链接在vim中有一个现有的突出显示组

hi link my_highlight_group my_default_color
是否可以在不更改我的默认颜色的情况下将“粗体”添加到我的\u突出显示\u组?以下操作不起作用:

hi my_highlight_group gui=bold
令人惊讶的是,如果直接定义了我的_highlight组(而不是通过链接),我可以添加粗体:


假设您只希望一种语法类型使用此选项,则只需创建一个新的组名my_bold_default_color,并将bold属性应用于该组

更改链接到另一个组的组的属性将断开链接。恐怕没有简单的方法可以将颜色从
my\u default\u color
复制到
my\u highlight\u组中。您只需手动复制颜色值即可

不过这应该不是什么大问题,您应该在colorscheme文件中定义所有突出显示组,所以只需将这两个组放在一起:

hi my_default_color   guifg=#000088
hi my_highlight_group guifg=#000088 gui=bold
正如“太多php”所说的,没有直接的方法可以说“创建一个看起来像那个样的值并添加粗体”。最好的办法是修改你的配色方案。如果您没有使用自定义配色方案,请将一个配色方案从vim主安装目录复制到~/.vim/colors目录,并根据您的需要进行编辑。或者,在vim脚本页面上搜索并尝试许多可用的脚本

无耻的插件:如果你想要一个比标准格式更容易编辑的插件,试试我的

如果您真的希望能够动态添加粗体,则需要一个相当复杂的脚本,如下所示。请注意,除非您在加载配色方案后自动调用它,或执行以下操作,否则不会将其保存到下一个会话:

:autocmd ColorScheme AddBoldToGroup my_highlight_group
下面是剧本的全部内容。就我所知,没有比这更快的方法了!显然,您可以通过编写更少的冗长代码来节省几行代码,但是重复使用
redir
silent hi
是唯一的方法

" Call this with something like
"
" :AddBoldToGroup perlRepeat
"
command! -complete=highlight -nargs=1 AddBoldToGroup call AddBoldToGroup(<f-args>)
function! AddBoldToGroup(group)
    " Redirect the output of the "hi" command into a variable
    " and find the highlighting
    redir => GroupDetails
    exe "silent hi " . a:group
    redir END

    " Resolve linked groups to find the root highlighting scheme
    while GroupDetails =~ "links to"
        let index = stridx(GroupDetails, "links to") + len("links to")
        let LinkedGroup =  strpart(GroupDetails, index + 1)
        redir => GroupDetails
        exe "silent hi " . LinkedGroup
        redir END
    endwhile

    " Extract the highlighting details (the bit after "xxx")
    let MatchGroups = matchlist(GroupDetails, '\<xxx\>\s\+\(.*\)')
    let ExistingHighlight = MatchGroups[1]

    " Check whether there's an existing gui= block
    let MatchGroups = matchlist(ExistingHighlight, '^\(.\{-}\) gui=\([^ ]\+\)\( .\{-}\)\?$')
    if MatchGroups != []
        " If there is, check whether "bold" is already in it
        let StartHighlight = MatchGroups[1]
        let GuiHighlight = MatchGroups[2]
        let EndHighlight = MatchGroups[3]
        if GuiHighlight =~ '.*bold.*'
            " Already done
            return
        endif
        " Add "bold" to the gui block
        let GuiHighlight .= ',bold'
        let NewHighlight = StartHighlight . GuiHighlight . EndHighlight
    else
        " If there's no GUI block, just add one with bold in it
        let NewHighlight = ExistingHighlight . " gui=bold"
    endif

    " Create the highlighting group
    exe "hi " . a:group . " " NewHighlight
endfunction
“用类似的方式调用此
"
“:AddBoldToGroup perlRepeat
"
命令-complete=highlight-nargs=1 AddBoldToGroup调用AddBoldToGroup()
功能!AddBoldToGroup(组)
将“hi”命令的输出重定向到变量中
“并找到突出显示
redir=>GroupDetails
exe“无声嗨”。a:小组
重拨端
“解析链接组以查找根突出显示方案
而GroupDetails=~“链接到”
let index=stridx(组详细信息,“链接到”)+len(“链接到”)
让LinkedGroup=strpart(GroupDetails,索引+1)
redir=>GroupDetails
exe“静默hi”。LinkedGroup
重拨端
循环结束
提取突出显示的详细信息(“xxx”后的位)
让MatchGroups=matchlist(GroupDetails,\\s\+\(.*\))
让ExistingHighlight=匹配组[1]
“检查是否存在现有的gui=块
让MatchGroups=matchlist(现有高亮显示“^\(.\{-}\)gui=\([^]\+\)\(.\{-}\)\?$)
如果匹配组!=[]
如果有,请检查其中是否已包含“粗体”
设StartHighlight=MatchGroups[1]
让GuiHighlight=MatchGroups[2]
让EndHighlight=MatchGroups[3]
如果GuiHighlight=~'.*bold.*'
“已经做了
返回
恩迪夫
将“粗体”添加到gui块
让我们突出显示。=',粗体'
让NewHighlight=StartHighlight。GuiHighlight。尾声
其他的
“如果没有GUI块,只需添加一个带有粗体的块即可
让NewHighlight=ExistingHighlight。“gui=bold”
恩迪夫
“创建突出显示组
“你好”。a:小组。“新亮点
端功能

无耻的插件:如果您不想将整个配色方案复制到.vim文件夹中,可以将小的自定义设置放入.vim/after/colors中。太棒了,如果可以的话,我会给你+4。@太多的php:这个插件看起来不错,谢谢你的链接(太棒了!)在这行前面加上这段代码:“提取突出显示的细节(在“xxx”后面的那一位”)(由于某些alt-left原因,纳粹忽略了我的编辑,它们是错误的。您需要此代码,否则如果启用verbose,正则表达式将无法按预期工作):“修剪verbose模式高亮显示输出,请参阅:帮助高亮显示verbose if&verbose let GroupDetails=substitute(GroupDetails,“\s\+\Last set from.*”,“'g')endif
" Call this with something like
"
" :AddBoldToGroup perlRepeat
"
command! -complete=highlight -nargs=1 AddBoldToGroup call AddBoldToGroup(<f-args>)
function! AddBoldToGroup(group)
    " Redirect the output of the "hi" command into a variable
    " and find the highlighting
    redir => GroupDetails
    exe "silent hi " . a:group
    redir END

    " Resolve linked groups to find the root highlighting scheme
    while GroupDetails =~ "links to"
        let index = stridx(GroupDetails, "links to") + len("links to")
        let LinkedGroup =  strpart(GroupDetails, index + 1)
        redir => GroupDetails
        exe "silent hi " . LinkedGroup
        redir END
    endwhile

    " Extract the highlighting details (the bit after "xxx")
    let MatchGroups = matchlist(GroupDetails, '\<xxx\>\s\+\(.*\)')
    let ExistingHighlight = MatchGroups[1]

    " Check whether there's an existing gui= block
    let MatchGroups = matchlist(ExistingHighlight, '^\(.\{-}\) gui=\([^ ]\+\)\( .\{-}\)\?$')
    if MatchGroups != []
        " If there is, check whether "bold" is already in it
        let StartHighlight = MatchGroups[1]
        let GuiHighlight = MatchGroups[2]
        let EndHighlight = MatchGroups[3]
        if GuiHighlight =~ '.*bold.*'
            " Already done
            return
        endif
        " Add "bold" to the gui block
        let GuiHighlight .= ',bold'
        let NewHighlight = StartHighlight . GuiHighlight . EndHighlight
    else
        " If there's no GUI block, just add one with bold in it
        let NewHighlight = ExistingHighlight . " gui=bold"
    endif

    " Create the highlighting group
    exe "hi " . a:group . " " NewHighlight
endfunction