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å:
DocumentOpenedpubliceras en gång per fil — att dela publicerar inget;DocumentClosedpubliceras 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, ochopenDocuments()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().