Ga naar inhoud

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.

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")

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.exe of python3.exe op Windows; python3 op macOS/Linux), of
    • aangewezen door de omgevingsvariabele MTE_PYTHON (ofwel een absoluut pad naar een python.exe, ofwel een kale naam om in het PATH op te zoeken).
  • Geen pip-pakketten: de cliëntbibliotheek mte uit fase 1 komt met de editor mee en wordt voor u aan sys.path toegevoegd.

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