Gå till innehållet

Händelser

Insticksmoduler reagerar på aktivitet i redigeraren genom IEventBus. Händelser är enkla strukturer definierade i PluginEvents.h:

Händelse Innehåll
DocumentOpened DocumentId, std::filesystem::path
DocumentAboutToClose DocumentId — användaren stänger dokumentet och stängningen är säker; publiceras precis innan dess sista vy försvinner, medan det fortfarande går att läsa helt. Inte vid avslut. Bara inbyggda moduler; se nedan
DocumentClosed DocumentId
DocumentSaved DocumentId
DocumentPrinted DocumentId, pages — publicerad efter att ett utskriftsjobb nått enheten (Fil ▸ Skriv ut, eller Skriv ut inuti förhandsgranskningen); pages räknar de utskrivna dokumentsidorna, färre än dokumentet har när en markering eller ett sidintervall valdes. En avbruten dialogruta publicerar inget. Tills vidare endast C++-insticksmoduler
DocumentAboutToSave DocumentId, path — synkron, bufferten är fortfarande redigerbar (trimma blanksteg, lägg till avslutande nyrad); inga dialogrutor
DocumentEncodingChanged DocumentId, DocumentEncoding — den teckenkodning värden kommer att skriva tillbaka dokumentet i har ändrats (filen precis identifierad, eller setDocumentEncoding anropad)
DocumentLineEndingChanged DocumentId, LineEnding — den radavslutare dokumentet använder har ändrats (filen precis inläst eller omläst, ett end_of_line från .editorconfig tillämpat vid sparandet, eller setLineEnding anropad)
DocumentModifiedChanged DocumentId, modified — flaggan ren/smutsig vände (inte vid varje tangenttryckning)
TextChanged DocumentId, pos, addedBytes, removedBytes
SelectionChanged DocumentId
ActiveDocumentChanged DocumentId
HostWindowShown (inget) — en gång per körning, efter att den första bilden är på skärmen; schemalägg långsamt startarbete på den
SettingsChanged scope — "" = hela redigeraren, "plugins/<id>" = den insticksmodulens sida verkställdes
WorkspaceRootChanged root (tomt = mappen stängd) — publicerad av insticksmodulen Arbetsyta
WorkspaceFilesChanged files[] av {path, displayPath} — publicerad av insticksmodulen Arbetsyta
ThemeChanged variant ("light" / "dark" / "")
AppAboutToQuit (inget)
CommandShortcutChanged commandId, sequence (ny portabel kombination; "" = lossad)
MarginClicked DocumentId, line, margin (EditorMargin::Symbol), modifiers — ett vänsterklick i en redigerares bokmärkeskolumn, vid varje sådant klick; se Radmärken

Även insticksmoduler kan publicera händelser (ctx.events().publish(e)) — det är så insticksmodulen Arbetsyta sänder ut WorkspaceRootChanged / WorkspaceFilesChanged för att Sök i filer och kommandopaletten ska kunna använda dem.

Ett dokument, ett id

Ett DocumentId namnger ett dokument, inte en ruta. Dela dokumentet visar en fil i två rutor, och båda bär samma DocumentId, så:

  • DocumentOpened publiceras en gång per fil — att dela publicerar inget;
  • DocumentClosed publiceras bara när den sista vyn av dokumentet stängs, så att stänga en ruta river aldrig ned tillstånd som den andra fortfarande behöver;
  • activeDocument() svarar med det ena id:t oavsett vilken ruta som är främst, och openDocuments() listar dokumentet en gång.

Det finns med avsikt ingen händelse per ruta och inget sätt att fråga vilken ruta som är aktiv: rutor är värdens angelägenhet, och allt en insticksmodul kan iaktta — text, markör, markering, teckenkodning, radslut, ändringstillstånd — hör till dokumentet, som rutorna delar.

DocumentAboutToClose

Publiceras en gång per dokument, omedelbart innan dess sista vy försvinner, när stängningen är säker — en eventuell fråga om att spara har besvarats och inte avbrutits. I hanteraren är dokumentet fortfarande helt: text(), filePath(), caret(), bookmarkedLines() och teckenkodningen svarar alla. Sedan följer nedmonteringen och därefter DocumentClosed. Varje sätt att stänga en flik publicerar den (Stäng, Stäng alla, Stäng övriga / Stäng till höger, ett mittenklick, Stäng mappen, en moduls closeDocument()), även för namnlösa dokument; att stänga en ruta för ett dokument som fortfarande visas i en annan gör det inte.

Avslut publicerar den inte. Programmet publicerar AppAboutToQuit en gång, medan alla dokument fortfarande är öppna, och inga stängningshändelser per dokument: en modul som sparar tillstånd per dokument mellan sessioner går igenom openDocuments() i sin AppAboutToQuit-hanterare. DocumentAboutToClose betyder därför alltid «det här dokumentet stängs», aldrig «programmet avslutas».

Hanterare körs synkront, mitt i stängningen: var snabb, visa inga dialogrutor och behandla mängden dokument som skrivskyddad — öppna, stäng eller aktivera inga dokument och redigera inte texten i dokumentet som stängs.

Den är avsiktligt bara för inbyggda moduler: leveransen till Python-moduler är asynkron, så löftet «går fortfarande att läsa» skulle inte kunna hållas där, och händelsen erbjuds dem inte (se Python-händelser).

CommandShortcutChanged

CommandShortcutChanged utlöses när ett kommandos effektiva kortkommando ändras — en omtilldelning av användaren i tilldelningen av kortkommandon, en import eller återställning av en tangentuppsättning, eller en konfliktavstängning som slår till eller släpper. Menybundna kommandon behöver inget (värden kopplar om deras åtgärd); kommandon som registrerats med scope = command_scope::kPluginWindow prenumererar och tillämpar sekvensen på nytt på sina egna widgetar (se Kommandon och menyer).

Prenumerera

subscribe är en mall som returnerar en Subscription (RAII). Håll prenumerationen vid liv som medlem så länge du vill att återanropet ska utlösas; att förstöra den avslutar prenumerationen.

m_sub = ctx.events().subscribe<MTE::plugin::DocumentSaved>(
    [this](const MTE::plugin::DocumentSaved& e) {
        // react to e.id ...
    });
class IEventBus {
public:
    template <class Event>
    Subscription subscribe(std::function<void(const Event&)> cb);
    // Forwards to a type-erased subscribeRaw(std::type_index, ...) internally.
};

Tip

Håll varje Subscription som medlem i insticksmodulen så att alla återanrop rivs ned automatiskt i shutdown().