Дивний вихід оболонки при використанні IPython 5


37

Я щойно оновив до останньої версії IPython, і тепер щось не вдається під час використання в emacs.

При використанні його у звичайному терміналі він працює добре (кольори, заповнення вкладки тощо), однак або в, M-x eshellабо M-x shellзамість виведення In [1]:, він фактично виводить [?12l[?25hі Out[1]виводить на [J[?7h[?12l[?25h[?2004l[?7hOut[1]:.

Можливо, це якась особливість терміналу, недоступного для emacs, використовуваних IPython, але я хотів би знати, який це.

Terminal.app:

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

Emacs

[?12l[?25h2+2
[J[?7h[?12l[?25h[?2004l[?7hOut[1]: 4

Ви відкрили помилку вище за течією? Я нічого не міг знайти, але також важко шукати банкомат із переробленням Gmane.
rasmus

2
Для довідки, вгору по течії помилка є # 25306
npostavs

Відповіді:


41

IPython 5 має новий термінальний інтерфейс, який не сумісний з нижчими оболонками Emacs. Щоб виправити це, додайте --simple-promptпрапор до команди IPython:

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

З документації:

Новий інтерфейс не сумісний з функцією Emacs 'inferior-shell'. Щоб продовжити використовувати це, додайте --simple-promptпрапор до команди Emacs run. Цей прапор вимикає більшість функцій IPython, покладаючись на Emacs, щоб надати такі речі, як завершення вкладки.

Довідка: http://ipython.readthedocs.io/en/stable/whatsnew/version5.html#id1


6
Так, я це зробив спочатку, проте відсутність підтримки багатолінійної лінії (що найважливіше для визначення функцій) змусило мене повернутися до ipython 4. Слід зазначити, що ipython 5 прекрасно працює з терміном Mx.
Літерал

3
Встановлення цього прапора все ще дуже корисно для Elpy, хоча через змінну python-shell-interpreter-args. Якщо ви ще не пробували Elpy, спробуйте це перевірити. Це дозволяє записати визначення своїх функцій в окремий буфер і легко передати їх інтерпретатору лише однією командою. У цьому випадку ви можете скористатися всіма командами редагування Emacs та отримати інтерактивний сеанс - найкращий з обох світів.
Рікардо Ліма

1
@Literal причина, чому також написано за посиланням: вони змінилися з використання readlineна prompt_toolkitна IPython 5. prompt_toolkitне сумісний із оболонками Emacs, які працюють інакше term: наскільки я знаю, оболонки запускають тупі термінали з метою роботи більше, як стандартний буфер Emacs, тоді як termпрацює фактичний повний емулятор терміналу. Здається, оболонки сумісні, readlineале не з ними prompt_toolkit, що пояснювало б швидке відображення послідовностей втечі. Оскільки termпрацює повний термінал, він правильно інтерпретує послідовності втечі.
Рікардо Ліма

1
Я не прийняв це, бо хотів би зберегти інші функції, можливо, використовуючи інший режим оболонки з більшою кількістю функцій. Але я думаю, мені доведеться з цим жити.
Літерал

1
@CodyChan Він вимикає функції IPython, що стосуються інтерфейсу користувача, як завершення, кольори тощо. Він зберігає такі речі, як% магічні команди, історія вводу / виводу, команди оболонки, команди довідки тощо
jpkotta

0

Існує спосіб відкрити IPython в оболонці emacs без використання --simple-prompt

1. pip install rlipython

2. Open IPython in terminal

3. Run import rlipython; rlipython.install() 

Після цього ви зможете відкрити ipython безпосередньо в оболонці emacs, не відчуваючи проблеми з відображенням.

Але в моєму випадку є ще одна проблема: З якоїсь причини, навіть після того, як показ став правильним, я все ще не міг безпосередньо скопіювати і вставити кілька визначень багаторядкових класів в ipython в оболонку emacs. Моє поточне рішення - використовувати команду вставки Ipython%. Якщо у вас є кращі підходи, будь ласка, повідомте мене про це.

PS: Я використовую Ubuntu 16.04. Хтось використовує MacOS каже, що він порушує IPython.



Це пошкоджує установку ipython
Diogo

в який спосіб? для мене це добре працює
DataHungry

Він порушує IPython на macOS, github.com/ludwigschwardt/python-gnureadline/isissue/50
Елвін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.