Detectar se o Vim sairá de dentro de um autocmd

0

Eu tenho um BufWritePost autocmd que eu quero executar toda vez quando um buffer é escrito mas não quando o Vim está prestes a sair.

A variável v:dying realmente não ajuda, pois apenas indica se o Vim existe devido a um sinal, mas eu também quero detectar o desligamento normal. Então eu estou procurando por alguma coisa ao longo das linhas de

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

mas a partir de agora não tenho ideia de como escrever o teste s:do_we_quit() .

Contexto: O autocmd apenas chama :Neomake para executar verificações de sintaxe e linters em meus arquivos e carregá-los na lista de correções rápidas / locais. Mas isso obviamente só faz sentido em :w e não em :wq . Normalmente, Neomake funciona de forma assíncrona, mas ao sair, parece-me que o vim trava e espera por Neomake e, de alguma forma, acaba em um loop infinito.

    
por Lucas 24.02.2017 / 10:44

2 respostas

1

Você está procurando por QuitPre :

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

Isso pressupõe que você esteja executando um Vim decentemente recente ( QuitPre foi adicionado no Vim 7.3.544).

Você provavelmente deve postar um relatório de bug sobre o loop infinito.

    
por 24.02.2017 / 11:16
0

Com base na resposta de Sato, descobri o seguinte:

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 precisa ser redefinido após fechar uma janela, caso contrário, Neomake não será executado no próximo :w em qualquer lugar.
  • Não consigo verificar o número da janela em QuitPre , pois pode ser qualquer coisa se eu :wqa
  • também eu realmente não quero correr Neomake se eu fechar uma janela, pois eu posso fechar todas as janelas posteriores logo depois (antes que Neomake termine) e então Neovim ainda irá travar

Atualização 1

O NeoVim também fornece v:exiting , mas ainda não está definido no momento em que BufWritePost é acionado.

Atualização 2

O Neomake agora fornece um comando NeomakeCancelJobs para que o problema original seja resolvido com o cancelamento forçado de todos os trabalhos em execução em VimLeave :

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

(Esta é uma solução para o meu problema original, mas não a questão.)

    
por 26.02.2017 / 10:07

Tags