Ga naar inhoud

Naslag voor plugin.json

Elke Python-plug-in verklaart haar identiteit, haar ingang en haar plaats op de menubalk in een bestand plugin.json naast haar main.py. Dit is hetzelfde schema dat de C++-kant gebruikt; alleen de velden entry en module zijn specifiek voor Python.

Voorbeeld

{
  "id":          "org.example.wordcount",
  "name":        "Word Count",
  "version":     "1.0.0",
  "vendor":      "Example, Inc.",
  "description": "Counts words and characters in the active document.",
  "apiVersion":  1,
  "entry":       "python",
  "module":      "main",
  "pyRequires":  [],
  "order":       900,
  "menus": [
    { "title": "Plugins", "barPriority": 570, "itemPriority": 100 }
  ]
}

Velden

Verplicht

Veld Type Notities
id tekenreeks Unieke aanduiding in omgekeerde DNS-vorm. Overal gebruikt — in- en uitschakelen, logregels, instellingen per plug-in. Mag tussen versies niet veranderen.
apiVersion geheel getal Moet gelijk zijn aan de MTE_PLUGIN_API_VERSION van de host. Op dit moment 1. Een verschil komt op de pagina Plug-ins naar voren en de plug-in wordt wel opgesomd maar niet geladen.
entry tekenreeks Moet "python" zijn om via de Python-backend te lopen. "native" of weglaten loopt via de Qt-lader.
module tekenreeks Naam van de Python-module die register(ctx) bevat. Is die "main", dan zoekt de worker naar main.py in de plug-inmap. Pakketnamen met punten ("src.main") zijn een uitbreiding voor later — fase 1 ondersteunt alleen platte namen.

Aanbevolen

Veld Type Notities
name tekenreeks Leesbare weergavenaam die op de pagina Plug-ins getoond wordt.
version tekenreeks Semver; verder vrije vorm.
vendor tekenreeks Auteur / organisatie. Getoond op de pagina Plug-ins.
description tekenreeks Een of twee regels. Getoond op de pagina Plug-ins.

Optioneel

Veld Type Notities
order geheel getal Laadvolgorde tussen plug-ins; lager laadt eerder. Standaard 1000. Gelijke standen worden op id beslist. requires gaat voor.
requires array van tekenreeksen Id's van plug-ins zonder welke deze plug-in niet kan werken (native en Python gelijk), bijvoorbeeld ["org.mte.lsp"] — geen pip-pakketten, die horen in pyRequires. Ze worden vóór deze plug-in gestart, wat order ook zegt; ontbreekt er een, is die uitgeschakeld, door de licentie geblokkeerd of niet geladen, dan wordt deze plug-in helemaal niet gestart en zegt Voorkeuren → Plug-ins welke plug-in hij nodig heeft en waarom. Zelfde betekenis als bij een native plug-in.
apiMinorVersion geheel getal De laagste minorversie van de host-API die deze plug-in nodig heeft (standaard 0). Een Python-plug-in heeft geen gecompileerde info(), dus dit is zijn enige verklaring: geef de minor op van de nieuwste aanroep die je gebruikt. Een oudere host toont de plug-in met «Vereist een nieuwere versie van OctoEdit» en start hem niet.
menus array van objecten Zie hieronder.
pyRequires array van tekenreeksen Pip-vereistetekenreeksen (bijvoorbeeld ["requests>=2.31"]). Bij de eerste start van de plug-in richt de editor een virtuele omgeving per plug-in in, installeert deze er met pip in, en draait de worker van de plug-in daarin (zie Verpakken). Items die geen tekenreeks zijn en lege items worden overgeslagen.
permissions array van tekenreeksen Grove verklaringen van mogelijkheden (bijvoorbeeld ["network"]), alleen-lezen getoond in de kolom Rechten van Voorkeuren → Plug-ins, zodat gebruikers kunnen zien wat een plug-in over zichzelf zegt. Alleen een verklaring — nog niet afgedwongen.
thirdParty array van objecten Onderdelen van derden die de plug-in meelevert, voor vermelding in het venster Over. Elk item: name (verplicht), license, url, file. Lever de licentietekst die file noemt naast de plug-in mee onder Plugins/Licenses/<id>/. Zie hieronder.

Elk item verklaart één menu van het hoogste niveau waaraan de plug-in bijdraagt en bepaalt de positie ervan. Herhaal één object per menu van het hoogste niveau dat u aanraakt (Tools, Plugins, Help, enzovoort).

"menus": [
  { "title": "Plugins", "barPriority": 570, "itemPriority": 100 }
]
Veld Type Notities
title tekenreeks, verplicht Het label van het menu van het hoogste niveau waaronder het item woont (Plugins, Tools, …). Moet overeenkomen met het meest linkse segment van de paden die u aan ctx.menus.add_item() meegeeft.
barPriority geheel getal, optioneel Rang van links naar rechts op de menubalk. Lager = verder naar links. Kernmenu's hebben vaste prioriteiten met 100 ertussen (Bestand 100, Bewerken 200, …, Venster 600); 570 zet uw submenu bij de plaats van Plugins. Herhaald over plug-ins die op hetzelfde menu van het hoogste niveau mikken; de laatste wint, en dat is prima omdat het idempotent is.
itemPriority geheel getal, optioneel Verticale rang van het hele blok van uw plug-in binnen het bladmenu. Standaard 1000. Lager = hoger.

Afzonderlijke items somt u hier NIET op — die worden tijdens het draaien door ctx.menus.add_item() toegevoegd. menus gaat alleen over de plaats op de menubalk.

thirdParty

Verklaar elk onderdeel van derden dat uw plug-in meelevert, zodat het venster Over het kan vermelden. Elk item:

"thirdParty": [
  { "name": "SomeLib", "license": "MIT",
    "url": "https://example.com/", "file": "SomeLib-LICENSE.txt" }
]
Veld Type Notities
name tekenreeks, verplicht Het onderdeel. Items zonder niet-lege naam vallen af.
license tekenreeks, optioneel Label in SPDX-stijl, bijvoorbeeld MIT, LGPL-3.0.
url tekenreeks, optioneel Project- of startpagina.
file tekenreeks, optioneel Kale naam van de licentietekst die u meelevert, opgelost als Plugins/Licenses/<your-plugin-id>/<file>.

De licentieteksten zijn van u: lever ze met uw plug-inpakket mee onder Plugins/Licenses/<id>/. De editor somt de onderdelen op en wijst gebruikers naar die map; hij bewaart de teksten van derden van uw plug-in niet in zijn eigen map Licenses/.

Statische sonde

Bij het vinden — en opnieuw wanneer een .mteplugin-pakket geïnstalleerd wordt — leest de host module, opent <pluginDir>/<module>.py, en bevestigt dat er een def register(...) op het hoogste niveau in staat — er wordt geen code uitgevoerd. Het installatieprogramma wijst een pakket dat zakt af met een foutvenster; het vinden slaat de plug-in in stilte over, met een foutregel in het logboek:

PythonPluginBackend: skipping 'org.example.wordcount': module
'.../main.py' does not declare a top-level `def register(...)`.

Houd register op kolom 0 van een regel die met def register( begint.

Laadvolgorde en plaats op de menubalk

Draagt uw plug-in aan Plugins bij met barPriority: 570, dan verschijnt het menu op rang 570 op de menubalk. Twee plug-ins met verschillende waarden van barPriority voor dezelfde titel strijden: degene die als laatste geladen is wint, maar omdat beide voor een gegeven menu meestal dezelfde rang verklaren maakt het niet uit. Zie PLUGIN_ARCHITECTURE.md §13 voor het volledige ordeningsmodel.

Wat hier NIET thuishoort

De host ontleedt de velden die hierboven gedocumenteerd staan en negeert al het overige — verzin geen velden; een onbekende sleutel is stilzwijgend dood gewicht.