1

Я хотел бы знать, есть ли команда, которую я могу запустить в 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>

1 ответ1

2

Вы должны начать с определения "чистого буфера", поскольку в Vim такого нет. Можно создать "буфер очистки" с чем-то вроде:

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

так что вы можете проверить значение &buftype или &buflisted или любых других параметров.

Если этот "чистый буфер" был создан каким-либо сторонним плагином, у вас могут быть другие "крючки", такие как b:variable или что-то еще.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .