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

vim*_*mgm 9 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
Run Code Online (Sandbox Code Playgroud)

我想在第一次按Ctrl-o时跳转到文件aaa.m的第15行.重要的是,下次我按Ctrl-o时,我不想跳转到文件xxx.m. 相反,我想跳到文件aaa.m的第20行; 也就是说,我之前在"当前"缓冲区内的位置.Vim的默认行为是带我到文件xxx.m的第12行.有关如何实现这一目标的任何想法?

ib.*_*ib. 10

尝试以下跳转列表遍历功能.它从一个跳转列表位置连续步进到另一个跳转列表位置(使用Ctrl+ OCtrl+ 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
Run Code Online (Sandbox Code Playgroud)

要将此函数用作锁定到当前缓冲区的Ctrl+ O/ Ctrl+ - I置换,请创建如下所示的映射.

nnoremap <silent> <c-k> :call JumpInFile("\<c-i>", "\<c-o>")<cr>
nnoremap <silent> <c-j> :call JumpInFile("\<c-o>", "\<c-i>")<cr>
Run Code Online (Sandbox Code Playgroud)

  • 埃克。那是病了。和狡猾。逆流游泳给你积分 (2认同)