【问题标题】:How to prevent leaving the current buffer when traversing the jump list in Vim?Vim中遍历跳转列表时如何防止离开当前缓冲区?
【发布时间】:2011-10-27 08:15:33
【问题描述】:

我经常在我的 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 行。

关于如何实现这一点的任何想法?

【问题讨论】:

  • 这对于超级用户来说可能是一个更好的问题,stackoverflow 问题(和答案)往往与编码直接相关。 superuser.com 由同一个人运营,但专注于使用软件。
  • @David Waters,没有。 meta.stackexchange.com/q/25925/160504
  • 使用changelist 会满足您的需求吗?您可以使用g;g, 在更改列表中来回移动。
  • @Peter Rincker,感谢您的回复。但是,这并不能解决问题,因为我需要跳转到以前的光标位置,而 而不是 只是更改位置。当我在代码中搜索字符串并在不编辑代码的情况下从一个函数跳转到另一个函数时,经常会发生这种情况。

标签: vim buffer jump-list


【解决方案1】:

试试下面的跳转列表遍历函数。它一步一步地 从一个跳转列表位置到另一个(使用 Ctrl+OCtrl+I 取决于是 提供给它的backforw 参数),如果当前 location 与它开始的缓冲区在同一个缓冲区中。 如果无法找到属于 当前缓冲区,函数返回跳转列表中的位置 这是调用函数之前的当前值。

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

将此功能用作 Ctrl+O/Ctrl+I-替换 锁定到当前缓冲区,创建映射,如下所示。

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

【讨论】:

  • 哎呀。那是病了。和狡猾。逆流游泳给你积分
  • 感谢您编写该代码,非常有趣的解决方案。它几乎工作,有几个小问题。首先,如果一个目录在我的跳转列表中(这可能是因为我浏览了一个目录来打开一个文件),它会在当前缓冲区中打开 netrw 浏览器,然后卡在那里。其次,当函数到达跳转列表的末尾时,它会一直在最后两个位置之间跳转(按下Ctrl+k 时)。它是否有可能在跳转列表中循环,或者只是停留在最后一个位置?
  • @sehe:这对我来说也很反常。 (而且我个人不会尝试在默认跳转列表行为中偷工减料。)但是尝试找出解决此问题的方法很有趣(而且有点 hackish)。
  • @vimgm:请您尽量减少不正确行为的示例并更详细地描述它。目前我无法重现这两个问题。
  • @ib:好的,现在可以完美运行了。无限循环已停止。我认为 Netrw 问题是由于我使用 Tabbar 插件(它有助于管理缓冲区之间的切换)与 Netrw 一起使用。我现在禁用了 Netrw 并改用 NERDTree。一切都像魅力一样。 (哦,您可能想从上面的代码中删除echos)。感谢所有的帮助。
【解决方案2】:

也许EnhancedJumps plugin 会有所帮助。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多