我想知道是否有一个可以在 vim 中运行的命令来判断具有焦点的特定窗口实际上是 Scratch 缓冲区还是空缓冲区(例如,在创建尚未保存到文件的新缓冲区时)。
我这样做的原因如下:
我在 Vim 中将一个特殊的上下文相关函数绑定到我的Tab键上,我想通过允许它跳过临时缓冲区而不是未保存的新文件缓冲区来进一步改进它。我知道这@%
可以让我得到支持缓冲区的文件,但在这两种情况下它都是空的。
我当前的代码如下:
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>
答案1
您应该首先定义“临时缓冲区”,因为 Vim 中没有这样的东西。可以使用以下代码创建“临时缓冲区”:
:vnew | setlocal nobuflisted buftype=nofile bufhidden=wipe noswapfile
&buftype
因此您可以检查或&buflisted
或任何/所有其他选项的值。
如果该“临时缓冲区”是由某些第三方插件创建的,那么您可能可以使用其他“钩子”,例如b:variable
或其他什么。