2011-12-07 2 views
18

Si vous êtes familiarisé avec l'application iTerm2, vous saurez que vous pouvez scinder des vues similaires à vim et que les vues inactives sont "grisées".vim - paneaux fractionnés inactif

Habituellement, je travaille dans vim avec trois vues verticales et il serait agréable d'atténuer les inactives en réglant la couleur d'arrière-plan sur un ton plus sombre, par exemple.

Existe-t-il un moyen de le faire?

Répondre

17

Je suis venu avec la solution suivante (en utilisant 'colorcolumn' et MHS '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 

la voir à mes (en cours) dotfiles: https://github.com/blueyed/dotfiles/blob/master/vimrc#L351

Mise à jour I ont créé un plugin:

+2

génial! très agréable. –

+1

Cela pourrait être rendu plus efficace pour toutes les machines qui ont des difficultés. Nous n'avons pas vraiment besoin de courir pour toutes les fenêtres chaque fois que nous changeons de fenêtre. Nous avons juste besoin d'effectuer 'setwinvar' sur n'importe quelle fenêtre WinLeave, et' setlocal nocolorcolumn' sur WinEnter. (En supposant que notre session commence avec une seule fenêtre, et nous ne créons jamais plusieurs fenêtres sans entrer chacune d'elles.) – joeytwiddle

+0

Enlever la merde au WinEnter * pour que les paramètres originaux de la ligne de la souris soient respectés –

1

Changer la couleur de fond que vous décrivez nécessiterait différentes colourschemes pour les différentes fenêtres Vim. Pour autant que je sache, ce n'est pas possible, car c'est un paramètre global (voir this answer d'il y a quelques jours).

Comme aide visuelle à laquelle la fenêtre est active, je trouve que la ligne de statut est habituellement suffisante. Les groupes de surbrillance sont différents pour la fenêtre active (hi StatusLine) et pour toute fenêtre inactive (hi StatusLineNC). Vous pouvez soit choisir un schéma de couleurs avec un contraste très prononcé entre eux, soit éditer votre schéma de couleurs préféré.

+1

En plus d'une StatusLine contrastée, je trouve utile de définir une CursorLine qui se démarque. – David

+1

Bien que ce soit la réponse acceptée par le PO, c'est en fait incorrect. La réponse de @blueyed fournit un script qui, placé dans mon .vimrc, change effectivement la couleur d'arrière-plan des tampons inactifs (windows). C'est un peu un hack, mais ça marche. – monotasker

1

Dans neovim (v2.2.1), la configuration suivante va obscurcir les volets inactifs:

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

Je voulais juste ajouter: Si vous utilisez nvim dans une interface graphique (par exemple nvim-qt), remplacez 'ctermbg' par' guibg' et utilisez une couleur hexadécimale comme valeur, par ex. 'guibg = # E7E7E7'. – Rotareti