Hyppää sisältöön

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:

  • DocumentOpened julkaistaan kerran tiedostoa kohti — jakaminen ei julkaise mitään;
  • DocumentClosed julkaistaan 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ä, ja openDocuments() 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().