I am writing a vim plugin in which I need to check if the current tab the user is 开发者_开发技巧looking at is empty. If it is not empty, like say the user is already viewing a buffer or has a couple of windows, then I want to create a new empty tab and work my plugin there. But if it is empty, I want to load my plugin without opening a new tab.
I couldn't find anything appropriate in the docs.
The only thing that I can think of for this is to use :windo
to iterate through all the windows in the current tab and check whether a file is loaded. Something like this:
function! TabIsEmpty() abort
" Remember which window we're in at the moment
let initial_win_num = winnr()
let win_count = 0
" Add the length of the file name on to count:
" this will be 0 if there is no file name
windo let win_count += len(expand('%'))
" Go back to the initial window
exe initial_win_num . "wincmd w"
" Check count
if win_count == 0
" Tab page is empty
return 1
else
return 0
endif
endfunction
" Test it like this:
echo TabIsEmpty()
" Use it like this:
if TabIsEmpty() == 1
echo "The tab is empty"
else
echo "The tab is not empty"
endif
If the only thing open is a help page or preview window or something like that, it will return 0, as those have a filename.
If you open a new tab and then split it, this still returns 1 because all windows have no filename.
Maybe I'm not understanding the question, but to check if a tab has no buffer do this:
if bufname("%") == ""
Let's assume that there are multiple windows in the tab, but all the windows' buffers are empty.
Maybe you'd like to say that this tab is NOT empty. If that's the case, we don't need to go through all the tabs. The following will work.
function! TabIsEmpty()
return winnr('$') == 1 && len(expand('%')) == 0 && line2byte(line('$') + 1) <= 2
endfunction
精彩评论