【问题标题】:set vim background transparent设置vim背景透明
【发布时间】:2016-10-09 07:48:51
【问题描述】:

我正在为我的终端 vim 使用 Matrix 颜色方案和 CSApprox。

我似乎无法将背景设置为透明。我曾尝试编辑 matrix.vim 文件,但并没有让它变得更好。

这里是matrix.vim

" vim:set ts=8 sts=2 sw=2 tw=0:
"
" matrix.vim - MATRIX like colorscheme.
"
" Maintainer: MURAOKA Taro <koron@tka.att.ne.jp>
" Last Change:  10-Jun-2003.

set background=dark
hi clear
if exists("syntax_on")
syntax reset
endif

let g:colors_name = 'matrix'

hi Comment guifg=#226622
hi Constant guifg=#55ff55
hi Special guifg=#44cc44
hi Identifier guifg=#55ff55
hi Statement guifg=#55ff55 gui=bold
hi PreProc guifg=#339933
hi Type guifg=#55ff55 gui=bold
hi Underlined guifg=#55ff55 gui=underline
hi Error guifg=#55ff55
hi Todo guifg=#113311 gui=none
hi Cursor guifg=#226622
hi lCursor guifg=#226622
hi CursorIM guifg=#226622
hi Directory guifg=#55ff55
hi DiffAdd guifg=#55ff55 gui=none
hi DiffChange guifg=#55ff55 gui=none
hi DiffDelete guifg=#113311 gui=none
hi DiffText guifg=#55ff55 gui=bold
hi ErrorMsg guifg=#55ff55
hi VertSplit guifg=#339933
hi Folded guifg=#44cc44
hi FoldColumn guifg=#44cc44
hi IncSearch guifg=#226622 gui=none
hi LineNr guifg=#44cc44 gui=none
hi ModeMsg guifg=#44cc44
hi MoreMsg guifg=#44cc44
hi NonText guifg=#44cc44 guibg=NONE ctermbg=none
hi Normal guifg=#44cc44 guibg=NONE ctermbg=none
hi Question guifg=#44cc44
hi Search guifg=#113311 gui=none
hi SpecialKey guifg=#44cc44
hi StatusLine guifg=#55ff55 gui=none
hi StatusLineNC guifg=#113311 gui=none
hi Title guifg=#55ff55 gui=bold
hi Visual guifg=#55ff55 gui=none
hi VisualNOS guifg=#44cc44
hi WarningMsg guifg=#55ff55
hi WildMenu guifg=#226622

还有我的.vimrc 文件

set nocompatible
filetype off

set rtp+=~/.vim/bundle/Vundle.vim/
call vundle#begin()

Plugin 'gmarik/Vundle.vim'
Plugin 'fatih/vim-go'
Plugin 'vim-airline/vim-airline'
" Plugin 'vim-airline/vim-airline-themes'
Plugin 'airblade/vim-gitgutter'
" Plugin 'altercation/vim-colors-solarized'
Bundle 'morhetz/gruvbox'
Plugin 'tpope/vim-git'
Plugin 'Valloric/YouCompleteMe'
Plugin 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' }
" Plugin 'flazz/vim-colorschemes'
Plugin 'godlygeek/csapprox'

call vundle#end()

filetype plugin indent on
syntax on
syntax enable

#...
#...
#...
#...
#...

set t_Co=256
colorscheme matrix

如果我在命令提示符下输入hi Normal guifg=#44cc44 guibg=NONE ctermbg=none,它看起来和预期的一样。但不是仅在 matrix.vim 中声明时。我也尝试在.vimrc 中的colorscheme matrix 之后添加它,但它没有帮助。

首次加载时的样子。

我输入命令后的样子

【问题讨论】:

    标签: matrix vim terminal vim-plugin color-scheme


    【解决方案1】:

    您无需更改颜色方案中的任何内容,只需将以下内容添加到您的 .vimrc:

    hi Normal guibg=NONE ctermbg=NONE
    

    更新:

    正如 Liam 在 cmets 中提到的:

    此行需要低于.vimrc中的colorscheme

    【讨论】:

    • 当我在提示符中输入此命令时,它运行良好,但是当我将它添加到我的.vimrc 时,它不起作用。
    • 很有可能,如果你的 .vimrc 文件中有一个高亮命令会覆盖你的配色方案文件中的高亮命令。如果在 .vimrc 中覆盖高亮命令之前在 .vimrc 中设置颜色方案,就会发生这种情况。如果要突出显示与颜色方案相同的 vim,请在 .vimrc 文件末尾编写 set colorscheme 命令。
    • 我添加了 2 行,它起作用了。 ``` hi NonText ctermbg=none hi Normal guibg=NONE ctermbg=NONE ``
    • 这一行需要在.vimrc中的colorscheme下面
    • 您可以在 color.vim 文件的末尾添加该行。
    【解决方案2】:

    例如,如果您在 .vimrc 的第 5 行加载插件,那么如果您更改第 6 行,这并不意味着 Vim 完全加载插件然后运行您的第 6 行!!

    这就是为什么,你应该使用autocmd 命令,因为在这种情况下,它确保你的所有插件都被完全加载,然后你的命令将在此之后运行

    在这种情况下:

    " transparent bg
    autocmd vimenter * hi Normal guibg=NONE ctermbg=NONE
    " For Vim<8, replace EndOfBuffer by NonText
    autocmd vimenter * hi EndOfBuffer guibg=NONE ctermbg=NONE
    

    现在您确定所有内容都加载完毕后,您正在运行您的命令。

    【讨论】:

    • 效果很好,但文件结束后我仍然有一个不透明的背景。当文件的行数少于屏幕高度时,它是可见的。有什么建议吗?
    • @Cellcore 如果该背景与您的终端相关,只需将您的终端配置为支持透明度,如果您使用图形 gvim,则可以使用 picom 或 compton 之类的东西来透明它们。 >
    • @Cellcore 尝试以下操作(如果 vim
    • 如果我们为init.vim 文件提供资源(我们经常这样做),这将不起作用:使用 SourcePost 而不是 VimEnter。请参阅此*.com/a/67569365/14526555 答案以获取更多信息。
    【解决方案3】:

    使用这个gist。 我编译了一些设置让vim透明。

    【讨论】:

      【解决方案4】:

      上面的答案并不能解决所有问题,当我们进入 vim 时,它们会将 bg 更改为透明(因此是“VimEnte”事件)但是当您再次获取 init.vim 文件时,背景会恢复(这是因为在获取文件时,不会执行 VimEnter 自动命令)。

      我不会直接发布正确答案,而是解释如何获得它:

      所以,首先,我们需要了解打开 vim 时会发生什么:

      vi -V10debug.log +q
      

      这将创建一个 debug.log,您可以在其中查看执行了哪些自动命令及其顺序。

      autocmd vimenter * hi Normal guibg=NONE ctermbg=NONE
      " For Vim<8, replace EndOfBuffer by NonText
      autocmd vimenter * hi EndOfBuffer guibg=NONE ctermbg=NONE```
      

      如果我们使用它,我们会在日志中看到 VimEnter 将 bg 更改为 NONE(到目前为止它很好)。

      但是,下面的命令打开 vim,然后 source vimrc 然后退出(为了更快地找到我已经放了一些打印语句)

      vi -V10debug_so.log +'!echo sourcing'  +'source ~/.config/nvim/init.vim' +'!echo sourced' +q
      

      在新的日志中,我们看到,之后不再调用 VimEnter,bg 恢复为主题默认值。

      但是,我们也可以注意到,当一个文件被获取时,会发生一些事件,我们将重点关注以下内容

      1. SourcePre - 采购之前
      2. SourcePost - 采购后

      可以使用SourcePost 事件修复上述不完整的解决方案。所以新的正确自动命令是 (Final Answer)

          " Workaround for creating transparent bg
          autocmd SourcePost * highlight Normal     ctermbg=NONE guibg=NONE
                  \ |    highlight LineNr     ctermbg=NONE guibg=NONE
                  \ |    highlight SignColumn ctermbg=NONE guibg=NONE
      
      

      始终在组中使用它,请参阅此作为参考 - https://github.com/kalkayan/dotfiles/blob/main/.config/nvim/init.vim

      【讨论】:

        【解决方案5】:

        我使用 macvim,而 hi Normal guibg=NONE ctermbg=NONE 对我不起作用,即使我将它放在 .vimrc 中的 colorscheme 之后

        但我发现:set transparency=20 | :set blurradius=90 对我来说工作得很好。在 macvim 的帮助下,他们确实声明这两个命令 {not in Vi} 和 {only in MacVim GUI}。

        【讨论】: