Quel est l'ordre des événements WinEnter, BufEnter, BufRead, Syntax, FileType?

16

J'ai parcouru l' autocmd.txtaide, mais les informations à ce sujet sont dispersées et pas toujours présentes (par exemple avec BufRead).

Quelqu'un qui comprend bien cela pourrait-il énumérer l'ordre de ces événements - avec peut-être les conditions marquées entre parenthèses, comme

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

et ainsi de suite, pour une référence facile?

Remarque (copiée à partir de mon propre commentaire ci-dessous) : Je ne parle pas d'explications individuelles à leur sujet, qui sont OK, mais de la façon dont ils interagissent les uns avec les autres et dans quel ordre ils se produisent. Par exemple., WinEnterDit "Vim exécute les autocommandes BufEnter après les autocommandes WinEnter", TabEnterdit "Après avoir déclenché WinEnter et avant de déclencher l'événement BufEnter", tout est dispersé comme ceci dans de nombreux endroits. Et parfois, ce n'est pas du tout mentionné (par exemple, BufReadne mentionne pas s'il fonctionne après BufEnter ou avant - peut-être qu'un expert peut le déduire à partir d'autres informations là-bas, mais je ne peux pas.
Donc, mon intention ici est de créer une référence unique et simple pour l'ordre de ces événements qui peut être consultée rapidement par des non-experts,autocmd spécifications de l'événement.

Sundar - Rétablir Monica
la source
Je pense que la plupart des explications sont OK, pouvez-vous donner une liste de celles que vous ne pouvez pas comprendre?
nobe4
@ Nobe4 Je ne parle pas d'explications individuelles d'eux, qui sont en effet OK, mais de la façon dont ils interagissent les uns avec les autres et dans quel ordre ils se produisent. Par exemple., WinEnterDit "Vim exécute les autocommandes BufEnter après les autocommandes WinEnter", TabEnterdit "Après avoir déclenché WinEnter et avant de déclencher l'événement BufEnter", tout est dispersé comme ceci dans de nombreux endroits. Et parfois, cela n'est pas du tout mentionné (par exemple, BufReadne mentionne pas s'il fonctionne après BufEnter ou avant - peut-être qu'un expert peut le déduire d'une autre information là-bas, mais je ne peux pas.
Sundar - Réinstallez Monica
Donc, mon intention ici est de créer une référence simple et simple pour l'ordre de ces événements qui peut être consultée rapidement par des non-experts, afin d'être plus précis dans nos autocmdspécifications d'événements.
sundar
OK, je n'ai pas compris la question. Vous pouvez essayer de consigner chaque événement et voir l'ordre d'apparition (je peux faire une réponse si vous le souhaitez)
nobe4
Votre intention est en fait de demander à quelqu'un de fournir une référence aussi simple, pas d'en créer une (vous-même);)
VanLaser

Réponses:

11

Pour compléter la réponse @sundar:

Vous pouvez enregistrer l'ordre des événements simplement avec une fonction de journalisation:

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

Voir le fichier complet ici: https://gist.github.com/nobe4/aa8313fe98ca8821afad

Vous pouvez alors tail -f loget vous obtenez une activité d'événements d'autocommande en temps réel.

nobe4
la source
3
J'ai fait un plugin simple pour cela, voir ici .
Karl Yngve Lervåg
6
Notez que @ KarlYngveLervåg a déplacé son plugin vers un autre chemin . Merci Karl!
Luc Hermitte
Merci d'avoir remarqué et commenté, Luc! (Remarque: je ne peux pas mettre à jour mon commentaire pour corriger le lien mort, désolé!)
Karl Yngve Lervåg
10

J'ai essayé de googler pour cela avec différents ensembles de mots clés, et j'ai trouvé l'or sur une telle tentative avec ce résultat: http://www.ibm.com/developerworks/library/l-vim-script-5/

Plus précisément, cette partie est pertinente pour la question actuelle:

Par exemple, si vous démarrez Vim, modifiez un fichier nommé demo.txt, passez en mode Insertion, saisissez du texte, enregistrez le fichier, puis quittez, votre session Vim reçoit une série d'événements comme ce qui est indiqué dans le listing 1.

Listing 1. Séquence d'événements dans une simple session d'édition Vim

> vim

  1. BufWinEnter (créer une fenêtre par défaut)
  2. BufEnter (créer un tampon par défaut)
  3. VimEnter (démarrer la session Vim) : éditez demo.txt
  4. BufNew (créer un nouveau tampon pour contenir demo.txt)
  5. BufAdd (ajoutez ce nouveau tampon à la liste des tampons de la session)
  6. BufLeave (quitter le tampon par défaut)
  7. BufWinLeave (quitter la fenêtre par défaut)
  8. BufUnload (supprimer le tampon par défaut de la liste des tampons)
  9. BufDelete (désallouer le tampon par défaut)
  10. BufReadCmd (lire les contextes de demo.txt dans le nouveau tampon)
  11. BufEnter (activer le nouveau tampon)
  12. BufWinEnter (activer la nouvelle fenêtre du tampon) i
  13. InsertEnter (swap en mode Insertion)

Ce n'est pas encore tout à fait complet (par exemple, aucune mention de BufReadaka BufReadPost, mais je suppose que cela viendrait après BufReadCmd), mais c'est un excellent début.

Une information manquante cruciale est cependant la façon dont les événements FileTypeet Syntaxautocmd interagissent avec cela (en supposant filetypeet syntaxsont déjà activés , et un nouveau fichier est ouvert dont le type de fichier et la syntaxe sont connus de Vim).

Sundar - Rétablir Monica
la source
7
Cela n'est vrai que lorsque vous modifiez un seul fichier. Contrairement à la croyance populaire, l'ordre d'application des autocmds sur plusieurs fichiers n'est pas bien défini. Et même avec un seul fichier, la commande a changé plusieurs fois avec la version de Vim. Les problèmes que cela peut (et font) causer aux plugins ont été discutés à mort sur vim_dev, et la conception globale ne changera pas dans un avenir prévisible. Quant à obtenir une compréhension globale , eh bien, il y a 139 occurrences de apply_autocmdsdans les sources de Vim 7.4.827. Bonne chance avec ça.
Sato Katsura du
@SatoKatsura C'est le genre d'avis d'expert que je recherchais, merci! Y a-t-il une référence que vous pouvez suggérer pour en savoir plus à ce sujet (à part plonger dans les sources de Vim)? En outre, cela pourrait être entièrement hors de votre domaine d'intérêt, mais avez-vous une idée si les choses sont mieux définies dans le pays «Neovim»?
sundar
Je crains de ne connaître aucune référence définitive. autocmds dans Vim sont un gâchis, je ne pense pas qu'il soit réellement possible d'écrire une référence définitive, à l'exception de quelques cas simples. Je suppose que tout le monde se contente de "généralement travailler" et hausse les épaules quand ce n'est pas le cas. Quant aux neovim, j'ai personnellement des sentiments mitigés sur le projet. Je n'ai pas regardé le code récemment; Je suppose que vous pouvez obtenir une réponse sur leur traqueur de problème.
Sato Katsura
Le terme "événement" lui-même devrait également renverser l'idée d'un ordre trop fixe.
VanLaser