切换缓冲区时Vim保持窗口位置

时间:2010-11-23 00:11:04

标签: vim

我在Vim中遇到的一个问题是,当我在一个窗口(:[n]b或MiniBufExpl)中切换缓冲区时,光标位置保持不变,但窗口总是自己定位,所以行是光标在中间。

这真让我感到烦恼,因为我直观地记得窗户的顶部/底部位置,而不是光标位于窗口中间的位置。

我是否可以更改设置以保留窗口在缓冲区上的位置?

2 个答案:

答案 0 :(得分:33)

有趣的是,在我读完你的问题之前,它并没有打扰我,哈哈。

试试这个:

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

答案 1 :(得分:4)

@dnets发布的脚本总是将光标设置在屏幕顶部,虽然文件位于同一位置。

我将其更改为此(从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

它现在可以正常工作,保存屏幕和光标位置。