Qual é a ordem dos eventos WinEnter, BufEnter, BufRead, Syntax, FileType?

16

Passei pela autocmd.txtajuda, mas as informações sobre isso estão dispersas e nem sempre estão presentes (por exemplo, com BufRead).

Alguém que entende isso bem pode listar a ordem desses eventos - talvez com as condições marcadas entre parênteses, como

WinEnter   
BufEnter (if this window is for a different buffer than the current)

e assim por diante, para fácil referência?

Nota (copiada do meu próprio comentário abaixo) : Não estou falando de explicações individuais sobre elas, o que é bom, mas sobre como elas interagem umas com as outras e em que ordem elas acontecem. Por exemplo, WinEnterdiz "O Vim executa os comandos automáticos do BufEnter após os comandos automáticos do WinEnter", TabEnterdiz "Depois de acionar o WinEnter e antes de acionar o evento BufEnter", está tudo espalhado dessa maneira em muitos lugares. E às vezes isso não é mencionado (por exemplo BufRead, não menciona se é executado após o BufEnter ou antes - talvez um especialista possa inferir isso de alguma outra informação lá, mas eu não posso.
Portanto, minha intenção aqui é crie uma referência única e simples para a ordem desses eventos que pode ser consultada rapidamente por não especialistas,autocmd especificações de eventos.

sundar - Restabelecer Monica
fonte
Acho que a maioria das explicações está correta, você pode dar uma lista das que não consegue entender?
precisa saber é o seguinte
@ Nobe4 Não estou falando de explicações individuais sobre elas, que são realmente aceitáveis, mas sobre como elas interagem umas com as outras e em que ordem elas acontecem. Por exemplo, WinEnterdiz "O Vim executa os comandos automáticos do BufEnter após os comandos automáticos do WinEnter", TabEnterdiz "Depois de acionar o WinEnter e antes de acionar o evento BufEnter", está tudo espalhado dessa maneira em muitos lugares. E às vezes isso não é mencionado (por exemplo BufRead, não menciona se é executado após o BufEnter ou antes - talvez um especialista possa inferir isso de alguma outra informação lá, mas eu não posso.
sundar - Reinstate Monica
Portanto, minha intenção aqui é criar uma referência única e simples para a ordem desses eventos que possa ser consultada rapidamente por não especialistas, a fim de ser mais preciso em nossas autocmdespecificações de eventos.
sundar - Restabelece Monica
OK, eu não entendi a pergunta. Você pode tentar registrar cada evento, e ver a ordem de aparecimento (I pode fazer uma resposta, se quiser)
nobe4
Sua intenção é realmente para perguntar sobre alguém proporcionando dessa referência simples, não criar um (mesmo);)
VanLaser

Respostas:

11

Para concluir a resposta @sundar:

Você pode registrar a ordem dos eventos simplesmente com uma função de registro:

augroup EventLoggin
  autocmd!
  autocmd BufNewFile * call s:Log('BufNewFile')
  autocmd BufReadPre * call s:Log('BufReadPre')
  ...
  autocmd User * call s:Log('User')
augroup END

function! s:Log(eventName) abort
  silent execute '!echo '.a:eventName.' >> log'
endfunction

Veja o arquivo completo aqui: https://gist.github.com/nobe4/aa8313fe98ca8821afad

Você pode então tail -f logobter uma atividade de eventos de comando automático em tempo real.

nobe4
fonte
3
Eu fiz um plugin simples para isso, veja aqui .
Karl Yngve Lervåg
6
Observe que @ KarlYngveLervåg mudou seu plugin para outro caminho . Obrigado Karl!
Luc Hermitte 27/10
Obrigado por perceber e comentar, Luc! (Nota: Não consigo atualizar o meu comentário para corrigir o link morto, sorry!)
Karl Yngve Lervåg
10

Tentei pesquisar no Google com diferentes conjuntos de palavras-chave e encontrei ouro em uma dessas tentativas com este resultado: http://www.ibm.com/developerworks/library/l-vim-script-5/

Especificamente, esta parte é relevante para a pergunta atual:

Por exemplo, se você iniciar o Vim, edite um arquivo chamado demo.txt, troque para o modo Inserir, digite algum texto, salve o arquivo e saia, sua sessão do Vim receberá uma série de eventos como o que é mostrado na Listagem 1.

Listagem 1. Sequência de eventos em uma sessão de edição simples do Vim

> vim

  1. BufWinEnter (crie uma janela padrão)
  2. BufEnter (crie um buffer padrão)
  3. VimEnter (inicie a sessão do Vim) : edite demo.txt
  4. BufNew (crie um novo buffer para conter demo.txt)
  5. BufAdd (adicione esse novo buffer à lista de buffers da sessão)
  6. BufLeave (saia do buffer padrão)
  7. BufWinLeave (saia da janela padrão)
  8. BufUnload (remova o buffer padrão da lista de buffers)
  9. BufDelete (desalocar o buffer padrão)
  10. BufReadCmd (leia os contextos de demo.txt no novo buffer)
  11. BufEnter (ativa o novo buffer)
  12. BufWinEnter (ativa a nova janela do buffer) i
  13. InsertEnter (alterne para o modo Inserir)

Ainda não é totalmente abrangente (por exemplo, nenhuma menção a BufReadaka BufReadPost, mas suponho que viria depois BufReadCmd), mas é um excelente começo.

Uma peça que falta de informação crucial, porém, é como os FileTypee Syntaxeventos autocmd interagir com este (assumindo filetypee syntaxjá estão em, e um novo arquivo é aberto cujo filetype e sintaxe são conhecidos por Vim).

sundar - Restabelecer Monica
fonte
7
Isso só é verdade quando você está editando um único arquivo. Ao contrário da crença popular, a ordem de aplicação de autocmds em vários arquivos não está bem definida. E mesmo com um único arquivo, o pedido mudou algumas vezes com a versão do Vim. Os problemas que isso pode (e causa) para os plug-ins foram discutidos até a morte no vim_dev, e o design geral não será alterado no futuro previsível. Quanto à obtenção de um entendimento abrangente , bem, existem 139 ocorrências apply_autocmdsnas fontes do Vim 7.4.827. Boa sorte com isso.
Sato Katsura
@SatoKatsura Esse é o tipo de opinião de especialista que eu estava procurando, obrigado! Há alguma referência que você possa sugerir para aprender mais sobre isso (além de mergulhar nas fontes do Vim)? Além disso, isso pode estar totalmente fora da sua área de interesse, mas você tem alguma idéia se as coisas estão melhor definidas na terra dos 'Neovim'?
sundar - Restabelece Monica
Receio não ter nenhuma referência definitiva. autocmds no Vim são uma bagunça, acho que não é possível escrever uma referência definitiva, exceto em alguns casos simples. Suponho que todos concordem com "geralmente funciona" e encolhem os ombros quando isso não acontecer. Quanto ao neovim, eu pessoalmente tenho sentimentos mistos sobre o projeto. Eu não olhei o código recentemente; Suponho que você possa obter uma resposta sobre o rastreador de problemas.
Sato Katsura
Além disso, o próprio termo "evento" deve subverter a idéia de uma ordem muito fixa.
VanLaser