如何防止在Vim中遍历跳转列表时离开当前缓冲区



我经常在Vim会话中打开几个缓冲区。这意味着我的跳转列表存储来自多个缓冲区的位置。然而,当我经常使用Ctrl+O键盘快捷键跳转到上一个位置时,我不想离开缓冲区,而是想跳转到当前缓冲区"本地"的上一个位置。我该怎么做呢?

例如,假设我的跳转列表如下:

4   10   1 ~/aaa.m
3   20   1 ~/aaa.m
2   12   2 ~/xxx.m
1   15   1 ~/aaa.m

第一次按Ctrl+O时,我想跳到文件aaa.m的第15行。重要的是,下次我按Ctrl+O时,我不想跳转到文件xxx.m。相反,我想跳转到文件aaa.m的第20行,也就是说,我以前的位置在"当前"缓冲区。但是,默认的Vim行为是将我带到文件xxx.m的第12行。

我该怎么做呢?

尝试下面的跳转列表遍历函数。它是连续的从一个跳转列表位置到另一个(使用Ctrl+O)或Ctrl+I取决于所对应的值提供给它的backforw参数),如果当前位置与它开始时所在的缓冲区在同一个缓冲区中。如果无法找到属于的跳转列表位置当前缓冲区,函数返回到跳转列表中的位置这是函数被调用前的当前值。

function! JumpWithinFile(back, forw)
    let [n, i] = [bufnr('%'), 1]
    let p = [n] + getpos('.')[1:]
    sil! exe 'norm!1' . a:forw
    while 1
        let p1 = [bufnr('%')] + getpos('.')[1:]
        if n == p1[0] | break | endif
        if p == p1
            sil! exe 'norm!' . (i-1) . a:back
            break
        endif
        let [p, i] = [p1, i+1]
        sil! exe 'norm!1' . a:forw
    endwhile
endfunction

将此函数用作 Ctrl + O / Ctrl + 替换锁定到当前缓冲区,创建如下所示的映射。

nnoremap <silent> <c-k> :call JumpWithinFile("<c-i>", "<c-o>")<cr>
nnoremap <silent> <c-j> :call JumpWithinFile("<c-o>", "<c-i>")<cr>

也许enhanced跳转插件会有所帮助。

安装了这个插件后,跳转到另一个缓冲区只有在相同的跳转命令被重复一次之后才会完成。

最新更新