Aller au contenu

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.

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

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.exe ou python3.exe sous Windows ; python3 sous macOS/Linux), ou
    • désigné par la variable d'environnement MTE_PYTHON (soit un chemin absolu vers un python.exe, soit un simple nom à rechercher sur le PATH).
  • Aucun paquet pip : la bibliothèque cliente mte de la phase 1 est livrée avec l'éditeur et ajoutée à sys.path pour 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