撤销在Vim中关闭的标签页

88

我在vim中关闭了一个选项卡,但马上意识到我需要再次打开它来查找某些内容。在Vim 7.2中有没有撤消关闭选项卡的方法?


这个能否移动到vi.stackexchange.com? - Sukima
嗨,这段vimscript和windowlayout插件可以完成任务:它重新打开你刚刚关闭的标签页并恢复你之前的窗口布局。 - Yann Thomas-Gérard
6个回答

156

你的文件可能仍然在缓冲区中打开:

:ls " get the buffer number
:tabnew +Nbuf " where N is the buffer number

例如,要重新打开缓冲区18:

:tabnew +18buf

5
:tabnew N 对我来说不起作用。我的做法是先使用 :tabnew 命令,然后再输入 :bN,其中的 N 是缓冲区编号。 - alf
@alfonso:命令是 :tabnew +Nbuf,其中 N 是缓冲区号。它必须以 + 开头,并以单词 "buf" 结尾。 - greyfade
5
@Greyfade 的意思举例:tabnew +18buf - Eric Hu
3
你甚至可以使用命令:vsp +[bufferNumber]buf,在我的Vim中帮助我重新打开已关闭的分屏。 - 3emad
4
这种方法不起作用的原因是+是行引用而不是缓冲区引用,需要使用#而不是+,例如使用:tabe #5来在新标签页中打开缓冲区5。 - Sukima
:tabnew 输入 :b 18(18是来自于 :ls 的数字) - itsnikolay

41
:tabnew#

在新标签页中重新打开最近关闭的文件


编辑:请使用greyfade的答案。我不喜欢我的答案,但我将保留它作为参考和有用的评论信息。


奇怪,似乎一开始它工作了,现在却打开了不相关的缓冲区。 - user755921
# 是当前窗口中最后编辑的文件。关闭一个标签页不会将该文件注册为备选项(#)。您必须通过缓冲区编号(:ls)查找它。 - Sukima
如果你是面向分裂编程的话,它的表现超出完美。 - Al.G.
错误提示:"E194:没有可替换 '#' 的备用文件名"。 - Scott Yang

12

我正在使用一个MRU(最近使用的文件)插件,这样我就可以编辑最近编辑过的30个文件。

以下是MRU插件元数据:

File: mru.vim
Author: Yegappan Lakshmanan (yegappan AT yahoo DOT com)
Version: 3.2   Last Modified:
September 22, 2008

使用方法

要列出和编辑 MRU 列表中的文件,您可以使用“:MRU”命令。 “:MRU” 命令会在 Vim 的临时窗口中显示 MRU 文件列表。如果 MRU 窗口已经打开,则对窗口中显示的 MRU 列表进行刷新。


5
你能总结一下基本用法吗? - Ciro Santilli OurBigBook.com
我不理解这个答案... 这似乎在推荐使用插件? - Martin Tournoij
@Carpetsmoker 是的,它就是:mru.vim。 - trusktr
如果您刚刚在选项卡中打开了10个文件,并切换到其中一个中间文件,然后关闭它,那么MRU就不是很有用了。因为MRU将按照它们被打开的顺序显示最近打开的10个文件,当然您可能已经打开了更多的文件并且会迷失方向,需要自己进行比较。 - elig

6

简单的答案是不行,没有内置的功能。

但一个可行的解决方案是使用像BufExplorer这样的插件。由于它默认按最近使用的缓冲区列表排序,重新打开一个关闭的标签页只需按下\bet即可。


正如Lucia所提到的,你需要先按下<leader>be<Down>t才能使其起作用。 - Ciro Santilli OurBigBook.com

1

使用插件Ben建议的:BufExplorer Github Mirror

在他的答案中,你需要按下<Leader>be<Down>t。添加一个快捷键:

map <silent><leader>t <leader>be<Down>t

因此,只需使用 <leader>t 即可完成工作。

1
如果有"BufferClose"事件,那么这将很容易...但似乎不可能,因为不能创建窗口。但在标签页的情况下,我们可以通过保持标签计数并计算"TabLeave"和"TabEnter"之间的差异来检测标签是否已关闭。
用法:<leader>tr会在新标签页上重新打开最后一个关闭的标签(假设标签只有单个缓冲区)。
let g:reopenbuf = expand('%:p')
function! ReopenLastTabLeave()
  let g:lastbuf = expand('%:p')
  let g:lasttabcount = tabpagenr('$')
endfunction
function! ReopenLastTabEnter()
  if tabpagenr('$') < g:lasttabcount
    let g:reopenbuf = g:lastbuf
  endif
endfunction
function! ReopenLastTab()
  tabnew
  execute 'buffer' . g:reopenbuf
endfunction
augroup ReopenLastTab
  autocmd!
  autocmd TabLeave * call ReopenLastTabLeave()
  autocmd TabEnter * call ReopenLastTabEnter()
augroup END
" Tab Restore
nnoremap <leader>tr :call ReopenLastTab()<CR>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接