Dziwne dane wyjściowe powłoki podczas korzystania z IPython 5

37

Właśnie uaktualniłem do najnowszej wersji IPython i teraz coś jest nie tak z używaniem go w emacsie.

Kiedy używasz go w zwykłym terminalu, działa dobrze (kolory, uzupełnianie tabulatorami itp.), Jednak albo w, M-x eshellalbo M-x shellzamiast wypisywania In [1]:, faktycznie wypisuje [?12l[?25hi Out[1]wypisuje do [J[?7h[?12l[?25h[?2004l[?7hOut[1]:.

Może to jakaś funkcja terminalu niedostępna w emacach używanych przez IPython, ale chciałbym wiedzieć, który to jest.

Terminal.app:

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

Emacs

[?12l[?25h2+2
[J[?7h[?12l[?25h[?2004l[?7hOut[1]: 4
Dosłowny
źródło
Czy otworzyłeś błąd wcześniej? Nie mogłem nic znaleźć, ale trochę trudniej jest też przeszukać bankomat przy przerabianiu Gmane.
rasmus
2
Dla porównania, błąd upstream to # 25306
npostavs

Odpowiedzi:

41

IPython 5 ma nowy interfejs terminala, który nie jest kompatybilny z gorszymi powłokami Emacsa. Aby to naprawić, dodaj --simple-promptflagę do polecenia IPython:

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

Z dokumentacji:

Nowy interfejs nie jest kompatybilny z funkcją „gorszej powłoki” Emacsa. Aby kontynuować korzystanie z tego, dodaj --simple-promptflagę do polecenia uruchamianego przez Emacsa. Ta flaga wyłącza większość funkcji IPython, polegając na Emacsie, aby zapewnić takie funkcje jak uzupełnianie tabulatorów.

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

Ricardo Lima
źródło
6
Tak, tak zrobiłem na początku, jednak brak obsługi wieloliniowej (najważniejszej dla definicji funkcji) zmusił mnie do powrotu do ipython 4. Należy zauważyć, że ipython 5 działa dobrze z terminem Mx.
Dosłowny
3
Ustawienie tej flagi jest jednak nadal bardzo przydatne w Elpy - poprzez zmienną python-shell-interpreter-args. Jeśli nie próbowałeś Elpy, powinieneś to sprawdzić. Umożliwia zapisanie definicji funkcji w oddzielnym buforze i łatwe przekazanie ich do tłumacza za pomocą tylko jednego polecenia. W takim przypadku możesz skorzystać ze wszystkich poleceń edycyjnych Emacsa i uzyskać interaktywną sesję - najlepiej z obu światów.
Ricardo Lima,
1
@Literal powód jest również napisane na link: zmienili używania readlinedo prompt_toolkitdnia ipython 5. prompt_toolkitnie jest kompatybilny z muszli Emacs, które działają inaczej term: o ile wiem, muszle uruchomić głupie terminale z celów pracy bardziej przypomina standardowy bufor Emacsa, podczas gdy termdziała rzeczywisty pełny emulator terminala. Wygląda na to, że powłoki są kompatybilne, readlineale nie z nimi prompt_toolkit, co wyjaśniałoby monit pokazujący sekwencje specjalne. Ponieważ termdziała pełny terminal, poprawnie interpretuje sekwencje specjalne.
Ricardo Lima,
1
Nie zaakceptowałem tego, ponieważ chciałbym zachować inne funkcje, być może używając innego trybu powłoki z większą liczbą funkcji. Ale chyba będę musiał z tym żyć.
Dosłowny
1
@CodyChan Wyłącza funkcje IPython związane z interfejsem użytkownika, takie jak uzupełnianie, kolory itp. Zachowuje takie rzeczy, jak% magiczne polecenia, historia wejścia / wyjścia, polecenia! Shell
,?
0

Istnieje sposób na otwarcie IPython w powłoce emacsa bez użycia --simple-prompt

1. pip install rlipython

2. Open IPython in terminal

3. Run import rlipython; rlipython.install() 

Następnie powinieneś być w stanie otworzyć ipython bezpośrednio w powłoce emacsa bez problemów z wyświetlaniem.

W moim przypadku jest jeszcze jeden problem: z jakiegoś powodu, nawet po poprawnym wyświetleniu, nadal nie mogłem bezpośrednio skopiować i wkleić niektórych definicji linii wieloliniowych do ipython w powłoce emacsa. Moje obecne rozwiązanie polega na użyciu polecenia Ipython% paste. Jeśli masz lepsze podejście, daj mi znać.

PS: Używam Ubuntu 16.04. Ktoś używa MacOS mówi, że łamie IPython.

DataHungry
źródło
Źródło
DataHungry
To psuje instalację ipython
Diogo
W którą stronę? działa dobrze dla mnie
DataHungry
Łamie
Alvin