Qual è l'ordine degli eventi WinEnter, BufEnter, BufRead, Syntax, FileType?


16

Ho autocmd.txtconsultato l' aiuto, ma le informazioni al riguardo sono sparse e non sempre presenti (ad es. Con BufRead).

Qualcuno che capisce bene questo potrebbe elencare l'ordine di questi eventi - con forse le condizioni segnate in parentesi, come

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

e così via, per un facile riferimento?

Nota (copiata dal mio commento qui sotto) : non sto parlando di spiegazioni individuali di loro, che sono OK, ma di come interagiscono tra loro e in quale ordine si verificano. Ad esempio, WinEnterdice "Vim esegue i autocomandi BufEnter dopo gli autocomandi WinEnter", TabEnterdice "Dopo aver attivato WinEnter e prima di attivare l'evento BufEnter", è tutto sparso in questo modo in molti punti. E a volte non è affatto menzionato (ad esempio BufRead, non menziona se corre dopo BufEnter o prima - forse un esperto può inferirlo da qualche altra informazione lì, ma non posso.
Quindi, il mio intento è quello di creare un riferimento unico e semplice per l'ordine di questi eventi che può essere consultato rapidamente dai non esperti,autocmd specifiche dell'evento.


Penso che la maggior parte delle spiegazioni siano OK, puoi dare un elenco di quelle che non riesci a capire?
nobe4,

@ Nobe4 Non sto parlando di spiegazioni individuali su di loro, che sono davvero OK, ma di come interagiscono tra loro e in quale ordine si verificano. Ad esempio, WinEnterdice "Vim esegue i autocomandi BufEnter dopo gli autocomandi WinEnter", TabEnterdice "Dopo aver attivato WinEnter e prima di attivare l'evento BufEnter", è tutto sparso in questo modo in molti punti. E a volte non è affatto menzionato (ad esempio BufRead, non menziona se corre dopo BufEnter o prima - forse un esperto può inferirlo da qualche altra informazione lì, ma non posso.
Sundar - Reinstate Monica

Quindi, il mio intento qui è quello di creare un unico, semplice riferimento per l'ordine di questi eventi che può essere consultato rapidamente dai non esperti, al fine di essere più precisi nelle nostre autocmdspecifiche dell'evento.
Sundar - Ripristina Monica il

OK, non ho capito la domanda. Puoi provare a registrare tutti gli eventi e vedere l'ordine di apparizione (posso fare una risposta se vuoi)
nobe4

Il tuo intento è in realtà chiedere a qualcuno che fornisce un riferimento così semplice, non crearne uno (te stesso);)
VanLaser

Risposte:


11

Per completare la risposta @sundar:

È possibile registrare l'ordine degli eventi semplicemente con una funzione di registrazione:

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

Vedi il file completo qui: https://gist.github.com/nobe4/aa8313fe98ca8821afad

È quindi possibile tail -f loge ottenere un'attività di eventi di autocommand in tempo reale.


3
Ho creato un semplice plugin per questo, vedi qui .
Karl Yngve Lervåg,

6
Nota che @ KarlYngveLervåg ha spostato il suo plugin in un altro percorso . Grazie a Karl!
Luc Hermitte,

Grazie per aver notato e commentato, Luc! (Nota: non posso aggiornare il mio commento per correggere il link non funzionante, scusate!)
Karl Yngve Lervåg,

10

Ho provato a cercarlo su Google con diversi set di parole chiave e ho ottenuto l'oro in uno di questi tentativi con questo risultato: http://www.ibm.com/developerworks/library/l-vim-script-5/

In particolare, questa parte è pertinente alla domanda attuale:

Ad esempio, se avvii Vim, modifica un file chiamato demo.txt, passa alla modalità Inserisci, digita del testo, salva il file e quindi esci, la tua sessione Vim riceve una serie di eventi come quello mostrato nel Listato 1.

Elenco 1. Sequenza di eventi in una semplice sessione di editing di Vim

> vim

  1. BufWinEnter (crea una finestra predefinita)
  2. BufEnter (crea un buffer predefinito)
  3. VimEnter (avvia la sessione di Vim) : modifica demo.txt
  4. BufNew (crea un nuovo buffer per contenere demo.txt)
  5. BufAdd (aggiungi quel nuovo buffer all'elenco dei buffer della sessione)
  6. BufLeave (esce dal buffer predefinito)
  7. BufWinLeave (esce dalla finestra predefinita)
  8. BufUnload (rimuove il buffer predefinito dall'elenco dei buffer)
  9. BufDelete (dealloca il buffer predefinito)
  10. BufReadCmd (leggi i contesti di demo.txt nel nuovo buffer)
  11. BufEnter (attiva il nuovo buffer)
  12. BufWinEnter (attiva la finestra del nuovo buffer) i
  13. InsertEnter (passare alla modalità Inserisci)

Non è ancora del tutto completo (ad es. Nessuna menzione di BufReadaka BufReadPost, ma suppongo che verrà dopo BufReadCmd), ma è un inizio eccellente.

Un'informazione cruciale mancante però è come gli eventi FileTypee Syntaxautocmd interagiscono con questo (supponendo filetypeche syntaxsiano già attivi e viene aperto un nuovo file il cui tipo di file e sintassi sono noti a Vim).


7
Questo è vero solo quando stai modificando un singolo file. Contrariamente alla credenza popolare, l'ordine di applicazione di autocmdpiù file non è ben definito. E anche con un singolo file, l'ordine è cambiato alcune volte con la versione di Vim. I problemi che questo (e può) causare ai plug-in sono stati discussi a morte su vim_dev e il design generale non cambierà in un futuro prevedibile. Per quanto riguarda la comprensione globale , beh, ci sono 139 occorrenze di apply_autocmdsnelle fonti per Vim 7.4.827. Buona fortuna.
Sato Katsura,

@SatoKatsura Questo è il tipo di opinione di esperti che stavo cercando, grazie! C'è qualche riferimento che puoi suggerire per saperne di più su questo (oltre alle immersioni nelle fonti di Vim)? Inoltre, questo potrebbe essere completamente fuori dalla tua area di interesse, ma hai idea se le cose sono meglio definite nella terra dei "Neovim"?
Sundar - Ripristina Monica il

Temo di non conoscere alcun riferimento definitivo. autocmds in Vim sono un disastro, non credo sia effettivamente possibile scrivere un riferimento definitivo, tranne per alcuni semplici casi. Suppongo che tutti si accontentino di "di solito funziona", e scrolla le spalle quando non lo fa. Per quanto riguarda Neovim, ho personalmente sentimenti contrastanti riguardo al progetto. Non ho guardato il codice di recente; Suppongo che tu possa ottenere una risposta sul loro tracker dei problemi.
Sato Katsura,

Anche il termine "evento" stesso dovrebbe sovvertire l'idea di un ordine troppo fisso.
VanLaser,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.