Plugins Python¶
Modular Text Editor charge les plugins Python aux côtés des plugins C++
natifs, via la même surface de gestion des plugins. Un plugin Python est un
dossier contenant un plugin.json et au moins un fichier .py doté d'une
fonction register(ctx) de niveau module.
L'éditeur lance un petit sous-processus worker par plugin, y exécute
register(ctx) et fait transiter commandes / menus / événements par un canal
RPC. Votre plugin ne touche jamais à Qt ni à Scintilla — l'objet ctx est un
simple localisateur de services Python.
Ce qui fonctionne aujourd'hui (phases 1–5 : fonctionnellement complet)
Phase 1 : commandes, éléments de menu, abonnements aux événements (ouverture / fermeture / enregistrement / changement de document actif / changement de sélection / fermeture de l'application), le journal, la barre d'état.
Phase 2 : tampon d'édition / sélection / caret / recherche /
indentation / opérations sur les fichiers via ctx.editor.*,
réglages persistants via ctx.settings.* et réglages de
l'application en lecture seule via ctx.app_settings.*, fournisseurs
de complétion (avec une courte échéance par frappe) via
@ctx.completions.provider(...), et ctx.data_dir() pour le répertoire
par plugin accessible en écriture.
Phase 3 : panneaux ancrables déclaratifs via
ctx.docks.add_panel(...), pages de Préférences via
ctx.settings_page.register(...), tous deux construits avec les
constructeurs de formulaires mte.ui, et l'accès aux
contrôles à l'exécution via ctx.ui.get / ctx.ui.set.
Phase 4 : installateur de paquets .mteplugin — compressez votre
dossier de plugin en zip et installez-le depuis Préférences →
Extensions (voir Empaquetage).
Phase 5 : environnements virtuels par plugin — déclarez des
dépendances pip dans pyRequires et l'éditeur provisionne un venv pour
votre plugin au premier lancement (voir
Dépendances) ; une déclaration
permissions affichée dans la page Extensions ; et un substrat RPC de
flux/annulation (pas encore d'API côté plugin — il sous-tend de futurs
services d'IA).
Plugin minimal¶
Créez <un-dossier>/hello/ avec ces deux fichiers.
{
"id": "org.example.hello",
"name": "Hello (Python)",
"version": "1.0.0",
"apiVersion": 1,
"entry": "python",
"module": "main",
"menus": [
{ "title": "Plugins", "barPriority": 570, "itemPriority": 100 }
]
}
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")
Compressez le dossier en hello.mteplugin et installez-le via
Préférences → Extensions → Installer… — ou déposez le dossier à la main
dans votre répertoire de plugins par utilisateur (voir
Empaquetage). Redémarrez l'éditeur : Plugins → Hello →
Say Hi apparaît dans la barre de menus.
Ce dont vous avez besoin sur la machine¶
- Un interpréteur Python 3.9+ accessible de l'une des deux façons
suivantes :
- sur le
PATH(py.exe,python.exeoupython3.exesous Windows ;python3sous macOS/Linux), ou - désigné par la variable d'environnement
MTE_PYTHON(soit un chemin absolu vers unpython.exe, soit un simple nom à rechercher sur lePATH).
- sur le
- Aucun paquet pip : la bibliothèque cliente
mtede la phase 1 est livrée avec l'éditeur et ajoutée àsys.pathpour vous.
L'éditeur journalise au démarrage l'interpréteur qu'il a sélectionné :
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
Si vous voyez Python plugins disabled, rendez-vous au
dépannage.
Ce que votre plugin peut faire¶
Chaque élément ci-dessous renvoie à sa section d'API :
| Capacité | Section |
|---|---|
| Enregistrer des commandes (avec raccourci clavier optionnel) | ctx.commands |
| Contribuer des éléments de menu et des séparateurs | ctx.menus |
| S'abonner aux événements de l'éditeur (documents, sélection, fermeture) | ctx.events et référence des événements |
| Écrire dans le flux de diagnostics de l'éditeur | ctx.log |
| Publier des messages transitoires dans la barre d'état | ctx.status |
| Lire/modifier le tampon actif, la sélection, le caret, l'indentation | ctx.editor |
| Persister la configuration par plugin, lire les réglages globaux | ctx.settings / ctx.app_settings |
| Enregistrer un fournisseur de complétion (avec échéance par frappe) | ctx.completions |
| Localiser votre répertoire par plugin accessible en écriture | ctx.data_dir() |
| Ajouter un panneau ancrable déclaratif | ctx.docks et mte.ui |
| Ajouter une page dans les Préférences | ctx.settings_page |
| Lire / écrire les contrôles d'un panneau à l'exécution | ctx.ui |
| Basculer une coche persistante sur un élément de menu | ctx.menus.set_item_checked |
Et ensuite¶
- Référence
plugin.json— chaque champ et son rôle. - Référence de l'API
ctx— référence méthode par méthode des cinq services de la phase 1. - Référence des événements — le tableau sujet ↔ dataclass.
- Empaquetage — où les dossiers de plugins doivent se trouver sur le disque.
- Dépannage — décoder les lignes de journal de l'hôte.
- Créer avec Claude — un guide compact que vous pouvez confier à un assistant IA pour qu'il produise un plugin à votre place.