【问题标题】:Override colorscheme覆盖配色方案
【发布时间】:2011-01-27 06:19:28
【问题描述】:

我经常发现自己只想更改颜色方案中的一些小东西,但我不想编辑原始文件。我尝试将更改放入 '~/.vim/after/colors/blah.vim',但这对我不起作用。


例如,我想更改 BusyBee.vim 中的 CursorLine 高亮显示..

~/.vim/colors/BusyBee.vim

我创建文件 '~/.vim/after/colors/BusyBee.vim' 并添加:

hi CursorLine    guibg=#000000 ctermbg=Black cterm=none

但是,我没有看到变化。当然,如果我更改原始 BusyBee.vim 中的行,它会起作用,但就像我说的那样,我不想这样做。

正在做...

:colo Busy<TAB>

给我看……

BusyBee  BusyBee

【问题讨论】:

  • 为什么不直接复制主题并编辑副本?
  • 更新时工作量减少。这个想法是让我的更改覆盖主题,这样我就可以更新主题而无需合并我的更改。

标签: vim colors color-scheme


【解决方案1】:

引用 Vim 8.2 对后代的帮助,因为这是我第一次搜索此场景:

To customize a color scheme use another name, e.g. ~/.vim/colors/mine.vim",
and use :runtime to load original color scheme:
    colors/evening.vim
    Statement ctermfg=Blue guifg=Blue

【讨论】:

    【解决方案2】:

    $VIM/vimXX/syntax/synload.vim 中的股票synload.vim 文件做了一个

    runtime! syntax/syncolor.vim
    

    这指示 vim 读取runtimepath 的每个目录中的给定文件规范。在 RedHat 系统上,运行时路径类似于:

    $HOIME/.vim,/usr/share/vim/vimfiles,/usr/share/vim/vim72,/usr/share/vim/vimfiles/after,$HOME/.vim/after
    

    将您的颜色调整放在$HOME/.vim/after/syntax/syncolor.vim/usr/share/vim/vimfiles/after/syntax 中,您应该可以开始了。

    虽然您的调整可以是简单的hi ... 指令,但它显然更复杂。所以我从股票syncolor.vim 文件中大量借用,现在有:

    if !exists("syntax_cmd") || syntax_cmd == "on"
      " ":syntax on" works like in Vim 5.7: set colors but keep links
      command -nargs=* SynColor hi <args>
      command -nargs=* SynLink hi link <args>
    else
      if syntax_cmd == "enable"
        " ":syntax enable" keeps any existing colors
        command -nargs=* SynColor hi def <args>
        command -nargs=* SynLink hi def link <args>
      elseif syntax_cmd == "reset"
        " ":syntax reset" resets all colors to the default
        command -nargs=* SynColor hi <args>
        command -nargs=* SynLink hi! link <args>
      else
        " User defined syncolor file has already set the colors.
        finish
      endif
    endif
    
    " Change comment color from bright cyan to gray
    " The bold cyan conflicts with variables and other colors
    if &background == "dark"
      SynColor Comment      term=bold cterm=NONE ctermfg=Gray ctermbg=NONE gui=NONE guifg=#80a0ff guibg=NONE
    endif
    
    delcommand SynColor
    delcommand SynLink
    

    【讨论】:

    • 在/syntax/syncolor.vim 之后添加对我有用。
    • @JeffSchwab 呃,这是确认我的答案有用吗?
    • 赞成票是确认。评论是说哪一部分对我特别有用。
    【解决方案3】:

    你问我今天要找什么。我找到了一个比这里介绍的更简单的解决方案。我想要透明背景而不是主题中的黑色背景,而只是在.vimrc 中的colorscheme 语句之后覆盖颜色不起作用并且为此安装插件很奇怪。这是我所做的:

    autocmd ColorScheme * highlight Normal ctermbg=None
    autocmd ColorScheme * highlight NonText ctermbg=None
    

    为什么有效?我猜 vim 除了阅读您的 colorscheme 语句并加载该语句然后阅读您的 highlight 语句并更改颜色之外还做了一些事情。无论如何,vim 似乎只在读取配置文件后才更改配色方案。所以我提供了一个钩子,每次更改配色方案时都会更改颜色。一个很好的副作用是,即使您切换配色方案也可以使用(如果您愿意,可以使用 if 块)。

    【讨论】:

    • 您好,我正在使用 jellybeans 主题,想要一个纯黑色的背景,但实际上它是灰色的。我已将您建议的行添加到 .vimrc,但没有任何反应……我该怎么办?
    • 你有透明终端吗?黑色背景是透明的,所以如果你的终端是透明的,你就不会得到真正的黑色。在 Vim 会话期间尝试 :highlight Normal ctermbg=blue 看看它是否将您的背景设置为蓝色。如果是这样,我认为您将不得不更改终端设置。或者也许有一些我不知道的东西。
    • 我试过了,只有第一行和最后一行设置为蓝色,而不是整个窗口。
    • 我不知道autocmd Colorscheme 是可能的。只是我的 2 美分,对我来说,背景透明度使用 guibg 而不是 ctermbg,可能对将来像我这样的菜鸟有所帮助。
    【解决方案4】:

    看看AfterColors.vim,它会让你使用~/.vim/after/colors/BusyBee.vim方法。

    【讨论】:

    • 参加这个派对已经很晚了,但作为参考,AfterColors.vim 现在(由我)在 Github github.com/tsiemens/vim-aftercolors 上进行了镜像,因此人们可以将其添加到他们的插件列表中。我昨天才发现这个线程,并创建了那个 repo。我想我应该记下它。
    【解决方案5】:

    我的 .vimrc 中没有“colorscheme BusyBee”。我喜欢不时切换配色方案,所以我想“修复”实际的主题。

    我想出了这个解决方案,不是最漂亮的,但无论如何。

    function! FixColorscheme() " {{{
        echo "fixing colorscheme"
        if has("gui_running")
            if (g:colors_name =~ "busybee")
                hi Folded        guibg=#001336 guifg=#003DAD gui=none
                hi CursorLine    guibg=#000000 ctermbg=Black cterm=none
    
            elseif (g:colors_name =~ "256-jungle")
                hi CursorLine    guibg=#000000 ctermbg=Black cterm=none
    
            elseif (g:colors_name =~ "xoria256")
                hi Folded        guibg=#001336 guifg=#003DAD gui=none cterm=none
                "hi Folded         ctermbg=234  ctermfg=25    cterm=none
            endif
        elseif &t_Co == 256
            if (g:colors_name =~ "busybee")
                hi Folded        guibg=#001336 guifg=#003DAD gui=none
                hi CursorLine    guibg=#000000 ctermbg=Black cterm=none
    
            elseif (g:colors_name =~ "256-jungle")
                hi CursorLine    guibg=#000000 ctermbg=Black cterm=none
    
            elseif (g:colors_name =~ "xoria256")
                hi Folded         ctermbg=234  ctermfg=25    cterm=none
                hi CursorLine    cterm=none
            "else
                "hi CursorLine     ctermbg=0                  cterm=none
            endif
        endif
        endfunction
    " }}}
    

    更改配色方案时自动运行。

    augroup mycolorschemes
        au!
        au ColorScheme * call FixColorscheme()
    augroup END
    

    这有助于在启动时加载您最喜欢的一周方案。 (哎呀!!默认!)

    if iSFirstRun == 1
        echo "HI"
        colo xoria256
        call FixColors()
    endif
    

    .. 这个在 .vimrc 的最顶端

    "" To let us set some settings only once. {{{
        if exists("isRunning")
            let isFirstRun = 0
        else
            let isFirstRun = 1
        endif
        let isRunning = 1
    " }}}
    

    也许这个“isFirstRun”已经有了一些东西?

    【讨论】:

    • 是的,对于您定期使用的配色方案来说,这看起来要简单得多:) ...顺便说一句,如果您不想更改原始文件(为什么?),为什么不只是制作它的第 2 版并在那里进行更改。我真的不明白为什么需要无中生有地解决所有这些问题。
    • 与在更改方案时“手动”调整方案或在更新方案时带来我对方案的更改(我必须手动执行)相比,这样做没有任何工作如果我覆盖它或将其命名为其他名称)。我很高兴你不像我那样对你的设置挑剔.. ; )
    • 哇,很棒的解决方案! +1 :) 我最终使用了这个答案的“切片”版本。它基于这个,所以我不想为它发布新的答案。你可以在我的.vimrc中查看:github.com/oryband/dotvim/blob/master/vimrc
    【解决方案6】:

    hi CursorLine    guibg=#000000 ctermbg=Black cterm=none
    

    在你之后

    colorscheme BusyBee
    

    你的 _vimrc 中的条目。

    【讨论】:

    • @jdhao - 您正在评论近十年前的答案。从那以后发生了很多变化......
    猜你喜欢
    • 1970-01-01
    • 2022-08-16
    • 2014-03-01
    • 1970-01-01
    • 2019-10-11
    • 1970-01-01
    • 2016-01-12
    • 2010-12-28
    • 2012-02-12
    相关资源
    最近更新 更多