Python-plug-ins¶
De Modular Text Editor laadt Python-plug-ins naast inheemse C++-plug-ins via
hetzelfde beheersvlak voor plug-ins. Een Python-plug-in is een map met één
plugin.json en ten minste één .py-bestand met een functie register(ctx) op
het hoogste niveau.
De editor start per plug-in een klein worker-subproces, draait daarin
register(ctx), en verdeelt opdrachten, menu's en gebeurtenissen over een
RPC-kanaal. Uw plug-in raakt Qt of Scintilla nooit aan — het object ctx is een
gewone Python-dienstenzoeker.
Wat er vandaag werkt (fasen 1–5: functioneel compleet)
Fase 1: opdrachten, menu-items, inschrijvingen op gebeurtenissen (openen / sluiten / opslaan / actief document gewijzigd / selectie gewijzigd / toepassing afsluiten), het logboek, de statusbalk.
Fase 2: editorbuffer / selectie / cursor / zoeken / inspringing /
bestandsbewerkingen via ctx.editor.*, blijvende instellingen via
ctx.settings.* en alleen-lezen toepassingsinstellingen via
ctx.app_settings.*, aanvullingsleveranciers (met een korte
toetsaanslagdeadline) via @ctx.completions.provider(...), en
ctx.data_dir() voor de beschrijfbare map per plug-in.
Fase 3: declaratieve dokpanelen via ctx.docks.add_panel(...),
Voorkeurenpagina's via ctx.settings_page.register(...), beide gebouwd
met de formulierbouwers van mte.ui, en toegang tot de
besturingselementen tijdens het draaien via ctx.ui.get / ctx.ui.set.
Fase 4: installatieprogramma voor .mteplugin-pakketten — comprimeer uw
plug-inmap en installeer haar vanuit Voorkeuren → Plug-ins (zie
Verpakken).
Fase 5: virtuele omgevingen per plug-in — verklaar
pip-afhankelijkheden in pyRequires en de editor richt bij de eerste start een
venv voor uw plug-in in (zie
Afhankelijkheden); een verklaring
permissions die op de pagina Plug-ins getoond wordt; en een RPC-ondergrond
met stromen en annuleren (nog zonder API die naar plug-ins gekeerd is — die
draagt toekomstige AI-diensten).
Minimale plug-in¶
Maak <any-folder>/hello/ met deze twee bestanden.
{
"id": "org.example.hello",
"name": "Hello (Python)",
"version": "1.0.0",
"apiVersion": 1,
"entry": "python",
"module": "main",
"menus": [
{ "title": "Plugins", "barPriority": 570, "itemPriority": 100 }
]
}
import mte # noqa: F401
def register(ctx):
@ctx.commands.command(id="hello.sayHi",
title="Say Hi",
shortcut="Ctrl+Alt+H")
def _say_hi():
ctx.status.show("Hello from Python!", timeout_ms=3000)
ctx.log.info("hello: Say Hi invoked")
ctx.menus.add_item("Plugins/Hello/Say Hi", "hello.sayHi")
Comprimeer de map als hello.mteplugin en installeer haar via Voorkeuren →
Plug-ins → Plug-in installeren... — of zet de map met de hand in uw plug-inmap per
gebruiker (zie Verpakken). Herstart de editor en
Plugins → Hello → Say Hi verschijnt in de menubalk.
Wat u op de machine nodig hebt¶
- Een Python-interpreter 3.9+ die op een van twee manieren bereikbaar is:
- in het
PATH(py.exe,python.exeofpython3.exeop Windows;python3op macOS/Linux), of - aangewezen door de omgevingsvariabele
MTE_PYTHON(ofwel een absoluut pad naar eenpython.exe, ofwel een kale naam om in hetPATHop te zoeken).
- in het
- Geen pip-pakketten: de cliëntbibliotheek
mteuit fase 1 komt met de editor mee en wordt voor u aansys.pathtoegevoegd.
De editor noteert bij het starten welke interpreter hij gekozen heeft:
PluginHost: MTE_PYTHON is not set; falling back to PATH.
PluginHost: located Python on PATH: py.exe -> C:/Windows/py.exe
PluginHost: Python plugin backend enabled; interpreter=..., worker=.../mte_python_host.py
Ziet u Python plugins disabled, ga dan naar
Problemen oplossen.
Wat uw plug-in kan doen¶
Elk item hieronder verwijst naar zijn API-onderdeel:
| Mogelijkheid | Onderdeel |
|---|---|
| Opdrachten registreren (met een optionele sneltoets) | ctx.commands |
| Menu-items en scheidingen bijdragen | ctx.menus |
| Zich inschrijven op elke editorgebeurtenis (documenten, tekst, selectie, instellingen, thema, werkruimte, …) en die van de werkruimte publiceren | ctx.events en Naslag voor gebeurtenissen |
| Naar de diagnostiekstroom van de editor schrijven | ctx.log |
| Vluchtige berichten op de statusbalk plaatsen, een blijvend segment van de statusbalk bezitten | ctx.status |
| Buffers, selecties (ook met meerdere cursors), cursor, bestanden, zoeken, bladwijzers, markeringen, URL-markering, inspringing en groepen van de gesplitste weergave lezen/wijzigen | ctx.editor |
| Talen opsommen, de taal van een document lezen / wisselen, een taaldefinitie bijdragen | ctx.languages |
Configuratie per plug-in bewaren, de instellingen van de hele toepassing lezen (mte.keys), met .editorconfig gelaagde instellingen per document lezen |
ctx.settings / ctx.app_settings / ctx.document_settings |
| Diagnostiek publiceren (golflijnen + margetekens) | ctx.diagnostics |
| Tematiseerbare kleuren voor uw eigen interface registreren | ctx.theme |
| De vergelijkingsweergave naast elkaar openen | ctx.compare |
| Een aanvullingsleverancier registreren (met een toetsaanslagdeadline) | ctx.completions |
| Uw beschrijfbare map per plug-in vinden | ctx.data_dir() |
| Een declaratief dokpaneel toevoegen, het vanuit een opdracht tonen / verbergen | ctx.docks en mte.ui |
| Een pagina in Voorkeuren toevoegen | ctx.settings_page |
| Besturingselementen van een paneel tijdens het draaien lezen / schrijven | ctx.ui |
| Een blijvend vinkje op een menu-item omschakelen | ctx.menus.set_item_checked |
| Een menu-item grijs maken zolang zijn opdracht niet kan draaien | ctx.menus.set_item_enabled |
Wat er hierna komt¶
- Naslag voor
plugin.json— elk veld en wat het doet. - Naslag voor de
ctx-API — naslag per methode voor elke dienst vanctx. - Naslag voor gebeurtenissen — de tabel onderwerp ↔ dataclass.
- Verpakken — waar plug-inmappen op de schijf horen.
- Problemen oplossen — de logregels van de host ontcijferen.
- Met Claude schrijven — een compacte gids die u aan een AI-assistent kunt geven om een plug-in voor u te laten maken.