autocmd 가 있고 BufWritePost
버퍼에 쓸 때마다 이를 실행하고 싶습니다.하지만Vim이 종료되려고 할 때.
이 변수는 v:dying
신호로 인해 Vim이 살아 있는지 여부만 나타내기 때문에 실제로 도움이 되지 않습니다. 그러나 나는 또한 정상적인 종료도 감지하고 싶습니다. 그래서 나는 다음과 같은 것을 찾고 있습니다.
au BufWritePost * if ! s:do_we_quit() | Neomake | endif
s:do_we_quit()
하지만 지금까지 나는 테스트를 작성하는 방법을 모릅니다 .
문맥::Neomake
autocmd는 내 파일에 대해 구문 검사 및 린터 실행을 호출 하고 이를 빠른 수정/위치 목록에 로드합니다. 하지만 이는 분명히 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( QuitPre
Vim 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
(이것은 원래 문제에 대한 해결책이었지만 문제 자체는 아닙니다.)