Я хотел бы знать, есть ли команда, которую я могу запустить в vim, чтобы сказать, является ли конкретное окно, которое имеет фокус, фактически буфером нуля или пустым буфером (например, при создании нового буфера, который я не сохранил в файл) еще).
Фон, почему я хочу сделать это:
У меня есть особая контекстно-зависимая функция, связанная с моей клавишей Tab в Vim, и я хотел бы еще больше улучшить ее, позволив ей пропускать чистые буферы, но не несохраненные буферы новых файлов. Я знаю, что @%
может получить мне файл, который поддерживает буфер, но в обоих случаях он пуст.
Мой текущий код выглядит так:
function! NextWindowOrTabOrBuffer()
" prefer to cycle thru only the set of windows if more than one window
if (winnr('$') == 1 && tabpagenr('$') == 1)
" only situation where we cycle to next buffer
bnext
endif
" Rest of logic is just as sound (and simple) as it ever was
if (winnr() == winnr('$'))
tabnext
1wincmd w "first window
else
wincmd w "next window
endif
endfunc
function! PrevWindowOrTabOrBuffer()
if (winnr('$') == 1 && tabpagenr('$') == 1)
" only situation where we cycle to next buffer
bprev
endif
if (winnr() == 1)
tabprev
let winnr = winnr('$')
exec winnr . 'wincmd w'
else
wincmd W
endif
endfunc
" I actually like the mash tab to cycle windows behavior so let's keep it simple
"nnoremap <Tab> :wincmd w<CR>
"nnoremap <S-Tab> :wincmd W<CR>
" Nevermind, I actually really need this on a small screen...
nnoremap <Tab> :call NextWindowOrTabOrBuffer()<CR>
nnoremap <S-Tab> :call PrevWindowOrTabOrBuffer()<CR>