Tapahtumat¶
Liitännäiset reagoivat editorin toimintaan rajapinnan IEventBus kautta. Tapahtumat ovat
tavallisia rakenteita, jotka on määritelty tiedostossa PluginEvents.h:
| Tapahtuma | Hyötykuorma |
|---|---|
DocumentOpened |
DocumentId, std::filesystem::path |
DocumentAboutToClose |
DocumentId — käyttäjä sulkee asiakirjan, ja sulkeminen on varma; julkaistaan juuri ennen kuin sen viimeinen näkymä katoaa, kun sen voi vielä lukea kokonaan. Ei ohjelmasta poistuttaessa. Vain natiivit liitännäiset; katso alempaa |
DocumentClosed |
DocumentId |
DocumentSaved |
DocumentId |
DocumentPrinted |
DocumentId, pages — julkaistaan, kun tulostustyö on saapunut laitteelle (Tiedosto ▸ Tulosta tai Tulosta esikatselun sisällä); pages laskee tulostetut asiakirjasivut ja on pienempi kuin asiakirjan sivumäärä, kun valinta tai sivualue valittiin. Peruutettu ikkuna ei julkaise mitään. Toistaiseksi vain C++-liitännäiset |
DocumentAboutToSave |
DocumentId, path — synkroninen, puskuri on yhä muokattavissa (karsi tyhjemerkit, lisää päättävä rivinvaihto); ei ikkunoita |
DocumentEncodingChanged |
DocumentId, DocumentEncoding — se koodaus, jolla isäntä kirjoittaa asiakirjan takaisin, on muuttunut (tiedosto juuri tunnistettiin tai kutsuttiin funktiota setDocumentEncoding) |
DocumentLineEndingChanged |
DocumentId, LineEnding — asiakirjan käyttämä rivinpäätin on muuttunut (tiedosto juuri luettiin tai ladattiin uudelleen, .editorconfig-tiedoston end_of_line otettiin käyttöön tallennettaessa, tai kutsuttiin funktiota setLineEnding) |
DocumentModifiedChanged |
DocumentId, modified — puhdas/likainen-lippu kääntyi (ei jokaisella näppäinpainalluksella) |
TextChanged |
DocumentId, pos, addedBytes, removedBytes |
SelectionChanged |
DocumentId |
ActiveDocumentChanged |
DocumentId |
HostWindowShown |
(ei mitään) — kerran ajoa kohti, kun ensimmäinen ruutu on näytöllä; aikatauluta hidas käynnistystyö tämän varaan |
SettingsChanged |
scope — "" = koko editori, "plugins/<id>" = tuon liitännäisen sivu otettiin käyttöön |
WorkspaceRootChanged |
root (tyhjä = kansio suljettiin) — julkaisee Työtila-liitännäinen |
WorkspaceFilesChanged |
files[], muotoa {path, displayPath} — julkaisee Työtila-liitännäinen |
ThemeChanged |
variant ("light" / "dark" / "") |
AppAboutToQuit |
(ei mitään) |
CommandShortcutChanged |
commandId, sequence (uusi siirrettävä yhdistelmä; "" = ilman määritystä) |
MarginClicked |
DocumentId, line, margin (EditorMargin::Symbol), modifiers — vasemman painikkeen napsautus editorin kirjanmerkkisarakkeessa, jokaisella tällaisella napsautuksella; katso Rivimerkit |
Liitännäiset voivat myös julkaista tapahtumia (ctx.events().publish(e)) — siten
Työtila-liitännäinen lähettää tapahtumat WorkspaceRootChanged ja
WorkspaceFilesChanged, jotka Etsi tiedostoista ja komentopaletti ottavat vastaan.
Yksi asiakirja, yksi tunniste¶
DocumentId nimeää asiakirjan eikä ruutua. Jaa asiakirja oikealle näyttää yhtä tiedostoa
kahdessa ruudussa, ja molemmat ruudut kantavat samaa tunnistetta DocumentId, joten:
DocumentOpenedjulkaistaan kerran tiedostoa kohti — jakaminen ei julkaise mitään;DocumentClosedjulkaistaan vain, kun asiakirjan viimeinen näkymä suljetaan, joten yhden ruudun sulkeminen ei koskaan pura tilaa, jota toinen vielä tarvitsee;activeDocument()vastaa tuolla yhdellä tunnisteella riippumatta siitä, mikä ruutu on edessä, jaopenDocuments()luettelee asiakirjan kerran.
Ruutukohtaista tapahtumaa ei tarkoituksella ole, eikä ole tapaa kysyä, mikä ruutu on aktiivinen: ruudut ovat isännän asia, ja kaikki, mitä liitännäinen voi havaita — teksti, kohdistin, valinta, koodaus, rivinvaihto, muutettu tila — kuuluu asiakirjalle, jonka ruudut jakavat.
DocumentAboutToClose¶
Julkaistaan kerran asiakirjaa kohti, välittömästi ennen kuin sen viimeinen
näkymä katoaa, kun sulkeminen on varma — mahdolliseen tallennuskysymykseen on
vastattu eikä sitä peruttu. Käsittelijän sisällä asiakirja on vielä ehjä:
text(), filePath(), caret(), bookmarkedLines() ja koodaus vastaavat
kaikki. Sen jälkeen tulee purku ja sitten DocumentClosed. Jokainen tapa
sulkea välilehti julkaisee sen (Sulje, Sulje kaikki, Sulje muut / Sulje
oikealla olevat, keskipainikkeen napsautus, Sulje kansio, liitännäisen
closeDocument()), nimettömät asiakirjat mukaan lukien; toisessa ruudussa yhä
näkyvän asiakirjan yhden ruudun sulkeminen ei julkaise sitä.
Ohjelmasta poistuminen ei julkaise sitä. Sovellus julkaisee
AppAboutToQuit-tapahtuman kerran, kun kaikki asiakirjat ovat vielä auki,
eikä yhtään asiakirjakohtaista sulkemistapahtumaa: liitännäinen, joka säilyttää
asiakirjakohtaista tilaa istunnosta toiseen, käy openDocuments()-luettelon
läpi AppAboutToQuit-käsittelijässään. DocumentAboutToClose tarkoittaa siis
aina »tätä asiakirjaa suljetaan«, ei koskaan »ohjelma on päättymässä«.
Käsittelijät ajetaan synkronisesti, kesken sulkemisen: ole nopea, älä näytä valintaikkunoita ja käsittele asiakirjojen joukkoa vain luettavana — älä avaa, sulje tai aktivoi asiakirjoja äläkä muokkaa suljettavan asiakirjan tekstiä.
Se on tarkoituksella vain natiivi: toimitus Python-liitännäisille on asynkroninen, joten lupausta »voi vielä lukea« ei siellä voisi pitää, eikä tapahtumaa tarjota niille (katso Python-tapahtumat).
CommandShortcutChanged¶
CommandShortcutChanged laukeaa, kun komennon todellinen pikanäppäin muuttuu —
käyttäjän uudelleenmäärityksestä, näppäinkartan tuonnista tai nollauksesta, tai kun
ristiriitavaimennus astuu voimaan tai raukeaa. Valikkoon sidotut komennot eivät tarvitse
mitään (isäntä määrittää niiden toiminnon uudelleen); komennot, jotka on rekisteröity
arvolla scope = command_scope::kPluginWindow, tilaavat tapahtuman ja ottavat sekvenssin
uudelleen käyttöön omissa ohjausobjekteissaan (katso
Komennot ja valikot).
Tilaaminen¶
subscribe on malli, joka palauttaa olion Subscription (RAII). Pidä tilaus elossa
jäsenenä niin kauan kuin haluat takaisinkutsun laukeavan; sen tuhoaminen peruu tilauksen.
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
Pidä jokaista Subscription-oliota liitännäisen jäsenenä, jotta kaikki takaisinkutsut
puretaan automaattisesti funktiossa shutdown().