2010-11-23 19 views
18

Un problème que j'ai rencontré avec Vim en général est que lorsque je change de tampon dans une fenêtre (:[n]b ou MiniBufExpl) la position du curseur reste la même, mais la fenêtre se positionne toujours la ligne sur laquelle se trouve le curseur est au milieu. Ceci est vraiment gênant car je me rappelle visuellement où se trouvent les parties supérieures/inférieures de la fenêtre, et non où elles seraient si le curseur était positionné au milieu de la fenêtre.Vim garde la position de la fenêtre lors de la commutation des tampons

Y a-t-il un paramètre que je peux modifier pour conserver la position d'une fenêtre sur un tampon?

Répondre

31

Il est intéressant de noter que cela ne m'a pas dérangé jusqu'à ce que j'ai lu votre question, lol.

Essayez ceci:

if v:version >= 700 
    au BufLeave * let b:winview = winsaveview() 
    au BufEnter * if(exists('b:winview')) | call winrestview(b:winview) | endif 
endif 
+1

Cela ne m'a pas dérangé non plus. Cependant, j'avais l'habitude d'avoir cette cartographie: 'nmap : bn ''' – tungd

+0

Beau travail, @poisonedbit, pourriez-vous peut-être recommander un manuel de programmation pour VIM? – Art

+1

@Art Essayez ': h usr_41.txt' dans Vim; plus Steve Losh [Apprendre Vimscript le Hard Way] (http://learnvimscriptthehardway.stevelosh.com/). – echristopherson

3

Ce scénario publié par @dnets définit toujours le curseur en haut de l'écran pour moi, mais à la même position dans le fichier.

je l'ai changé à ce (copié à partir http://vim.wikia.com/wiki/Avoid_scrolling_when_switch_buffers)

" Save current view settings on a per-window, per-buffer basis. 
function! AutoSaveWinView() 
    if !exists("w:SavedBufView") 
     let w:SavedBufView = {} 
    endif 
    let w:SavedBufView[bufnr("%")] = winsaveview() 
endfunction 

" Restore current view settings. 
function! AutoRestoreWinView() 
    let buf = bufnr("%") 
    if exists("w:SavedBufView") && has_key(w:SavedBufView, buf) 
     let v = winsaveview() 
     let atStartOfFile = v.lnum == 1 && v.col == 0 
     if atStartOfFile && !&diff 
      call winrestview(w:SavedBufView[buf]) 
     endif 
     unlet w:SavedBufView[buf] 
    endif 
endfunction 

" When switching buffers, preserve window view. 
if v:version >= 700 
    autocmd BufLeave * call AutoSaveWinView() 
    autocmd BufEnter * call AutoRestoreWinView() 
endif 

Et il fonctionne maintenant comme je veux, la position de l'écran et le curseur enregistré.