11

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

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

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

aaa.m第一次按Ctrl+时,我想跳到文件的第 15 行O。重要的是,下次我按Ctrl+O时,我不想跳转到 file  xxx.m。相反,我想跳转到 file 的第 20 行 aaa.m,即我之前在“当前”缓冲区中的位置。不过,默认的 Vim 行为是将我带到 file 的第 12 行 xxx.m

关于如何实现这一目标的任何想法?

4

2 回答 2

10

试试下面的跳转列表遍历函数。它从一个跳转列表位置连续跳到另一个(使用Ctrl+OCtrl+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+ -I替换,请创建映射,如下所示。

nnoremap <silent> <c-k> :call JumpWithinFile("\<c-i>", "\<c-o>")<cr>
nnoremap <silent> <c-j> :call JumpWithinFile("\<c-o>", "\<c-i>")<cr>
于 2011-08-16T07:50:53.187 回答
1

也许EnhancedJumps 插件会有所帮助。

安装此插件后,只有在之后立即再次重复相同的跳转命令时才会跳转到另一个缓冲区。

于 2013-04-17T05:11:43.927 回答