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

Preserve cursor position when switching between buffers with :bn

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

Vim 记得我的光标在哪一行,但当我在缓冲区之间切换时总是将我的光标移动到行的开头。

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

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

:autocmd BufEnter * silent! normal! g`"

注意: 您可以附加定位命令,例如 zz(将当前行定位在 window 的中心)或 zv(打开任何折叠)在 g`.

之后

怎么样

Vim cursor jumps to beginning of the line after buffer switch

TL;DR

:set nostartofline

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

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

function! LastModified()
  if &modified
    let save_cursor = getpos(".")
    let n = min([250, line("$")])
    :silent keepjumps exe '1,' . n . 's/^\(.*L\)ast.modified.*:.*/ast 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