我在Vim中遇到的一个问题是,当我在一个窗口(:[n]b或者MiniBufExpl)中切换缓冲区时,光标位置保持不变,但是窗口始终处于自身位置,因此光标所在的行位于中间.
这真让我感到烦恼,因为我在视觉上记得窗口的顶部/底部部分在哪里,而不是光标位于窗口中间的位置.
是否有一个设置我可以更改以保持窗口在缓冲区上的位置?
dne*_*ets 33
有趣的是,在我读完你的问题之前,它并没有打扰我,哈哈.
试试这个:
if v:version >= 700
au BufLeave * let b:winview = winsaveview()
au BufEnter * if(exists('b:winview')) | call winrestview(b:winview) | endif
endif
Run Code Online (Sandbox Code Playgroud)
@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
Run Code Online (Sandbox Code Playgroud)
现在它可以按我的意愿工作,屏幕和光标位置已保存。