开发者

Check if current tab is empty in Vim

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
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜