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+ 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
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)