Vim:如何防止跳出当前缓冲区?

时间:2011-08-15 14:55:24

标签: vim buffer jump-list

我经常在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行。关于如何实现这一目标的任何想法?

2 个答案:

答案 0 :(得分:10)

尝试以下跳转列表遍历功能。它先后步骤 一个跳转列表位置到另一个(使用 Ctrl + O Ctrl + I 取决于其backforw的值 如果当前位置与缓冲区相同,则参数有)并停止 它从那个缓冲区开始。如果找不到跳转列表 与缓冲区相关的位置,函数返回到该位置 跳转列表在开始之前就有了。

function! JumpInFile(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

将此功能用作 a Ctrl + O / Ctrl + I -replacement locked 到当前缓冲区,创建如下所示的映射。

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

答案 1 :(得分:0)

也许EnhancedJumps plugin会有所帮助。

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