如何在vim中更改当前缓冲区或窗格的背景颜色?

时间:2013-03-07 22:54:08

标签: vim

想象一下,我正在编码,我打开了不同的分割窗格。当我从一个缓冲区/窗格切换到另一个缓冲区/窗格时,我应该将哪些设置传递到vimrc以更改背景颜色?

我试过了:

autocmd BufEnter * highlight Normal ctermbg=black                                                                                                                                                                                                                              
autocmd BufLeave * highlight Normal ctermbg=white 

我想补充一点,我确信我已启用256色

5 个答案:

答案 0 :(得分:10)

实际上,一种获得此效果的方法。请参阅@blueyed对此相关问题的回答:vim - dim inactive split panes。他提供了下面的脚本,当放在我的.vimrc中时,它会使非活动窗口的背景变暗。实际上,它使背景与为colorcolumn指定的颜色相同(垂直线指示所需的文本宽度)。

" Dim inactive windows using 'colorcolumn' setting
" This tends to slow down redrawing, but is very useful.
" Based on https://groups.google.com/d/msg/vim_use/IJU-Vk-QLJE/xz4hjPjCRBUJ
" XXX: this will only work with lines containing text (i.e. not '~')
" from 
if exists('+colorcolumn')
  function! s:DimInactiveWindows()
    for i in range(1, tabpagewinnr(tabpagenr(), '$'))
      let l:range = ""
      if i != winnr()
        if &wrap
         " HACK: when wrapping lines is enabled, we use the maximum number
         " of columns getting highlighted. This might get calculated by
         " looking for the longest visible line and using a multiple of
         " winwidth().
         let l:width=256 " max
        else
         let l:width=winwidth(i)
        endif
        let l:range = join(range(1, l:width), ',')
      endif
      call setwinvar(i, '&colorcolumn', l:range)
    endfor
  endfunction
  augroup DimInactiveWindows
    au!
    au WinEnter * call s:DimInactiveWindows()
    au WinEnter * set cursorline
    au WinLeave * set nocursorline
  augroup END
endif

答案 1 :(得分:4)

你做不到。 :highlight组是全球性的;即,当您有多个窗口:split时,所有窗口背景都将由同一个Normal突出显示组着色。

活动窗口和非活动窗口之间的唯一区别是(闪烁)光标和不同突出显示的状态行(即StatusLineStatusLineNC)。 (您可以添加其他差异,例如只打开当前缓冲区中的'cursorline'(请参阅我的CursorLineCurrentWindow plugin。)

Vim的设计目标之一是在GUI GVIM中在原始的低色控制台中同样运行良好。当您只有16种颜色可用时,背景颜色的区别可能会与语法突出显示冲突。我想这就是为什么Vim没有也不会有这个功能的原因。

答案 2 :(得分:3)

基本上肯特上面说的将会奏效 - 令人惊讶的是。唯一的限制是您只能调暗前景色。将其复制到vimrc中,并唤起:call ToggleDimInactiveWin()

let opt_DimInactiveWin=0
hi Inactive ctermfg=235
fun! ToggleDimInactiveWin()
    if g:opt_DimInactiveWin
        autocmd! DimWindows
        windo syntax clear Inactive
    else
        windo syntax region Inactive start='^' end='$'
        syntax clear Inactive
        augroup DimWindows
            autocmd BufEnter * syntax clear Inactive
            autocmd BufLeave * syntax region Inactive start='^' end='$'
        augroup end
    en
    let g:opt_DimInactiveWin=!g:opt_DimInactiveWin
endfun

我必须写一些事情来写这个:

(1)windo方便地在所有窗口执行命令

(2)augroup定义自动命令组,可以使用autocmd! group

清除

答案 3 :(得分:1)

就个人而言,我使用我的状态线让我知道这一点。我在离开时使用WinEnter和WinLeave autocmds切换到非活动状态行(变灰),并在进入时切换到活动状态行(明亮颜色)。你提到的分割窗格是vim中的窗口。这也有效,因为:help statusline告诉我们它的设置是全局的或窗口的本地设置,因此您可以使用:setlocal statusline=...let &l:statusline=...仅应用于当前窗口。

您的方法不起作用,因为a)BufEnter和BufLeave不一定是您想要的事件,b)突出显示组是全局的,因此更改Normal的定义会为每个窗口更改它。

答案 4 :(得分:1)

对于Neovim用户,有winhighlight选项。帮助文件提供以下示例:

示例:为非当前窗口显示不同的颜色:

set winhighlight=Normal:MyNormal,NormalNC:MyNormalNC