vim: `:q` вместо `:bdelete`, когда указан только один буфер

#vim

#vim

Вопрос:

Я хочу использовать ярлык ( ,q ) для удаления буферов, которые мне не нужны, но я хочу использовать тот же ярлык для выхода из vim, когда текущий буфер является единственным буфером, указанным.

В настоящее время я использую эту функцию:

 function! MyClose()
    " :q if at most one buffer is loaded
    " :bdelete otherwise
    let bufcount = len(filter(range(1,bufnr('$')), 'buflisted(v:val)==1'))
    if bufcount < 2
        exe ":q"
    else
        exe ":bdelete"
    endif
endfunction
  

и затем

 nnoremap <leader>q :call MyClose()<cr>
  

но я чувствую, что делаю это неправильно.

  • Есть ли лучший способ подсчитать перечисленные буферы?
  • Есть ли лучший способ добиться этой функциональности?

Ответ №1:

Вы правы, вы могли бы использовать

:справка tabpagebuflist

Чтобы получить список всех существующих буферов, выполните

 tablist = []
for i in range(tabpagenr('$'))
   call extend(tablist, tabpagebuflist(i   1))
endfor
  

В этом случае вам нужно будет проверить наличие буферов только на текущей вкладке, потому что выполнение :q просто закроет вкладку