2011-12-07 10 views
18

Se hai familiarità con l'applicazione iTerm2, saprai che puoi dividere viste simili a vim, e le viste inattive sono "oscurate".vim - dim split panels inattivi

Di solito lavoro in vim con tre viste divise verticali e sarebbe bello attenuare quelle inattive impostando il colore di sfondo su un tono più scuro, ad esempio.

C'è un modo per farlo?

risposta

17

sono venuto con la seguente soluzione (usando 'colorcolumn' e disinserimento 'CursorLine'):

" 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 '~') 
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 

vederlo al mio dotfile (correnti): https://github.com/blueyed/dotfiles/blob/master/vimrc#L351

Aggiornamento I hanno creato un plugin fuori di esso: https://github.com/blueyed/vim-diminactive

+2

fantastico! molto bella. –

+1

Questo potrebbe essere reso più efficiente per tutte le macchine che stanno lottando. Non abbiamo davvero bisogno di girare per tutte le finestre ogni volta che cambiamo finestra. Abbiamo solo bisogno di eseguire 'setwinvar' su qualsiasi finestra abbiamo WinLeave, e' setlocal nocolorcolumn' su WinEnter. (Questo presuppone che la nostra sessione inizi con una sola finestra, e non creiamo più finestre senza inserirle ciascuna.) – joeytwiddle

+0

Rimuovere auEnEnterEnter * set merda in modo che vengano rispettate le impostazioni originali della linea di cursore –

1

Cambiare il colore di sfondo come lei richiederebbe colourschemes diverse per diverse finestre Vim. Per quanto ne so, questo non è possibile, in quanto è un ambiente globale (vedi this answer di pochi giorni fa).

Come ausilio visivo a quale finestra è attiva, trovo che la riga di stato sia usualmente sufficiente. I gruppi di evidenziazione sono diversi per la finestra attiva (hi StatusLine) e per tutte le finestre innestate (hi StatusLineNC). Potresti scegliere un tema di colori con un forte contrasto tra di loro o modificare il tuo schema di colori preferito.

+1

Oltre a una StatusLine a contrasto, trovo utile impostare una CursorLine che si distingue. – David

+1

Sebbene questa sia la risposta accettata dall'OP, in realtà non è corretta. La risposta di @blueyed fornisce uno script che, inserito nel mio .vimrc, cambia effettivamente il colore di sfondo dei buffer inattivi (windows). È un po 'un trucco, ma funziona. – monotasker

1

In neovim (v0.2.1), la seguente configurazione sarà dim riquadri inattive:

hi ActiveWindow ctermbg=16 | hi InactiveWindow ctermbg=233 
set winhighlight=Normal:ActiveWindow,NormalNC:InactiveWindow 
+0

Volevo solo aggiungere: se utilizzi nvim in una GUI (ad es. Nvim-qt), sostituisci 'ctermbg' con' guibg' e usa un colore esadecimale come valore, ad es. 'Guibg = # E7E7E7'. – Rotareti