如何跨 vim 中的所有缓冲区转到最后一个编辑位置?

How to go to the last edit location across all buffers in vim?

很容易转到当前缓冲区中的最后一个编辑位置。 参见 How to go back to lines edited before the last one in Vim? 更改列表是本地缓冲区,每个缓冲区都有自己的更改列表。 然而,我从最近编辑的缓冲区导航到另一个缓冲区是很常见的,并且以某种方式回到原始缓冲区中的最后一个编辑位置会很好。有没有办法回到上次插入或修改发生的地方?

你可以 :windo normal`.

也就是说,我通常只是使用 C-o(重复)。

如果我 "feel" 我可能想要 return 到某个点,我会点击 mA (它记录了一个 cross-file/buffer 标记)所以我可以从任何地方执行 `A(即使在重新启动编辑器之后)。


有点跑题了,我喜欢 :Obsession(作者 Tim Pope),因为它的会话非常长,可以进行大量的交叉引用导航。

尝试ctrl-`(或ctrl-6 ).

你可以在你的 vimrc 中加入以下内容

autocmd InsertLeave * execute 'normal! mI'

并按 `-I 跳回到您离开插入模式的位置。由于 I 是大写字母,因此它可以跨缓冲区工作。


附录(评论后)

阅读@Garbor Marton 的评论后,

我自己写了一个函数

let g:detect_mod_reg_state = -1
function! DetectRegChangeAndUpdateMark()
    let current_small_register = getreg('"-')
    let current_mod_register = getreg('""')
    if g:detect_mod_reg_state != current_small_register || 
                \ g:detect_mod_reg_state != current_mod_register
        normal! mM
        let g:detect_mod_reg_state = current_small_register
    endif
endfunction

" Mark I at the position where the last Insert mode occured across the buffer
autocmd InsertLeave * execute 'normal! mI'

" Mark M at the position when any modification happened in the Normal or Insert mode
autocmd CursorMoved * call DetectRegChangeAndUpdateMark()
autocmd InsertLeave * execute 'normal! mM'

我喜欢使用原始的 I 寄存器专门用于插入模式更改,所以在这里我使用 M 寄存器进行任何修改,包括 r,x,d,y 和最后的插入模式。