使用 :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
如何在切换缓冲区时将光标位置保留在一行中,例如 :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