我经常在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行。关于如何实现这一目标的任何想法?
答案 0 :(得分:10)
尝试以下跳转列表遍历功能。它先后步骤
一个跳转列表位置到另一个(使用 Ctrl + O 或
Ctrl + I 取决于其back
和forw
的值
如果当前位置与缓冲区相同,则参数有)并停止
它从那个缓冲区开始。如果找不到跳转列表
与缓冲区相关的位置,函数返回到该位置
跳转列表在开始之前就有了。
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会有所帮助。
安装此插件后,只有在之后立即再次重复相同的跳转命令时,才会跳转到另一个缓冲区。