Inviare emacs tampone arbitrariamente processo Python
-
25-10-2019 - |
Domanda
Mi piace il comando python-send-buffer
, però ho molto spesso usare Python incorporato in applicazioni, o lanciare Python attraverso un sistema di gestione dei pacchetti personalizzati (per lanciare Python con alcune dipendenze) .. In altre parole, non posso correre "python "e ottenere un utile esempio Python (qualcosa che si basa su python-send-buffer
)
Quello che vorrei realizzare è:
- in qualsiasi interprete Python (o applicazione che permette di valutare il codice Python), importare un modulo
magic_emacs_python_server.py
(aggiungendo alsys.path
se necessario) - In Emacs, eseguire
magic-emacs-python-send-buffer
Ciò valutare il buffer nel caso Python remoto.
Sembra che dovrebbe essere abbastanza semplice - gli ascolti modulo Python su un socket, in un thread. Si valuta nel thread principale, e restituisce la repr()
del risultato (o forse cattura l'output / error, o forse entrambi). Il modulo emacs sarebbe sufficiente inviare testo alla presa, attende una stringa in risposta, e visualizza in un buffer.
Sembra così semplice qualcosa di simile deve esistere già ... IPython ha ipy_vimserver
, ma questo è il modo sbagliato. C'è anche swank
, mentre sembra molto Lisp-specifica, v'è un Javascript backend che sembra molto come quello che voglio ... ma cercare reperti quasi niente, a parte alcuni (possibilmente vero) affermazioni vaghe che SLIME non funziona bene con lingue non Lisp
In breve:
- Esiste un progetto per esistere codice Inviare da un Emacs buffer per un processo Python esistente?
- Se no, come mi consiglia scrivo cosa del genere una (non essere molto familiare con elisp) - SWANK? codice del server di IPython? server TCP Semplice da zero?
Soluzione
COMINT fornisce la maggior parte delle infrastrutture per cose come questa. C'è un sacco di buoni esempi, come questo o questo
E 'consente di eseguire un comando, fornisce le cose comint-send-string
di implementare facilmente i comandi di tipo send-region
.
DBR / remoterepl su Github è un proof-of-concept di greggio quello che ho descritto nella domanda.
E 'priva di qualsiasi tipo di smalto, ma funziona per lo più - si importa il modulo replify.py
nell'interprete di destinazione, quindi valutare la emacs-remote-repl.el
dopo aver fissato il percorso hardcoded stupido client.py
Altri suggerimenti
non shell-command
ti danno quello che stai cercando? Si potrebbe scrivere uno script wrapper o regolare il #!
e sys.path
in modo appropriato.