Странный вывод оболочки при использовании 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
буквальный
источник
Вы открыли ошибку вверх по течению? Я ничего не смог найти, но поиск банкомата также немного затруднит, так как Гман перерабатывается.
Расм
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. Этот флаг отключает большинство функций 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, что объясняет подсказку, показывающую escape-последовательности. Поскольку termработает полный терминал, он правильно интерпретирует escape-последовательности.
Рикардо Лима
1
Я не принял это, потому что мне хотелось бы сохранить другие функции, возможно, используя другой режим оболочки с большим количеством функций. Но, думаю, мне придется с этим смириться.
Буквально
1
@CodyChan Он отключает функции IPython, относящиеся к пользовательскому интерфейсу, такие как завершение, цвета и т. Д. Он хранит такие вещи, как% magic команды, история ввода / вывода, команды! Shell, команды help и т. Д.
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% paste. Если у вас есть лучшие подходы, пожалуйста, дайте мне знать.

PS: я использую Ubuntu 16.04. Кто-то использует MacOS, говорит, что это нарушает IPython.

DataHungry
источник
Это повреждает установку ipython
Диого
каким путем? у меня это отлично работает
DataHungry
Это нарушает IPython на MacOS, github.com/ludwigschwardt/python-gnureadline/issues/50
Элвин