Salida de shell extraña cuando se usa IPython 5

37

Acabo de actualizar a la última versión de IPython y ahora algo está mal cuando lo uso en emacs.

Cuando se usa en un terminal normal, funciona bien (colores, finalización de tabulación, etc.), sin embargo, ya sea en M-x eshello M-x shell, en lugar de generar In [1]:, realmente emite [?12l[?25hy se Out[1]envía a [J[?7h[?12l[?25h[?2004l[?7hOut[1]:.

Tal vez sea una característica del terminal que no está disponible en los emacs utilizados por IPython, pero me gustaría saber cuál es.

Terminal.app:

In [1]: 2+2
Out[1]: 4

Emacs

[?12l[?25h2+2
[J[?7h[?12l[?25h[?2004l[?7hOut[1]: 4
Literal
fuente
¿Abriste un error aguas arriba? No pude encontrar nada, pero también es un poco difícil buscar cajeros automáticos con Gmane siendo reelaborado.
rasmus
2
Como referencia, el error aguas arriba es # 25306
npostavs

Respuestas:

41

IPython 5 tiene una nueva interfaz de terminal, que no es compatible con los shells inferiores de Emacs. Para solucionarlo, agregue la --simple-promptbandera al comando IPython:

(setq python-shell-interpreter "ipython"
    python-shell-interpreter-args "--simple-prompt -i")

De la documentación:

La nueva interfaz no es compatible con la función 'shell inferior' de Emacs. Para continuar usando esto, agregue la --simple-promptbandera al comando que ejecuta Emacs. Este indicador deshabilita la mayoría de las funciones de IPython, confiando en Emacs para proporcionar cosas como completar pestañas.

Referencia: http://ipython.readthedocs.io/en/stable/whatsnew/version5.html#id1

Ricardo Lima
fuente
66
Sí, eso fue lo que hice al principio, sin embargo, la falta de soporte multilínea (lo más importante para las definiciones de funciones) me hizo volver a ipython 4. Sin embargo, debe tenerse en cuenta que ipython 5 funciona bien con el término Mx.
Literal
3
Poniendo esta bandera sigue siendo muy útil con Elpy, aunque a través de la variable python-shell-interpreter-args. Si no has probado Elpy, deberías echarle un vistazo. Le permite escribir las definiciones de sus funciones en un búfer separado y pasarlas fácilmente al intérprete con solo un comando. En este caso, puede utilizar todos los comandos de edición de Emacs y obtener una sesión interactiva, lo mejor de ambos mundos.
Ricardo Lima
1
@Literal la razón por la que también está escrita en el enlace: cambiaron de usar readlinea prompt_toolkiten IPython 5. prompt_toolkitno es compatible con los shells de Emacs, que funcionan de manera diferente a term: hasta donde yo sé, los shells ejecutan terminales tontos con el propósito de funcionar más como un búfer estándar de Emacs, mientras que termejecuta un emulador de terminal completo real. Parece que los shells son compatibles con, readlinepero no con prompt_toolkit, lo que explicaría el aviso que muestra las secuencias de escape. Como termejecuta un terminal completo, interpreta correctamente las secuencias de escape.
Ricardo Lima
1
No lo acepté porque me hubiera gustado conservar las otras funciones, tal vez usando otro modo de shell con más funciones. Pero supongo que tendré que vivir con eso.
Literal
1
@CodyChan Desactiva las funciones de IPython relacionadas con la interfaz de usuario, como finalización, colores, etc. Mantiene cosas como% comandos mágicos, historial de entrada / salida, comandos de shell, comandos de ayuda, etc.
jpkotta
0

Hay una manera de abrir IPython en el shell de emacs sin usar --simple-prompt

1. pip install rlipython

2. Open IPython in terminal

3. Run import rlipython; rlipython.install() 

Después de esto, debería poder abrir ipython directamente en el shell de emacs sin experimentar el problema de visualización.

Sin embargo, hay un problema más en mi caso: por alguna razón, incluso después de que la visualización se volvió correcta, todavía no podía copiar y pegar directamente algunas definiciones de clase de varias líneas en ipython en el shell de emacs. Mi solución actual es usar el comando Ipython% paste. Si tiene mejores enfoques, hágamelo saber.

PD: estoy usando Ubuntu 16.04. Alguien usa MacOS dice que rompe IPython.

DataHungry
fuente
Daña la instalación de ipython
Diogo
¿de qué manera? funciona bien para mí
DataHungry