2010-11-23 18 views
18

Un problema que he tenido con Vim en general es que cuando cambio buffers en una ventana (ya sea :[n]b o MiniBufExpl) la posición del cursor permanece igual, pero la ventana siempre se posiciona de manera la fila en que el cursor está en el medio.Vim mantener posición de ventana al cambiar buffers

Esto es realmente molesto ya que visualmente recuerdo dónde están las partes superior e inferior de la ventana, no donde deberían estar si el cursor se posicionara en el medio de la ventana.

¿Hay alguna configuración que pueda cambiar para conservar la posición de una ventana sobre un búfer?

Respuesta

31

Es interesante notar que no me molestó hasta que leí tu pregunta, jeje.

Prueba esto:

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

No me molestó tampoco. Sin embargo, solía tener esta asignación: 'nmap : bn ''' – tungd

+0

Buen trabajo, @poisonedbit, ¿podría recomendar un manual de programación para VIM? – Art

+1

@Art Try ': h usr_41.txt' en Vim; además de [Learn Vimscript the Hard Way] de Steve Losh (http://learnvimscriptthehardway.stevelosh.com/). – echristopherson

3

Ese guión Publicado por @dnets siempre se pone el cursor en la parte superior de la pantalla para mí, aunque a la misma posición en el archivo.

lo cambié a este (copiado de 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 

Y ahora funciona como yo quiero, posición de la pantalla y el cursor salvó.

Cuestiones relacionadas