Zum Inhalt

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.

hello/plugin.json
{
  "id":         "org.example.hello",
  "name":       "Hello (Python)",
  "version":    "1.0.0",
  "apiVersion": 1,
  "entry":      "python",
  "module":     "main",
  "menus": [
    { "title": "Plugins", "barPriority": 570, "itemPriority": 100 }
  ]
}
hello/main.py
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.exe oder python3.exe unter Windows; python3 unter macOS/Linux), oder
    • über die Umgebungsvariable MTE_PYTHON (entweder ein absoluter Pfad zu einer python.exe oder ein bloßer Name, der auf dem PATH gesucht wird).
  • Keine pip-Pakete: Die Phase-1-Clientbibliothek mte wird mit dem Editor ausgeliefert und für Sie zum sys.path hinzugefü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