У меня есть автокоманда, описанная здесь, в моем .vimrc: https://superuser.com/a/669463/199803

РЕДАКТИРОВАТЬ: скопированы в основной вопрос для удобства:

function CountListedBuffers() 
     let cnt = 0 
     for nr in range(1,bufnr("$")) 
         if buflisted(nr) && ! empty(bufname(nr))
             let cnt += 1 
         endif 
     endfor 
     return cnt 
endfunction

function QuitIfLastBuffer()
     if CountListedBuffers() == 1
         :q
     endif
 endfunction

autocmd BufDelete * :call QuitIfLastBuffer()

Как ни странно, кажется, что если у меня ровно один буфер в списке и я пытаюсь использовать команду :help , окно справки не открывается (или, возможно, открывается и сразу же закрывается). Если я закомментирую эту строку автокоманды в моем .vimrc , это поведение больше не будет происходить.

Почему это происходит, и как я могу это исправить? Почему бы :h даже вызвать событие BufDelete ?

РЕДАКТИРОВАТЬ: установка многословия до уровня 12, я вижу, что событие BufDelete действительно происходит. Вот часть вывода, которая выглядит актуальной для меня:

Executing BufAdd Auto commands for "*"
autocommand call <SID>BMAdd()
calling function <SNR>6_BMAdd
calling function <SNR>6_BMAdd..<SNR>6_BMFilename
calling function <SNR>6_BMAdd..<SNR>6_BMFilename..<SNR>6_BMMunge
calling function <SNR>6_BMAdd..<SNR>6_BMFilename..<SNR>6_BMMunge..<SNR>6_BMTruncName
function <SNR>6_BMAdd..<SNR>6_BMFilename..<SNR>6_BMMunge..<SNR>6_BMTruncName returning '/usr/local/share/vim/vim74/doc'
continuing in function <SNR>6_BMAdd..<SNR>6_BMFilename..<SNR>6_BMMunge
function <SNR>6_BMAdd..<SNR>6_BMFilename..<SNR>6_BMMunge returning 'help\.txt\ (4)\^I/usr/local/share/vim/vim74/doc'
continuing in function <SNR>6_BMAdd..<SNR>6_BMFilename
calling function <SNR>6_BMAdd..<SNR>6_BMFilename..<SNR>6_BMHash
function <SNR>6_BMAdd..<SNR>6_BMFilename..<SNR>6_BMHash returning #340582286
continuing in function <SNR>6_BMAdd..<SNR>6_BMFilename
function <SNR>6_BMAdd..<SNR>6_BMFilename returning #0
continuing in function <SNR>6_BMAdd
function <SNR>6_BMAdd returning #0
continuing in BufAdd Auto commands for "*"
Executing BufDelete Auto commands for "*"
autocommand :call QuitIfLastBuffer()

1 ответ1

0

Попробуйте изменить

if buflisted(nr) && ! empty(bufname(nr))

в

if buflisted(nr) && ! empty(bufname(nr)) || getbufvar(nr, '&buftype') ==# 'help'

так что справочные буферы не запускают логику для выхода.

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