Python-Plugins¶
Der Modular Text Editor lädt Python-Plugins neben nativen C++-Plugins über
dieselbe Plugin-Verwaltungsoberfläche. Ein Python-Plugin ist ein Ordner mit
einer plugin.json und mindestens einer .py-Datei mit einer Top-Level-
Funktion register(ctx).
Der Editor startet pro Plugin einen kleinen Worker-Subprozess, führt darin
register(ctx) aus und überträgt Commands / Menüs / Events über einen
RPC-Kanal. Ihr Plugin berührt niemals Qt oder Scintilla — das ctx-Objekt
ist ein einfacher Python-Service-Locator.
Was heute funktioniert (Phasen 1–5: funktional vollständig)
Phase 1: Commands, Menüeinträge, Event-Abonnements (Öffnen / Schließen / Speichern / aktives Dokument gewechselt / Auswahl geändert / App-Ende), das Log, die Statusleiste.
Phase 2: Editor-Puffer / Auswahl / Caret /
Suche / Einrückung / Dateioperationen über ctx.editor.*,
persistente Einstellungen über ctx.settings.* und nur lesbare
App-Einstellungen über ctx.app_settings.*,
Completion-Provider (mit einer kleinen Tastenanschlag-Deadline)
über @ctx.completions.provider(...) sowie ctx.data_dir() für das
beschreibbare Pro-Plugin-Verzeichnis.
Phase 3: deklarative Dock-Panels über ctx.docks.add_panel(...),
Einstellungen-Seiten über ctx.settings_page.register(...), beide
gebaut mit den mte.ui-Formular-Buildern, und
Laufzeitzugriff auf Controls über ctx.ui.get / ctx.ui.set.
Phase 4: .mteplugin-Paketinstaller — zippen Sie Ihren
Plugin-Ordner und installieren Sie ihn über Einstellungen → Plugins
(siehe Paketierung).
Phase 5: virtuelle Umgebungen pro Plugin — deklarieren Sie
pip-Abhängigkeiten in pyRequires, und der Editor richtet beim ersten
Start ein Venv für Ihr Plugin ein (siehe
Abhängigkeiten); eine
permissions-Deklaration, die auf der Plugins-Seite angezeigt wird;
und ein Streaming-/Abbruch-RPC-Unterbau (noch keine Plugin-seitige
API — er trägt künftige KI-Dienste).
Minimales Plugin¶
Erstellen Sie <beliebiger-ordner>/hello/ mit diesen zwei Dateien.
{
"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")
Zippen Sie den Ordner als hello.mteplugin und installieren Sie ihn über
Einstellungen → Plugins → Install… — oder legen Sie den Ordner von Hand
in Ihr benutzerspezifisches Plugin-Verzeichnis (siehe
Paketierung). Starten Sie den Editor neu, und
Plugins → Hello → Say Hi erscheint in der Menüleiste.
Was Sie auf dem Rechner benötigen¶
- Einen Python-3.9+-Interpreter, erreichbar auf einem von zwei Wegen:
- Auf dem
PATH(py.exe,python.exeoderpython3.exeunter Windows;python3unter macOS/Linux), oder - über die Umgebungsvariable
MTE_PYTHON(entweder ein absoluter Pfad zu einerpython.exeoder ein bloßer Name, der auf demPATHgesucht wird).
- Auf dem
- Keine pip-Pakete: Die Phase-1-Clientbibliothek
mtewird mit dem Editor ausgeliefert und für Sie zumsys.pathhinzugefügt.
Der Editor protokolliert beim Start, welchen Interpreter er ausgewählt hat:
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
Wenn Sie Python plugins disabled sehen, springen Sie zu
Fehlerbehebung.
Was Ihr Plugin tun kann¶
Jeder Punkt unten verlinkt auf seinen API-Abschnitt:
| Fähigkeit | Abschnitt |
|---|---|
| Commands registrieren (mit optionalem Tastatur-Shortcut) | ctx.commands |
| Menüeinträge und Trennlinien beisteuern | ctx.menus |
| Editor-Events abonnieren (Dokumente, Auswahl, App-Ende) | ctx.events und Events-Referenz |
| In den Diagnosestrom des Editors loggen | ctx.log |
| Flüchtige Statusleisten-Meldungen anzeigen | ctx.status |
| Aktiven Puffer, Auswahl, Caret, Einrückung lesen/ändern | ctx.editor |
| Pro-Plugin-Konfiguration persistieren, app-weite Einstellungen lesen | ctx.settings / ctx.app_settings |
| Einen Completion-Provider registrieren (mit Tastenanschlag-Deadline) | ctx.completions |
| Ihr beschreibbares Pro-Plugin-Verzeichnis finden | ctx.data_dir() |
| Ein deklaratives Dock-Panel hinzufügen | ctx.docks und mte.ui |
| Eine Seite in den Einstellungen hinzufügen | ctx.settings_page |
| Panel-Controls zur Laufzeit lesen / schreiben | ctx.ui |
| Ein persistentes Häkchen an einem Menüeintrag umschalten | ctx.menus.set_item_checked |
Wie es weitergeht¶
plugin.json-Referenz — jedes Feld und seine Wirkung.ctx-API-Referenz — Methode-für-Methode-Referenz für die fünf Phase-1-Dienste.- Events-Referenz — die Topic-↔-Dataclass-Tabelle.
- Paketierung — wohin Plugin-Ordner auf der Platte gehören.
- Fehlerbehebung — die Logzeilen des Hosts entschlüsseln.
- Entwickeln mit Claude — ein kompakter Leitfaden, den Sie einem KI-Assistenten übergeben können, damit er ein Plugin für Sie erstellt.