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. |
menus¶
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).
| 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.