Как я могу выполнить команду, когда буфер закрыт в vim? - PullRequest
3 голосов
/ 06 октября 2009

Есть ли в vim / vimscript что-то вроде защелки закрытия окна, чтобы я мог вызывать функцию каждый раз, когда окно закрывается?

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

Если у вас есть идеи, как этого добиться без крючка, это будет так же хорошо.

редактирование: Я знаю о :qa[ll], но я ленивый и хочу только набрать :q или ZZ.

edit2.71828183: Я принял ответ автокоманды, так как он был ближе всего к исходному вопросу, но нашел другое решение в использовании окна предварительного просмотра вместо разделенного окна. Окно предварительного просмотра автоматически закрывается при закрытии последнего «нормального» окна ..

Ответы [ 4 ]

2 голосов
/ 06 октября 2009

автокоманды потрясающие! Я почти уверен, что в этом случае BufLeave выполнит эту работу, но вы, возможно, захотите BufWinLeave? Посмотрите на :help autocmd-events полный список событий.

Другой момент, который вас волнует: вы можете использовать локальные для буфера автокоманды! (:help autocmd-buflocal)

Вы можете определить один для текущего буфера, используя au BufLeave <buffer> .... Мое лучшее предположение состоит в том, что вы можете запустить это в любой команде, создающей окно царапин. Вы должны иметь возможность кэшировать номер буфера рабочего окна в глобальную переменную при открытии рабочего окна, тогда ваша автокоманда может просто удалить этот буфер (:help :bdelete).

au BufLeave <buffer> bdelete g:scratch_buffer
call CreateScratchWindow()

function CreateScratchWindow() {
    ...
    let g:scratch_buffer = bufnr("")
}

Также есть функция winbufnr для получения номеров буферов по окнам. Вы можете использовать любой из них - просто убедитесь, что чистое окно / буфер актуален, когда вы его используете! («» Означает текущее окно / буфер).

0 голосов
/ 21 января 2017

Хорошо, не совсем новый вопрос, но я нашел его в поиске того, что я теперь знаю, BufWinLeave. Однако сценарий, который описывает автор, - это то, что у меня есть в моем vimrc с NerdTree, например. когда последний буфер закрыт, я хочу, чтобы vim закрыл NerdTree «буфер» и затем вышел.

autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTree") && b:NERDTree.isTabTree()) | q | endif

Заменить специфический материал NERDTree на способ идентификации буфера scratch.

0 голосов
/ 06 октября 2009

Добавить сопоставление.

:nnoremap :q :qa

тогда, если вы хотите использовать :q один день, вы можете просто

:qa<backspace>

и обычно вы можете просто

:q<enter>

и получите

:qa<enter>

бесплатно.

0 голосов
/ 06 октября 2009

Вы можете использовать

:quitall

или

:qall

чтобы закрыть все окна одновременно.

добавьте !, если хотите игнорировать несохраненные изменения.

:qall!
...