2010-12-27 8 views
6

Actualización: La pregunta aún no tiene una respuesta satisfactoria.IPython en Emacs. Evaluación rápida del código

Me gustaría "enviar" fragmentos de código a un intérprete de IPython en Emacs 23.2 (Linux). Suponiendo que ya he iniciado un shell IPython en un búfer en Emacs (por ejemplo, usando Python-mode.el y IPython.el), ¿hay alguna manera de seleccionar una región en un búfer diferente y "enviar" esta región al shell IPython ya iniciado?

He tratado C-c C-c (enviar-buffer-a-shell) y C-c | (enviar de región a-shell), pero esto sólo funciona siempre y cuando el código está escrito en Python y no en IPython (IPython puede ejecutar el código de Python). La razón parece ser que, para ambos comandos, Emacs crea un archivo temporal con la extensión .py (a diferencia de la extensión .ipy), que luego es interpretada por IPython como "código específico de Python". Esto me impide usar funciones específicas de IPython , como comandos mágicos.

En una nota aparte, también he leído que Emacs proporciona M-| ('shell-command-on-region') para ejecutar regiones seleccionadas en un shell. Para hacer esto con un intérprete de IPython, intenté configurar shell-file-name en mi ruta de IPython. Sin embargo, cuando corro después de seleccionar una región, Emacs me incita la siguiente:

comando de Shell en la región:

y si a continuación escribo RET, consigo la página del manual IPython en el *Shell Command Output* buffer, sin la región que se está ejecutando. ¿Hay algún comando específico de IPython que pueda usar para M-| ('shell-command-on-region') para que IPython ejecute mi código?

Gracias!

+1

Suponiendo que puede ejecutar ipython directamente, sospecho que realmente quiere irse 'shell-file-name' solo, y simplemente ingrese el nombre del ejecutable ipython en el prompt. Ese es el uso normal de 'shell-command-on-region', en cualquier caso. La historia del minibúfer recordará ese comando, por lo que puede repetirlo fácilmente con 'M- | M-p RET'. No estoy seguro de cómo funciona 'call-process-region', pero imagino que envía el texto de la región al comando como stdin, por lo que siempre que el comando ipython pueda tratar con la recepción de un script de esa manera, creo que debería para trabajar (aunque si no, podría representar el texto de ayuda). – phils

+0

Gracias phils, esa solución funciona, pero requiere abrir un nuevo shell de IPython (que toma algo de tiempo para comenzar) cada vez que necesito probar un fragmento de código –

Respuesta

1

¿Estás usando ipython.el? Debería funcionar bien con Emacs 23.

Si no, echa un vistazo a EmacsWiki: iPython Emacs 23.

También hay una sección en el libro de cocina IPython en Emacs (búsqueda de IPythonEmacs23; lo siento, no tengo derecho a publicar más de un enlace :(

vez que haya comenzado una ipython-shell (cc)! puede ejecutar fragmentos de código de regiones de cualquier tampón en esta cáscara ya empezado a utilizar "ejecutar región (" Cc | ")

Andreas

+0

Gracias Andreas. Ya estoy usando IPython.el El sitio de EmacsWiki es un poco confuso. ¿Has logrado enviar fragmentos de código específicos de IPython a un shell de IPython ya abierto en Emacs? –

+0

Tal vez malinterprete su pregunta, pero una vez que he comenzado un ipython-shell (Cc!) Puedo ejecutar fragmentos de código de regiones de cualquier buffer en este shell ya iniciado usando "Execute region (" Cc | ") – Andreas

+0

Agregué mi último comente la respuesta – Andreas

0

he encontrado una respuesta parcial a Q1:

Python-mode proporciona C-c C-c que puede enviar un búfer a un shell de Python ya abierto (de manera similar, C-c C-| puede enviar una región al shell), y si ipython.el está instalado, el shell de python predeterminado se establece en IPython.

Desafortunadamente, esto solo funciona para scripts de Python, y no para scripts de IPython. C-c C-c funciona copiando el búfer con el fragmento de código en un archivo temporal con la extensión .py que luego se envía al shell. Como el archivo tiene la extensión .py IPython lo ejecuta como si fuera código Python normal, y por lo tanto el fragmento de código no puede tener código específico de IPython (como comandos mágicos de IPython) ..

Cuestiones relacionadas