Vim이 autocmd를 종료하는지 감지

Vim이 autocmd를 종료하는지 감지

autocmd 가 있고 BufWritePost버퍼에 쓸 때마다 이를 실행하고 싶습니다.하지만Vim이 종료되려고 할 때.

이 변수는 v:dying신호로 인해 Vim이 살아 있는지 여부만 나타내기 때문에 실제로 도움이 되지 않습니다. 그러나 나는 또한 정상적인 종료도 감지하고 싶습니다. 그래서 나는 다음과 같은 것을 찾고 있습니다.

au BufWritePost * if ! s:do_we_quit() | Neomake | endif

s:do_we_quit()하지만 지금까지 나는 테스트를 작성하는 방법을 모릅니다 .

문맥::Neomakeautocmd는 내 파일에 대해 구문 검사 및 린터 실행을 호출 하고 이를 빠른 수정/위치 목록에 로드합니다. 하지만 이는 분명히 on :w이 아닌 on 에서만 의미가 있습니다 :wq. 일반적으로 비동기식으로 작동하지만 vim이 종료할 때 멈추고 대기 하다가 어떻게든 무한 루프에 빠지게 되는 Neomake것 같습니다 .Neomake

답변1

당신이 찾고있는 QuitPre:

let s:quitting = 0
autocmd QuitPre      * let s:quitting = 1
autocmd BufWritePost * if ! s:quitting | Neomake endif

이는 최근 Vim( QuitPreVim 7.3.544에 추가됨)을 실행하고 있다고 가정합니다.

무한 루프에 대한 버그 보고서를 게시해야 할 것입니다.

답변2

Sato의 답변을 바탕으로 나는 이것을 생각해 냈습니다.

let s:quitting = 0
autocmd BufWritePost *
    \ if ! s:quitting                             |
    \   Neomake                                   |
    \ elseif tabpagenr('$') > 1 || winnr('$') > 1 |
    \   let s:quitting = 0                        |
    \ endif
autocmd QuitPre * let s:quitting = 1
  • s:quitting창을 닫은 후 재설정해야 합니다. 그렇지 않으면 다음 단계에서 실행 Neomake되지 않습니다 .:w
  • 창구번호는 확인이 안 돼요 QuitPre.:wqa
  • 또한, 하나의 창을 닫으면 실행하고 싶지 않습니다. Neomake왜냐하면 작업을 마친 직후에 다른 모든 창을 닫을 것이기 때문입니다. Neomake그러면 Neovim은 여전히 ​​중단될 것입니다.

업데이트 1

NeoVim도 이를 제공하지만 v:exiting트리거될 때 아직 설정되지 않았습니다.BufWritePost

업데이트 2

NeomakeCancelJobs이제 Neomake는 실행 중인 모든 작업을 강제로 취소하여 원래 문제를 해결하는 명령을 제공합니다 VimLeave.

augroup LucNeoMake
  autocmd!
  autocmd BufWritePost * Neomake
  autocmd VimLeave * NeomakeCancelJobs
augroup END

(이것은 원래 문제에 대한 해결책이었지만 문제 자체는 아닙니다.)

관련 정보