可能的困難是沒有 TabClose 事件,既有的 TabLeave 和 TabEnter 要判斷 tab 關閉又有點麻煩。例如開了 4 個 tab,關閉 tab 3 時,會進入 TabLeave,再 TabEnter 到 tab 4,這時 tabpagenr()
還是 4 —— 也就是會先進旁邊的 tab,TabEnter 事件後 tab 總數才會減少,而不是先關閉 tab 再移動。
雖然沒想出不同角度的解法,但以下 function 也算達到目的:
function LastTab(act)
let lt = g:lasttab
let tabClosed = tabpagenr('$') < lt.knownLength ? 1 : 0
if a:act ==# 'TabLeave'
if ! tabClosed
let lt.prevLeave = lt.leave
elseif lt.prevLeave > tabpagenr()
let lt.prevLeave -= 1
endif
let lt.leave = tabpagenr()
elseif a:act ==# 'switch'
if tabClosed
let lastTab = lt.prevLeave > tabpagenr() ? lt.prevLeave -1 : lt.prevLeave
else
let lastTab = lt.leave
endif
if lastTab == tabpagenr()
echo 'Already on last tab.'
else
exe "tabn " . lastTab
endif
endif
let lt.knownLength = tabpagenr('$')
endfunction
if ! exists('g:lasttab')
let g:lasttab = {'leave':1, 'prevLeave':1, 'knownLength':1}
endif
au TabLeave * :call LastTab('TabLeave')
au TabEnter * :call LastTab('TabEnter')
nnoremap <LocalLeader>t :call LastTab('switch')<CR>
inoremap <LocalLeader>t <C-\><C-N>:call LastTab('switch')<CR>
這段放到 .vimrc,之後按 <LocalLeader>t 就能切換至最後選取的分頁了。
不過剛進入 Vim 時,第一次切換會跳到第一個 tab。