Senden Sie den EMACS -Puffer an willkürlichen Python -Prozess
-
25-10-2019 - |
Frage
Ich mag python-send-buffer
Befehl, aber ich verwende jedoch sehr oft Python, die in Anwendungen eingebettet sind, oder starte Python über ein benutzerdefiniertes Paketverwaltungssystem (um Python mit bestimmten Abhängigkeiten zu starten). Mit anderen Worten, ich kann nicht einfach "Python" ausführen und eine nützliche Python -Instanz erhalten (etwas das python-send-buffer
beruht auf)
Was ich gerne erreichen möchte ist:
- In jedem Python -Dolmetscher (oder Anwendung, mit der Sie Python -Code bewerten können) importieren Sie a
magic_emacs_python_server.py
Modul (Anhang zusys.path
wie nötig) - In EMACs rennen
magic-emacs-python-send-buffer
Dies würde den Puffer in der Remote -Python -Instanz bewerten.
Es scheint, als ob es ziemlich einfach sein sollte - das Python -Modul hört in einem Thread auf einer Steckdose zu. Es bewertet im Hauptfaden und gibt die zurück repr()
des Ergebnisses (oder vielleicht den Stdout/Stderr oder vielleicht beides erfasst). Das EMACS -Modul sendet nur Text an den Socket, wartet als Antwort auf eine Zeichenfolge und zeigt ihn in einem Puffer an.
Klingt so einfach, dass so etwas schon existieren muss ... Ipython hat ipy_vimserver
, aber das ist der falsche Weg. Es gibt auch swank
, obwohl es sehr lispspezifisch erscheint, aber es gibt es Ein Javascript -Backend Was sehr ähnlich aussieht, was ich will ... aber das Suchen findet fast nichts, abgesehen von einigen vagen (möglicherweise wahren) Behauptungen, dass Schleim nicht gut mit nicht lisparnen Sprachen funktioniert
Zusamenfassend:
- Gibt es ein Projekt, um Code von einem EMACS -Puffer an einen vorhandenen Python -Prozess zu senden?
- Wenn nicht, wie würden Sie empfehlen, so etwas zu schreiben (nicht sehr vertraut mit Elisp) - Swank? Ipythons Servercode? Einfacher TCP -Server von Grund auf neu?
Lösung
Comint Bietet den größten Teil der Infrastruktur für solche Dinge. Es gibt ein paar gute Beispiele wie Dies oder Dies
Es ermöglicht Ihnen, einen Befehl auszuführen, bietet Dinge comint-send-string
leicht implementieren send-region
Geben Sie Befehle ein.
DBR/RemoterePle auf GitHub ist ein groben Proof-of-Concept von dem, was ich in der Frage beschrieben habe.
Es fehlt irgendeine Art von Politur, aber es funktioniert meistens - Sie importieren die replify.py
Modul im Zieldolmetscher und bewerten Sie dann die emacs-remote-repl.el
Nachdem Sie den dummen hartcodierten Weg zu behoben haben client.py
Andere Tipps
Nicht shell-command
Geben Sie Ihnen, wonach Sie suchen? Sie können ein Wrapper -Skript schreiben oder das anpassen #!
und sys.path
passend.