是否有可能区分临时缓冲区和新的 [无名称] 缓冲区?

是否有可能区分临时缓冲区和新的 [无名称] 缓冲区?

我想知道是否有一个可以在 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或其他什么。

相关内容