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

时间:2015-01-18 20:49:32

标签: vim

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

3 个答案:

答案 0 :(得分:1)

你可以做:windo normal `

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

如果我“觉得”我可能想回到某个点,我只会点击mA(它记录一个跨文件/缓冲标记)所以我可以做`< / kbd> A 来自任何地方(甚至在重新启动编辑器之后)。


稍微偏离主题,我喜欢:Obsession(由Tim Pope提供),用于进行大量交叉引用导航的长期会话。

答案 1 :(得分:1)

您可以将以下内容放入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和最后插入模式。

答案 2 :(得分:0)

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