У меня есть автокоманда, описанная здесь, в моем .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()