在 Vim 中导航时,我经常发现自己跳转到一个文件,在该文件周围跳转,然后跳转到另一个文件,依此类推。最后,我想返回到原始文件。使用<CTRL-O>
可以完成这项工作,但需要按比我想要的更多的键。
我知道我可以事先设定一个标记,但我想要一个不需要任何前期思考的解决方案。
我正在寻找一种方法来通过跳转列表导航回去,每个文件只停止一次。
答案1
我的EnhancedJumps 插件<C-o>
具有/的映射变体<C-i>
,以限制跳转到当前或不同的缓冲区。
<Leader><CTRL-O>, <Leader><CTRL-I>
转到另一个缓冲区中 [count] 个较旧/较新的光标位置。不考虑当前缓冲区内的跳转。可用于调用以前访问过的缓冲区,而无需遍历所有本地位置。无论跳转方向如何,当缓冲区中有多个后续跳转时,将使用缓冲区中的最后一个跳转位置。
答案2
我遇到了完全相同的问题,发现 EnhancedJump 插件非常大,需要更大的依赖性。我编写了一个小函数来计算跳转到当前缓冲区以外的其他缓冲区所需的<C-O>
/数量<C-I>
。跳转列表保持干净,以最小的方式将其映射到<leader><C-O>/<C-I>
满足我的需求。
<leader><C-O>
跳转到跳转列表中前一个缓冲区的最后一个跳转。<leader><C-I>
执行相同操作并移动到跳转列表中的下一个缓冲区。
function! JumpToNextBufferInJumplist(dir) " 1=forward, -1=backward
let jl = getjumplist() | let jumplist = jl[0] | let curjump = jl[1]
let jumpcmdstr = a:dir > 0 ? '<C-O>' : '<C-I>'
let jumpcmdchr = a:dir > 0 ? '^O' : '^I' " <C-I> or <C-O>
let searchrange = a:dir > 0 ? range(curjump+1,len(jumplist))
\ : range(curjump-1,0,-1)
for i in searchrange
if jumplist[i]["bufnr"] != bufnr('%')
let n = (i - curjump) * a:dir
echo "Executing ".jumpcmdstr." ".n." times."
execute "silent normal! ".n.jumpcmdchr
break
endif
endfor
endfunction
nnoremap <leader><C-O> :call JumpToNextBufferInJumplist(-1)<CR>
nnoremap <leader><C-I> :call JumpToNextBufferInJumplist( 1)<CR>
不要忘记用 CTRL+v 替换第 4 行中的^O
和,^I
用真正的 CTRL+o 和 CTRL+i 字符。我不知道为什么,但在执行命令时字符串"<C-O>"
和"<C-I>"
不起作用normal!
。
答案3
我不确定我是否理解正确。您想在文件/缓冲区之间跳转,而不是跳转列表中的位置。(同一文件中可能有许多位置)
然后你可以检查缓冲区相关的命令。例如
:ls "list all buffers, Number, name
:b[N] "switch to buffer N
:b <tab> "after tab, buffer name auto-completion
并且有很多插件可以帮助我们轻松地切换缓冲区。
答案4
跳转列表的目的不是帮助您在缓冲区之间跳转:它记录您所做的所有跳转动作。由于典型的 vim 使用包括大量在缓冲区内和跨缓冲区的跳转,因此使用它在缓冲区之间导航是一个错误。
除非你从来不用跳跃动作。但那将是一个更大的错误。
Vim 具有缓冲区列表,顾名思义,它是所有缓冲区的列表,并带有一系列自己的导航命令。不幸的是,这个列表是“静态的”:您可以导航到列表中的上一个缓冲区,但不能导航到之前访问过的缓冲区。Vim 不保留这样的列表。
我使用名称来导航缓冲区。但编写一个函数来过滤跳转列表并导航到第一个不同的缓冲区也许是可行的。目前我无法在这部手机上做到这一点,但我认为这不会太难。