有没有一种方法可以可靠地在文件历史记录中往返


15

我想转到我刚刚编辑的文件,然后再编辑类似MRU插件的文件。

:bnext并且:bprev有时可以正常运行,但大多数情况下,我只会遇到一些晦涩的文件,我不记得编辑该文件了,而被迫退回到MRU插件。

有办法解决吗?

Ctrl-^在最后两个文件之间交换。在更多内容之间导航的最佳方法是什么?

我知道这可能很棘手,但我同意任何可以改善当前:bn :bp行为的方法。我经常看到的缓冲区完全不合适。也许有一个插件可以跟踪最近的文件并提供挂钩,以便我可以创建映射?

回复评论使我的想法有些清醒。我相信我想要的是能够按最新保存顺序浏览文件。这样,如果我回溯历史,顺序将不会改变,直到我保存文件,然后保存到最后一个文件,然后向后一步“返回”到之前保存的文件,即我开始的那一步。

诸如Ctrl-O Ctrl-Ipair之类的东西,可以立即切换文件而不会在当前缓冲区中跳转。uUnetrw 类似:

   u    Change to recently-visited directory                 |netrw-u|
   U    Change to subsequently-visited directory             |netrw-U|

您所说的“我最近编辑的文件”是“我最近编辑过的文件”吗?还是您只是指您在Vim中可见的最后一个?
Rich

2
如果是后者,我个人只是捣碎Ctrl-O(或有时捣碎Ctrl-T),直到到达那里。
Rich Rich

是的,这是我做的太Ctrl-OCtrl-I。但是它会在编辑点之间跳转,从而中断了流程。我要按访问顺序在缓冲区之间来回移动。插件如何显示最新文件列表?他们在内部跟踪他们吗?
firedev 2015年

Ctrl-^在最后两个文件之间交换。但是,在更多之间导航的最佳方法是什么?
firedev 2015年

通过访问,还不清楚您是指打开,写入,在有重点的窗口中还是在更改它们的顺序。 Ctrl-O/I是特定于窗口的工具,而MRU通常是全局的。如果您确实希望按最近访问的顺序排序,则一旦您跳回一次,列表的顺序就会改变,从而使事情更加复杂。
马特·勃姆

Answers:


7

我编写了一个小函数来为我反复按下CTRL-O,直到缓冲区更改。

你可以在这里找到它。我将其映射到CTRL-U,但是如果需要,您可以覆盖CTRL-O。

function! GoBackToRecentBuffer()
  let startName = bufname('%')
  while 1
    exe "normal! \<c-o>"
    let nowName = bufname('%')
    if nowName != startName
      break
    endif
  endwhile
endfunction

nnoremap <silent> <C-U> :call GoBackToRecentBuffer()<Enter>

您可能会为编写类似的内容<C-I>

问题:

  • 如果没有以前的缓冲区,它将继续静默循环,直到您按下CTRL-C!

有关:

  • :jumps 列出CTRL-O将退后的历史位置。
  • Vim的默认CTRL-T是混搭CTRL-O的一个很好的选择,因为它的粒度更粗:它仅通过标签跳转返回。

Vim似乎仅提供CTRL- ^公开的MRU文件历史记录的一级。但是,我已经注意到在:kwbd用于关闭一些缓冲区时,Vim确实会以预期的反向历史顺序退回到先前的缓冲区。Vim可能有一个未与我们共享的MRU列表,或者它可能根据CTRL-O位置历史记录(:jumps)选择要使用的缓冲区。
joeytwiddle

1
或者,autocmd InsertLeave * normal mZ将记住全局标记Z中最后编辑的文件。您可以使用g'Z。//我有,nmap <C-y> g'Z但是我仍然倾向于更频繁地使用Ctrl-U。
joeytwiddle

6

您可以:ls用来显示所有缓冲区。例如:

:ls
  1      "vim.markdown"                 line 160
  2      "ext.markdown"                 line 0
  3 #    "~/to"                         line 1
  4 %a   "~/TODO"                       line 68

要返回buffer ext.markdown,请使用:e +Nbuf,其中N是第一列中的缓冲区编号。例如::e +2buf

您可以创建一个简单的函数以获得更多的交互体验:

fun! ChooseBuf()
    redir => buffers
        silent ls
    redir end

    echo l:buffers
    let l:choice = input('Which one: ')
    execute ':edit +' . l:choice . 'buf'
endfun
command! ChooseBuf call ChooseBuf()
nnoremap <Leader>b :call ChooseBuf()<CR>

使用:ChooseBuf或后,<Leader>b您只需键入要编辑的缓冲区编号。

这不是完全 “最近使用的”,因为订单是“最近打开的”(这也可能就是为什么:bnext/ :bprev不能按您期望的那样工作)的原因。


4

<C-6>是您所需要的,它将带您返回到当前缓冲区之前打开的缓冲区。也有:bprev:bnext可以用于相同的。


<C-6>不错,但是我不能用它来跳回两个缓冲区。bprev并且bnext不是跳跃的顺序。
Praxeolitic 2015年

是的,我认为没有什么更好的方法可以深入了解历史。您必须使用一些MRU插件,即使CtrlP拥有一个,也必须有其他插件
Dhruva Sagar

2
注意:不是<C-6>,是<C-^>。尽管在许多终端仿真器上没有区别,但在某些(包括OS X附带的)上却没有区别。对于后一种情况,需要使用Shift密钥(假设Qwerty布局)。
tommcdo'2

@tommcdo有趣,我在osx上,但是使用iterm代替terminal.app,它对我来说是相同的。要求使用Shift键实在太可惜了。
Dhruva Sagar'2

想一想,可能只是我的OS正在抓取该键绑定,而没有将其传播到Vim。我的操作系统必须停止!
tommcdo

2

您还可以使用:oldfiles来获取已编辑文件的列表。

该列表将具有与文件名关联的数字。选择一个文件,记下数字(例如14),然后使用:edit #<14

您还可以在该文件上运行其他命令,或一次将多个文件传递给一个命令。更多关于此HERE


1
链接中的另一个答案教会了我:bro[wse] ol[dfiles][!]
Steve
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.