Hændelsesdokumentation¶
Hver hændelse, værten udgiver til indbyggede udvidelsesmoduler (PluginEvents.h),
når også frem til Python med én undtagelse, der er nævnt nedenfor. Hvert emne leverer
en lille typet dataklasse til din håndtering. Dataklasserne er defineret i
Python/mte/events.py og kan importeres fra mte-pakken på øverste niveau.
Tabel over emne ↔ dataklasse¶
| Emne | Indholdets dataklasse | Felter | Dekorator |
|---|---|---|---|
document.opened |
mte.DocumentOpened |
document: int, path: str |
on_document_opened |
document.closed |
mte.DocumentClosed |
document: int |
on_document_closed |
document.saved |
mte.DocumentSaved |
document: int |
on_document_saved |
document.encodingChanged |
mte.DocumentEncodingChanged |
document: int, encoding: mte.DocumentEncoding |
on_document_encoding_changed |
document.lineEndingChanged |
mte.DocumentLineEndingChanged |
document: int, ending: mte.LineEnding |
on_document_line_ending_changed |
document.modifiedChanged |
mte.DocumentModifiedChanged |
document: int, modified: bool |
on_document_modified_changed |
document.activeChanged |
mte.ActiveDocumentChanged |
document: int |
on_active_document_changed |
text.changed |
mte.TextChanged |
document, position, added_bytes, removed_bytes |
on_text_changed |
selection.changed |
mte.SelectionChanged |
document: int |
on_selection_changed |
settings.changed |
mte.SettingsChanged |
scope: str ("" = hele editoren, "plugins/<id>") |
on_settings_changed |
theme.changed |
mte.ThemeChanged |
variant: str ("light" / "dark" / "") |
on_theme_changed |
margin.clicked |
mte.MarginClicked |
document: int, line: int, margin: str ("symbol"), modifiers: int (bits mte.MODIFIER_SHIFT / MODIFIER_CONTROL / MODIFIER_ALT / MODIFIER_META) — et klik i bogmærkekolonnen, se ctx.line_markers |
on_margin_clicked |
workspace.rootChanged |
mte.WorkspaceRootChanged |
root: str ("" = mappen blev lukket) |
on_workspace_root_changed |
workspace.filesChanged |
mte.WorkspaceFilesChanged |
files: list[mte.WorkspaceFile] (path, display_path) |
on_workspace_files_changed |
command.shortcutChanged |
mte.CommandShortcutChanged |
command_id: str, sequence: str |
on_command_shortcut_changed |
host.windowShown |
mte.HostWindowShown |
(ingen felter) — én gang pr. kørsel, efter det første billede | on_host_window_shown |
app.aboutToQuit |
mte.AppAboutToQuit |
(ingen felter) | on_app_about_to_quit |
document er et uigennemsigtigt heltals-id, værten tildeler. Sammenlign id'er med
==; gem dem ikke på tværs af genstarter af editoren. text.changed udløses ved hver
ændring — hold den håndtering ganske enkel.
At abonnere med den lette dekorator¶
Anbefalet — dekoratorens navn passer til emnet, og indholdets type udledes:
import mte
def register(ctx):
@ctx.events.on_document_saved
def _saved(ev: mte.DocumentSaved):
ctx.log.info(f"saved doc {ev.document}")
@ctx.events.on_document_opened
def _opened(ev: mte.DocumentOpened):
ctx.log.info(f"opened {ev.document} at {ev.path}")
@ctx.events.on_app_about_to_quit
def _quit(_ev: mte.AppAboutToQuit):
ctx.log.info("editor is closing")
At abonnere med den rå API¶
def _saved(ev):
ctx.log.info(f"saved {ev.document}")
handler_id = ctx.events.subscribe("document.saved", _saved)
- Giver det lokalt tildelte
handler_idtilbage (en"py-ev/N"-tekststreng). - Ukendte emner kaster
ValueErrorved abonneringen — ingen tavs ingenting.
Afmeld, når du ikke længere er interesseret:
Bemærk: efter unsubscribe holder værten op med at levere emnet til dig, men
arbejderens lokale fordeler beholder sin post, indtil udvidelsesmodulet lukkes ned.
Regn ikke med unsubscribe til at rydde op i hukommelsen — det er et signal om
politik og ikke en byggesten til affaldsindsamling.
Leveringens vilkår¶
- Hændelser udløses, efter at den tilsvarende handling er fuldført. Ved
document.saveder filen allerede på disken. Veddocument.closeder dokumentets id allerede ugyldigt. - Flere abonnenter på det samme emne udløses alle sammen, i udefineret rækkefølge.
- Undtagelser, der kastes i din håndtering, opfanges af arbejderen og skrives til
stderr (synligt i værtens log som
[worker stderr] …). En håndtering, der opfører sig forkert, forhindrer ikke de andre abonnenter i at blive udløst. - Indholdets dataklasser er uforanderlige; ændr ikke felter på
ev.
At udgive¶
ctx.events.publish(topic, payload) lægger en hændelse på den fælles bus, hvor både
indbyggede og Python-abonnenter modtager den. Kun de to emner, der er ment til at
blive udgivet af et udvidelsesmodul, tages der imod — parret om arbejdsområdet, som
Arbejdsområde-udvidelsesmodulet udsender til Søg i filer og kommandopaletten:
ctx.events.publish("workspace.rootChanged", {"root": "/home/me/project"})
ctx.events.publish("workspace.filesChanged", {"files": [
{"path": "/home/me/project/a.txt", "displayPath": "a.txt"},
]})
Ethvert andet emne kaster ValueError: resten er værtens egne udsagn om, hvad der er
sket (et dokument blev gemt, temaet ændrede sig), og som et udvidelsesmodul ikke
har nogen grund til at påstå. Vil du have beskeder mellem udvidelsesmoduler ud over
disse, så registrér en kommando, og lad den anden side kalde den.
Ikke til rådighed¶
To værtshændelser har intet Python-emne:
document.aboutToSave: værten udgiver den synkront, mens gemningen er spærret, indtil hver abonnent vender tilbage, og at leve op til det over arbejder-RPC'en kræver den samme behandling med frister som fuldførelsesleverandører, inden det er trygt. Indbyggede udvidelsesmoduler kan bruge den i dag.DocumentAboutToClose— med vilje kun for indbyggede moduler. Hele dens løfte er, at dokumentet stadig kan læses inde i behandleren, og leveringen til et Python-modul er asynkron, så behandleren ville køre efter lukningen. Brugdocument.closedi stedet, og hold det, du har brug for at vide om et dokument, ajour ud fra de tidligere hændelser i stedet for at læse det ved lukningen.