Wie ist die Reihenfolge der Ereignisse WinEnter, BufEnter, BufRead, Syntax, FileType?


16

Ich habe die autocmd.txtHilfe durchgesehen , aber die Informationen darüber sind verstreut und nicht immer vorhanden (z. B. mit BufRead).

Könnte jemand, der dies gut versteht, die Reihenfolge dieser Ereignisse auflisten - mit möglicherweise in Klammern angegebenen Bedingungen, wie z

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

und so weiter, als einfache Referenz?

Anmerkung (kopiert von meinem eigenen Kommentar unten) : Ich spreche nicht über einzelne Erklärungen von ihnen, die in Ordnung sind, sondern darüber, wie sie miteinander interagieren und in welcher Reihenfolge sie passieren. Zum Beispiel, WinEntersagt "Vim führt die BufEnter-Autobefehle nach den WinEnter-Autobefehlen aus", TabEntersagt "Nach dem Auslösen des WinEnter und vor dem Auslösen des BufEnter-Ereignisses", ist alles so an vielen Stellen verteilt. Und manchmal wird es überhaupt nicht erwähnt (zum Beispiel BufReadnicht, ob es nach oder vor BufEnter ausgeführt wird - vielleicht kann ein Experte es aus einer anderen Information ableiten, aber ich kann es nicht.
Also, meine Absicht hier ist es, Erstellen Sie eine einzige, einfache Referenz für die Reihenfolge dieser Ereignisse, die von Nicht-Experten schnell nachgeschlagen werden kann.autocmd Veranstaltungsspezifikationen.


Ich denke, die meisten Erklärungen sind in Ordnung. Können Sie eine Liste derjenigen geben, die Sie nicht verstehen können?
nobe4

@ Nobe4 Ich spreche nicht über einzelne Erklärungen von ihnen, die in der Tat in Ordnung sind, sondern darüber, wie sie miteinander interagieren und in welcher Reihenfolge sie passieren. Zum Beispiel, WinEntersagt "Vim führt die BufEnter-Autobefehle nach den WinEnter-Autobefehlen aus", TabEntersagt "Nach dem Auslösen des WinEnter und vor dem Auslösen des BufEnter-Ereignisses", ist alles so an vielen Stellen verteilt. Und manchmal ist es gar nicht (für zB erwähnt. BufReadNicht erwähnt , ob es nach BufEnter läuft oder vor - vielleicht ein Experte kann es aus einem anderen Stück Info dort schließen, aber ich kann nicht.
sundar - wieder einzusetzen Monica

Daher ist es meine Absicht, eine einzige, einfache Referenz für die Reihenfolge dieser Ereignisse zu erstellen, die von Nichtfachleuten schnell nachgeschlagen werden kann, um in unseren autocmdVeranstaltungsspezifikationen präziser zu sein .
Sundar - Wiedereinsetzung von Monica

OK, ich habe die Frage nicht verstanden. Sie können versuchen, jedes Ereignis zu protokollieren und die Reihenfolge des Auftretens
anzuzeigen

Ihre Absicht ist es tatsächlich, jemanden zu fragen, der eine so einfache Referenz bereitstellt, und nicht sich selbst.
VanLaser

Antworten:


11

So vervollständigen Sie die @ Sundar-Antwort:

Sie können die Reihenfolge der Ereignisse einfach mit einer Protokollierungsfunktion protokollieren:

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

Die vollständige Datei finden Sie hier: https://gist.github.com/nobe4/aa8313fe98ca8821afad

Sie können dann tail -f logund Sie erhalten eine Echtzeit-Autocommand-Ereignisaktivität.


3
Ich habe ein einfaches Plugin dafür erstellt, siehe hier .
Karl Yngve Lervåg

6
Beachten Sie, dass @ KarlYngveLervåg sein Plugin auf einen anderen Pfad verschoben hat . Vielen Karl!
Luc Hermitte

Danke, dass du es bemerkt und kommentiert hast, Luc! (Hinweis: Ich kann meinen Kommentar nicht aktualisieren, um den toten Link zu reparieren. Entschuldigung!)
Karl Yngve Lervåg

10

Ich habe versucht, dies mit verschiedenen Schlüsselwörtern zu googeln, und habe bei einem solchen Versuch Gold getroffen: http://www.ibm.com/developerworks/library/l-vim-script-5/

Insbesondere ist dieser Teil für die aktuelle Frage relevant:

Wenn Sie beispielsweise Vim starten, eine Datei mit dem Namen demo.txt bearbeiten, in den Einfügemodus wechseln, Text eingeben, die Datei speichern und dann beenden, erhält Ihre Vim-Sitzung eine Reihe von Ereignissen, wie sie in Listing 1 dargestellt sind.

Listing 1. Ereignissequenz in einer einfachen Vim-Editiersitzung

> vim

  1. BufWinEnter (Standardfenster erstellen)
  2. BufEnter (Standardpuffer erstellen)
  3. VimEnter (Starten der Vim-Sitzung) : Bearbeiten Sie die Datei demo.txt
  4. BufNew (einen neuen Puffer erstellen, der die Datei demo.txt enthält)
  5. BufAdd (diesen neuen Puffer zur Pufferliste der Sitzung hinzufügen)
  6. BufLeave (Standardpuffer verlassen)
  7. BufWinLeave (Standardfenster verlassen)
  8. BufUnload (Standardpuffer aus der Pufferliste entfernen)
  9. BufDelete (Freigabe des Standardpuffers)
  10. BufReadCmd (lies die Kontexte von demo.txt in den neuen Puffer)
  11. BufEnter (aktiviere den neuen Buffer)
  12. BufWinEnter (aktiviere das Fenster des neuen Puffers) i
  13. InsertEnter (Wechsel in den Einfügemodus)

Es ist immer noch nicht ganz umfassend (zB keine Erwähnung von BufReadaka BufReadPost, aber ich gehe davon aus, dass es danach kommen würde BufReadCmd), aber es ist ein ausgezeichneter Start.

Eine wichtige fehlende Information ist jedoch, wie die Ereignisse FileTypeund Syntaxautocmd damit interagieren (vorausgesetzt filetypeund syntaxbereits aktiviert, und eine neue Datei wird geöffnet, deren Dateityp und Syntax Vim bekannt sind).


7
Dies gilt nur, wenn Sie eine einzelne Datei bearbeiten. Entgegen der weit verbreiteten Meinung ist die Reihenfolge, in der autocmds auf mehrere Dateien angewendet wird, nicht genau definiert. Und selbst mit einer einzelnen Datei hat sich die Reihenfolge mit der Version von Vim ein paar Mal geändert. Die Probleme, die dies für Plugins verursachen kann (und tut), wurden auf vim_dev zu Tode diskutiert, und das Gesamtdesign wird sich in absehbarer Zukunft nicht ändern. Um ein umfassendes Verständnis zu apply_autocmdserlangen , gibt es 139 Vorkommen in den Quellen für Vim 7.4.827. Viel Glück damit.
Sato Katsura

@SatoKatsura Dies ist die Art von Expertenmeinung, nach der ich gesucht habe, danke! Gibt es einen Hinweis, den Sie vorschlagen können, um mehr darüber zu erfahren (außer in Vims Quellen einzutauchen)? Vielleicht liegt das auch ganz außerhalb Ihres Interessensgebiets, aber haben Sie eine Idee, ob die Dinge im Neovim-Land besser definiert sind?
Sundar - Wiedereinsetzung von Monica

Ich fürchte, ich kenne keine endgültige Referenz. autocmds in Vim sind ein Durcheinander, ich glaube nicht, dass es tatsächlich möglich ist , eine endgültige Referenz zu schreiben, mit Ausnahme einiger einfacher Fälle. Ich nehme an, jeder begnügt sich nur mit "normalerweise funktioniert" und zuckt die Achseln, wenn dies nicht der Fall ist. Was neovim betrifft, habe ich persönlich gemischte Gefühle in Bezug auf das Projekt. Ich habe mir den Code in letzter Zeit nicht angesehen. Ich nehme an, Sie können eine Antwort auf ihren Issue Tracker bekommen.
Sato Katsura

Auch der Begriff "Ereignis" selbst sollte die Vorstellung einer zu festen Reihenfolge untergraben.
VanLaser
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.