Sortie de shell étrange lors de l'utilisation d'IPython 5

37

Je viens de mettre à jour la dernière version d'IPython et maintenant, quelque chose ne va pas quand je l'utilise dans emacs.

Lors de son utilisation dans un terminal régulier , il fonctionne très bien (couleurs, complétion par tabulation, etc.), mais soit dans M-x eshellou M-x shell, au lieu de outputing In [1]:, il en fait des sorties [?12l[?25het des Out[1]sorties [J[?7h[?12l[?25h[?2004l[?7hOut[1]:.

Peut-être que certaines fonctionnalités du terminal ne sont pas disponibles sur emacs utilisé par IPython, mais j'aimerais savoir de quoi il s'agit.

Terminal.app:

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

Emacs

[?12l[?25h2+2
[J[?7h[?12l[?25h[?2004l[?7hOut[1]: 4
Littéral
la source
Avez-vous ouvert un bug en amont? Je n'ai rien trouvé, mais il est également un peu difficile de rechercher un distributeur de billets avec Gmane qui a été retravaillé.
rasmus
2
Pour référence, le bogue en amont est # 25306
npostavs le

Réponses:

41

IPython 5 a une nouvelle interface de terminal incompatible avec les shells inférieurs d’Emacs. Pour résoudre ce problème, ajoutez l' --simple-promptindicateur à la commande IPython:

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

De la documentation:

La nouvelle interface n'est pas compatible avec la fonctionnalité 'inférieure-shell' d'Emacs. Pour continuer à l'utiliser, ajoutez l' --simple-promptindicateur à la commande exécutée par Emacs. Cet indicateur désactive la plupart des fonctionnalités IPython, s'appuyant sur Emacs pour fournir des éléments tels que la complétion par tabulation.

Référence: http://ipython.readthedocs.io/fr/stable/whatsnew/version5.html#id1

Ricardo Lima
la source
6
Oui, c'est ce que j'ai fait au début, mais le manque de support multiligne (le plus important pour les définitions de fonctions) m'a fait revenir à ipython 4. Il faut noter cependant que ipython 5 fonctionne bien avec le terme Mx.
Littéral
3
La définition de cet indicateur est toujours très utile avec Elpy, via la variable python-shell-interpreter-args. Si vous n'avez pas essayé Elpy, vous devriez y jeter un coup d'œil. Il vous permet d'écrire vos définitions de fonction dans un tampon séparé et de les passer facilement à l'interpréteur avec une seule commande. Dans ce cas, vous pouvez utiliser toutes les commandes d'édition d'Emacs et obtenir une session interactive, le meilleur des deux mondes.
Ricardo Lima
1
La raison pour laquelle @Literal est également écrit sur le lien: ils sont passés d’utilisation readlineà prompt_toolkitIPython 5. prompt_toolkitn’est pas compatible avec les shells d’Emacs, qui fonctionnent différemment de term: pour autant que je sache, les shells utilisent des terminaux stupides dans le but de fonctionner plus comme un tampon Emacs standard, alors qu’il termexécute un véritable émulateur de terminal. Il semble que les obus soient compatibles avec readlinemais pas avec prompt_toolkit, ce qui expliquerait l'invite affichant les séquences d'échappement. Depuis termexécute un terminal complet, il interprète correctement les séquences d'échappement.
Ricardo Lima
1
Je ne l'ai pas accepté car j'aurais aimé conserver les autres fonctionnalités, en utilisant peut-être un autre mode shell avec plus de fonctionnalités. Mais je suppose que je devrai vivre avec.
Littéralement
1
@CodyChan Désactive les fonctionnalités IPython relatives à l'interface utilisateur, telles que l'achèvement, les couleurs, etc. Il conserve des éléments tels que les commandes% magiques, l'historique des entrées / sorties, les commandes! Shell, les commandes? Help, etc.
jpkotta
0

Il existe un moyen d'ouvrir IPython dans le shell emacs sans utiliser --simple-prompt

1. pip install rlipython

2. Open IPython in terminal

3. Run import rlipython; rlipython.install() 

Après cela, vous devriez pouvoir ouvrir ipython directement dans le shell emacs sans rencontrer le problème d'affichage.

Il y a cependant un autre problème dans mon cas: pour une raison quelconque, même après que l'affichage soit devenu correct, je ne pouvais toujours pas copier-coller directement certaines définitions de classe multiligne dans ipython dans le shell emacs. Ma solution actuelle consiste à utiliser la commande Ipython% paste. Si vous avez de meilleures approches, s'il vous plaît faites le moi savoir.

PS: J'utilise Ubuntu 16.04. Quelqu'un utilise MacOS dit qu'il casse IPython.

DataHungry
la source
Cela corrompt l'installation d'ipython
Diogo le
de quelle manière? ça marche très bien pour moi
DataHungry
Il casse IPython sur macOS, github.com/ludwigschwardt/python-gnureadline/issues/50
Alvin