vim:使用:bn在缓冲区之间切换时保留光标位置

时间:2016-12-05 23:07:08

标签: vim cursor line

如何在切换缓冲区时将光标位置保留在一行内,例如:bn

vim会记住我的光标所在的行,但是当我在缓冲区之间切换时,总是将光标移动到行的开头。

3 个答案:

答案 0 :(得分:2)

我不确定为什么Vim会这样做,但幸运的是,确切位置存储在'"标记中(cp。:help 'quote)。

以下:autocmd将尝试使用g`命令将光标恢复到该位置:

:autocmd BufEnter * silent! normal! g`"

答案 1 :(得分:0)

怎么样

Vim cursor jumps to beginning of the line after buffer switch

TL; DR

:set nostartofline

对我来说g`"弄乱了我的quickfix位置。

答案 2 :(得分:0)

我的 ~/.vimrc 中有一个函数,可以在保存时将日期时间保存在文件顶部附近(如果文件顶部附近有“上次修改”字符串):

function! LastModified()
  if &modified
    let save_cursor = getpos(".")
    let n = min([250, line("$")])
    :silent keepjumps exe '1,' . n . 's/^\(.*L\)ast.modified.*:.*/\1ast modified: ' . strftime('%Y-%m-%d %H:%M:%S %z (PST)') . '/e'
    call histdel('search', -1)
    call setpos('.', save_cursor)
  endif
endfun
autocmd BufWritePre * call LastModified()
## Ref [1], [2]

效果很好;但是,在垂直拆分中切换缓冲区时,我的光标跳线(未能保留行位置/光标位置)。

autocmd BufEnter * silent! normal! g`"

(在此线程的另一个答案中建议)没有效果,但这(参考 [3])解决了该问题:

" 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

另外:为了更轻松地跟踪任一拆分中的编辑,在正常模式下按 zz 使当前行垂直居中(参考 [4])。


[1] https://docwhat.org/vim-preserve-your-cursor-and-window-state
[2] http://vim.wikia.com/wiki/Insert_current_date_or_time
[3] https://vim.fandom.com/wiki/Avoid_scrolling_when_switch_buffers
[4] https://vim.fandom.com/wiki/Make_search_results_appear_in_the_middle_of_the_screen