2010-11-23 19 views
18

Vim ile genel olarak karşılaştığım bir sorun, arabellekleri bir pencerede değiştirdiğimde (:[n]b veya MiniBufExpl), imleç konumu aynı kalır, ancak pencere her zaman kendini konumlandırır. imleç üzerindeki satır ortadadır. Pencerenin üst/alt bölümlerinin nerede olduğunu hatırladığımdan, pencerenin ortasında imlecin nerede konumlandırılacağı konusunda değil, görsel olarak hatırladığımdan bu gerçekten can sıkıcı bir durumdur.Vim arabelleğe alınırken pencere konumunu koru

Pencerenin arabelleğe göre konumunu korumak için değiştirebileceğim bir ayar var mı?

cevap

31

Sorunuzu okuyana kadar beni rahatsız etmediğini not etmek ilginçtir, lol.

bu deneyin:

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

Ayrıca beni rahatsız etmedi. Ancak bu eşlemeyi kullandım: nmap : bn '' ' – tungd

+0

Güzel çalışma, @poisonedbit, belki de VIM için bir programlama kılavuzu önerebilir misiniz? – Art

+1

@Art Deneyin: h usr_41.txt' Vim; artı Steve Losh [Zor Yolu Vimscript öğrenin] (http://learnvimscriptthehardway.stevelosh.com/). – echristopherson

3

@dnets tarafından gönderildi Yani komut hep dosyada aynı pozisyonda olsa benim için ekranın üst kısmındaki imleci ayarlar.

I ( http://vim.wikia.com/wiki/Avoid_scrolling_when_switch_buffers kopyalanmış) Bu

" 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 

olarak değiştirdim Ve şimdi ben ekran ve imleç kaydedilmiş, istediğiniz gibi çalışır.