Enviar búfer EMACS al proceso arbitrario de Python
-
25-10-2019 - |
Pregunta
me gusta el python-send-buffer
Comando, sin embargo, a menudo uso Python integrado en aplicaciones, o lanzar Python a través de un sistema de gestión de paquetes personalizado (para lanzar Python con ciertas dependencias). En otras palabras, no puedo ejecutar "Python" y obtener una instancia útil de Python (algo que python-send-buffer
se basa en)
Lo que me gustaría lograr es:
- En cualquier intérprete de Python (o aplicación que le permita evaluar el código de Python), importe un
magic_emacs_python_server.py
módulo (agregar asys.path
según sea necesario) - En emacs, corre
magic-emacs-python-send-buffer
Esto evaluaría el búfer en la instancia remota de Python.
Parece que debería ser bastante simple: el módulo Python escucha en un enchufe, en un hilo. Se evalúa en el hilo principal y devuelve el repr()
del resultado (o tal vez captura el stdout/stderr, o tal vez ambos). El módulo EMACS simplemente enviaría texto al enchufe, espera una cadena en respuesta y la muestra en un búfer.
Suena tan simple algo como esto ya debe existir ... Ipython tiene ipy_vimserver
, pero este es el camino incorrecto. También hay swank
, aunque parece muy específico de Lisp, hay un backend de JavaScript que se parece mucho a lo que quiero ... pero la búsqueda no encuentra casi nada, aparte de algunas vaga (posiblemente verdadera) afirma que el limo no funciona bien con idiomas no listos
En breve:
- ¿Existe un proyecto para enviar código de un búfer EMACS a un proceso de Python existente?
- Si no, ¿cómo recomendaría que escriba tal cosa (no estar muy familiarizado con Elisp) - Swank? ¿El código del servidor de Ipython? Servidor TCP simple desde cero?
Solución
reverencia Proporciona la mayor parte de la infraestructura para cosas como esta. Hay un montón de buenos ejemplos, como este o este
Le permite ejecutar un comando, proporciona cosas comint-send-string
para implementar fácilmente send-region
Escriba comandos.
DBR/RemoterePR en GitHub es una prueba de concepto de crudo de lo que describí en la pregunta.
Carece de cualquier tipo de esmalte, pero en su mayoría funciona: importe el replify.py
módulo en el intérprete de destino, luego evalúe el emacs-remote-repl.el
Después de arreglar el estúpido camino codificado a client.py
Otros consejos
No shell-command
¿Te da lo que estás buscando? Podrías escribir un script de envoltura o ajustar el #!
y sys.path
adecuadamente.