在 Vim 中撤消关闭选项卡

我在 vim 中关闭了一个标签,并立即意识到我需要重新打开它。在 Vim 7.2中有没有撤消关闭选项卡的方法?

17807 次浏览

Simple answer is no, there is nothing built-in.

But a workable solution would be to use a plug-in like the excellent BufExplorer. Since it defaults to listing the most recently used buffers first, reopening a closed tab would be as simple as pressing \bet

Your file is probably still open in a buffer:

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

To reopen buffer 18, for example:

:tabnew +18buf

I'm using an MRU (most recently used files) plugin. So I can edit the last 30 files I've just edited

Here are the MRU plugin metadata:

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

Usage

To list and edit files from the MRU list, you can use the ":MRU" command. The ":MRU" command displays the MRU file list in a temporary Vim window. If the MRU window is already opened, then the MRU list displayed in the window is refreshed.

Use the plug-in Ben Suggested: BufExplorer Github Mirror

In his answer one would have to press <Leader>be<Down>t. Adding a bit shortcut:

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

So that simply <leader>t would do the work.

:tabnew#

Reopens recently closed file in new tab


Edit: Please use greyfade's answer. I don't like my answer, but I'm keeping it here for references and useful comment info.

If there were a BufferClose event this would be easy... but it seems that it is not possible since it is not possible for window creation.

But in the case of tabs we can detect if a tab was closed by keeping a tab count and counting the difference between TabLeave and TabEnter.

Usage: <leader>tr reopens the last closed tab on a new tab (supposing the tab had only a single buffer):

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>