É possível diferenciar entre um buffer de rascunho e um novo buffer [no name]?

1

Eu gostaria de saber se existe um comando que eu possa rodar no vim para dizer se uma janela em particular que tem foco é na verdade um buffer Scratch ou um buffer vazio (como ao criar um novo buffer que não salvei para um arquivo ainda).

O pano de fundo de por que quero fazer isso:

Eu tenho uma função especial sensível ao contexto ligada à minha tecla Tab no Vim, e gostaria de melhorá-la ainda mais, permitindo que ela ignore os buffers de rascunho, mas não os novos buffers de arquivo não salvos. Eu sei que @% pode me pegar o arquivo que faz o buffer, mas isso está vazio em ambos os casos.

Meu código atual é assim:

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>
    
por Steven Lu 16.12.2014 / 21:46

1 resposta

2

Você deve começar definindo "buffer de rascunho", já que não existe tal coisa no Vim. Pode-se criar um "buffer de rascunho" com algo como:

:vnew | setlocal nobuflisted buftype=nofile bufhidden=wipe noswapfile

para que você possa verificar o valor de &buftype ou &buflisted ou qualquer / todas as outras opções.

Se esse "buffer temporário" tiver sido criado por algum plug-in de terceiros, você poderá ter outros "ganchos" à sua disposição, como b:variable ou qualquer outra coisa.

    
por 16.12.2014 / 23:33

Tags