Gå till innehållet

Python-insticksmoduler

Modular Text Editor läser in Python-insticksmoduler vid sidan av inhemska C++-moduler genom samma hanteringsyta. En Python-insticksmodul är en mapp som innehåller en plugin.json och minst en .py-fil med en funktion register(ctx) på toppnivå.

Redigeraren startar en liten arbetarunderprocess per insticksmodul, kör register(ctx) i den, och fördelar kommandon, menyer och händelser över en RPC-kanal. Din insticksmodul rör aldrig Qt eller Scintilla — objektet ctx är en vanlig Python-tjänstesökare.

Vad som fungerar i dag (faserna 1–5: funktionellt kompletta)

Fas 1: kommandon, menyposter, händelseprenumerationer (öppna / stänga / spara / aktivt dokument ändrat / markering ändrad / programmet avslutas), loggen, statusraden.

Fas 2: redigerarbuffert / markering / markör / sökning / indrag / filoperationer genom ctx.editor.*, bestående inställningar genom ctx.settings.* och skrivskyddade programinställningar genom ctx.app_settings.*, kompletteringsleverantörer (med en kort deadline knuten till tangenttryckningen) genom @ctx.completions.provider(...), och ctx.data_dir() för den skrivbara mappen per insticksmodul.

Fas 3: deklarativa dockpaneler genom ctx.docks.add_panel(...), Inställningssidor genom ctx.settings_page.register(...), båda byggda med formulärbyggarna i mte.ui, och åtkomst till kontrollerna under körning genom ctx.ui.get / ctx.ui.set.

Fas 4: installerare för .mteplugin-paket — komprimera din insticksmodulsmapp och installera den från Inställningar → Insticksmoduler (se Paketering).

Fas 5: virtuella miljöer per insticksmodul — deklarera pip-beroenden i pyRequires så ställer redigeraren i ordning en venv för din insticksmodul vid första starten (se Beroenden); en deklaration permissions som visas på sidan Insticksmoduler; och en RPC-grund med strömning och avbrott (ännu utan API som vetter mot insticksmoduler — den bär framtida AI-tjänster).

Minimal insticksmodul

Skapa <any-folder>/hello/ med de här två filerna.

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

Komprimera mappen som hello.mteplugin och installera den via Inställningar → Insticksmoduler → Installera insticksmodul... — eller lägg mappen för hand i din insticksmodulskatalog per användare (se Paketering). Starta om redigeraren så dyker Plugins → Hello → Say Hi upp i menyraden.

Vad du behöver på maskinen

  • En Python-tolk 3.9+ som går att nå på ett av två sätt:
    • i PATH (py.exe, python.exe eller python3.exe på Windows; python3 på macOS/Linux), eller
    • utpekad av miljövariabeln MTE_PYTHON (antingen en absolut sökväg till en python.exe, eller ett naket namn att slå upp i PATH).
  • Inga pip-paket: klientbiblioteket mte från fas 1 följer med redigeraren och läggs till i sys.path åt dig.

Redigeraren noterar vid start vilken tolk den valt:

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

Ser du Python plugins disabled, hoppa till Felsökning.

Vad din insticksmodul kan göra

Varje post nedan länkar till sitt API-avsnitt:

Möjlighet Avsnitt
Registrera kommandon (med valfritt kortkommando) ctx.commands
Bidra med menyposter och avskiljare ctx.menus
Prenumerera på varje redigerarhändelse (dokument, text, markering, inställningar, tema, arbetsyta, …) och publicera arbetsytans ctx.events och Händelsereferens
Skriva till redigerarens diagnostikström ctx.log
Lägga flyktiga meddelanden på statusraden, äga ett bestående statusradssegment ctx.status
Läsa/ändra buffertar, markeringar (även med flera markörer), markör, filer, sökning, bokmärken, markeringar, URL-färgmarkering, indrag, den delade vyns grupper ctx.editor
Lista språk, läsa / byta ett dokuments språk, bidra med en språkdefinition ctx.languages
Spara konfiguration per insticksmodul, läsa programövergripande inställningar (mte.keys), läsa inställningar per dokument skiktade med .editorconfig ctx.settings / ctx.app_settings / ctx.document_settings
Publicera diagnostik (våglinjer + marginaltecken) ctx.diagnostics
Registrera temabara färger för ditt eget gränssnitt ctx.theme
Öppna jämförelsevyn sida vid sida ctx.compare
Registrera en kompletteringsleverantör (med en deadline knuten till tangenttryckningen) ctx.completions
Hitta din skrivbara mapp per insticksmodul ctx.data_dir()
Lägga till en deklarativ dockpanel, visa / dölja den från ett kommando ctx.docks och mte.ui
Lägga till en sida i Inställningar ctx.settings_page
Läsa / skriva en panels kontroller under körning ctx.ui
Växla ett bestående kryss på en menypost ctx.menus.set_item_checked
Gråtona en menypost medan dess kommando inte kan köras ctx.menus.set_item_enabled

Vad som kommer härnäst