想象一下,我正在编码,我打开了不同的分割窗格。当我从一个缓冲区/窗格切换到另一个缓冲区/窗格时,我应该将哪些设置传递到vimrc以更改背景颜色?
我试过了:
autocmd BufEnter * highlight Normal ctermbg=black
autocmd BufLeave * highlight Normal ctermbg=white
我想补充一点,我确信我已启用256色
答案 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
突出显示组着色。
活动窗口和非活动窗口之间的唯一区别是(闪烁)光标和不同突出显示的状态行(即StatusLine
与StatusLineNC
)。 (您可以添加其他差异,例如只打开当前缓冲区中的'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