Hendelser¶
Programtillegg reagerer på aktivitet i redigereren gjennom IEventBus. Hendelser er
alminnelige strukturer definert i PluginEvents.h:
| Hendelse | Innhold |
|---|---|
DocumentOpened |
DocumentId, std::filesystem::path |
DocumentAboutToClose |
DocumentId — brukeren lukker dokumentet, og lukkingen er sikker; publiseres like før den siste visningen forsvinner, mens det ennå kan leses fullt ut. Ikke ved avslutning. Bare innebygde programtillegg; se nedenfor |
DocumentClosed |
DocumentId |
DocumentSaved |
DocumentId |
DocumentPrinted |
DocumentId, pages — publiseres etter at en utskriftsjobb har nådd fram til enheten (Fil ▸ Skriv ut, eller Skriv ut inne i forhåndsvisningen); pages teller de utskrevne dokumentsidene og er færre enn dokumentet har når en merking eller et sideområde ble valgt. Et avbrutt vindu publiserer ingenting. Bare C++-programtillegg inntil videre |
DocumentAboutToSave |
DocumentId, path — synkron, bufferen kan fortsatt redigeres (fjern blanktegn, legg til et avsluttende linjeskift); ingen vinduer |
DocumentEncodingChanged |
DocumentId, DocumentEncoding — den tegnkodingen verten vil skrive dokumentet tilbake i, har endret seg (filen ble nettopp bestemt, eller setDocumentEncoding ble kalt) |
DocumentLineEndingChanged |
DocumentId, LineEnding — det linjeskiftet dokumentet bruker, har endret seg (filen ble nettopp lest eller lastet inn på nytt, en end_of_line fra .editorconfig ble tatt i bruk ved lagring, eller setLineEnding ble kalt) |
DocumentModifiedChanged |
DocumentId, modified — flagget for ren eller endret snudde (ikke ved hvert tastetrykk) |
TextChanged |
DocumentId, pos, addedBytes, removedBytes |
SelectionChanged |
DocumentId |
ActiveDocumentChanged |
DocumentId |
HostWindowShown |
(ingen) — én gang per kjøring, etter at det første bildet er på skjermen; legg tregt oppstartsarbeid i kø ut fra denne |
SettingsChanged |
scope — "" = hele redigereren, "plugins/<id>" = det programtilleggets side ble tatt i bruk |
WorkspaceRootChanged |
root (tom = mappen ble lukket) — publiseres av Arbeidsområde-programtillegget |
WorkspaceFilesChanged |
files[] av {path, displayPath} — publiseres av Arbeidsområde-programtillegget |
ThemeChanged |
variant ("light" / "dark" / "") |
AppAboutToQuit |
(ingen) |
CommandShortcutChanged |
commandId, sequence (den nye flyttbare kombinasjonen; "" = uten binding) |
MarginClicked |
DocumentId, line, margin (EditorMargin::Symbol), modifiers — et venstreklikk i bokmerkekolonnen i en redigerer, ved hvert slikt klikk; se Linjemerker |
Programtillegg kan også publisere hendelser (ctx.events().publish(e)) — det er slik
Arbeidsområde-programtillegget kringkaster WorkspaceRootChanged og
WorkspaceFilesChanged, som Søk i filer og kommandopaletten tar imot.
Ett dokument, én id¶
En DocumentId navngir et dokument og ikke en rute. Del dokumentet til høyre viser én fil i
to ruter, og begge rutene bærer samme DocumentId, så:
DocumentOpenedpubliseres én gang per fil — en deling publiserer ingenting;DocumentClosedpubliseres bare når den siste visningen av dokumentet lukkes, så det å lukke én rute aldri river ned tilstand den andre fortsatt trenger;activeDocument()svarer med den ene id-en uansett hvilken rute som er fremst, ogopenDocuments()lister dokumentet én gang.
Det finnes med vilje ingen hendelse per rute og ingen måte å spørre hvilken rute som er aktiv: ruter er vertens anliggende, og alt et programtillegg kan iaktta — tekst, markør, merking, tegnkoding, linjeskift, endret tilstand — hører til dokumentet, som rutene deler.
DocumentAboutToClose¶
Publiseres én gang per dokument, rett før den siste visningen forsvinner,
når lukkingen er sikker — et eventuelt spørsmål om lagring er besvart og ikke
avbrutt. Inne i behandleren er dokumentet fortsatt helt: text(),
filePath(), caret(), bookmarkedLines() og tegnkodingen svarer alle.
Deretter følger nedrivingen, så DocumentClosed. Alle måter å lukke en fane
på publiserer den (Lukk, Lukk alle, Lukk de andre / Lukk dem til høyre, et
midtklikk, Lukk mappen, et programtilleggs closeDocument()), også for
dokumenter uten navn; å lukke én rute for et dokument som fortsatt vises i en
annen, gjør det ikke.
Avslutning publiserer den ikke. Programmet publiserer AppAboutToQuit én
gang, mens alle dokumentene ennå er åpne, og ingen lukkehendelser per
dokument: et programtillegg som tar vare på tilstand per dokument mellom
økter, går gjennom openDocuments() i AppAboutToQuit-behandleren sin.
DocumentAboutToClose betyr derfor alltid «dette dokumentet lukkes», aldri
«programmet avsluttes».
Behandlere kjører synkront, midt i lukkingen: vær rask, vis ingen dialogvinduer, og behandle mengden dokumenter som skrivebeskyttet — ikke åpne, lukk eller aktiver dokumenter, og ikke rediger teksten i dokumentet som lukkes.
Den er med vilje bare for innebygde programtillegg: leveringen til Python-programtillegg er asynkron, så løftet «kan fortsatt leses» kunne ikke holdes der, og hendelsen tilbys dem ikke (se Python-hendelser).
CommandShortcutChanged¶
CommandShortcutChanged utløses når en kommandos faktiske hurtigtast endrer seg — en
omtildeling i hurtigtasttildelingen, en importert eller tilbakestilt tastaturoppsett,
eller at en konfliktundertrykkelse trer inn eller faller bort. Menybundne kommandoer
trenger ingenting (verten gir handlingen deres en ny binding); kommandoer som er
registrert med scope = command_scope::kPluginWindow, abonnerer og tar sekvensen i bruk
på nytt på sine egne kontroller (se Kommandoer og menyer).
Å abonnere¶
subscribe er en mal som gir et Subscription tilbake (RAII). Hold abonnementet i live
som et medlem så lenge du vil at tilbakekallet skal utløses; ødelegger man det, avmeldes
abonnementet.
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
Hold hvert Subscription som et medlem av programtillegget, så alle tilbakekall rives
ned av seg selv i shutdown().