Output shell yang aneh saat menggunakan IPython 5

37

Saya baru saja memutakhirkan ke versi terbaru dari IPython dan sekarang ada yang salah saat menggunakannya di emacs.

Ketika menggunakannya di terminal reguler, ia berfungsi dengan baik (warna, penyelesaian-tab, dll.), Namun baik dalam M-x eshellatau M-x shell, alih-alih In [1]:menghasilkan, itu sebenarnya keluaran [?12l[?25hdan Out[1]keluaran [J[?7h[?12l[?25h[?2004l[?7hOut[1]:.

Mungkin beberapa fitur terminal tidak tersedia pada emacs yang digunakan oleh IPython, tapi saya ingin tahu yang mana.

Terminal.app:

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

Emacs

[?12l[?25h2+2
[J[?7h[?12l[?25h[?2004l[?7hOut[1]: 4
Harfiah
sumber
Apakah Anda membuka bug di bagian hulu? Saya tidak dapat menemukan apa pun, tetapi juga agak sulit untuk mencari ATM dengan pengerjaan ulang Gmane.
rasmus
2
Sebagai referensi, bug upstream adalah # 25306
npostavs

Jawaban:

41

IPython 5 memiliki antarmuka terminal baru, yang tidak kompatibel dengan shell inferior Emacs. Untuk memperbaikinya, tambahkan --simple-promptbendera ke perintah IPython:

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

Dari dokumentasi:

Antarmuka baru tidak kompatibel dengan fitur 'inferior-shell' Emacs. Untuk terus menggunakan ini, tambahkan --simple-promptbendera ke perintah Emacs berjalan. Bendera ini menonaktifkan sebagian besar fitur IPython, bergantung pada Emacs untuk menyediakan hal-hal seperti penyelesaian tab.

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

Ricardo Lima
sumber
6
Ya, itulah yang saya lakukan pada awalnya, tetapi kurangnya dukungan multiline (yang paling penting untuk definisi fungsi) membuat saya kembali ke ipython 4. Perlu dicatat bahwa ipython 5 berfungsi dengan baik dengan istilah Mx.
Literal
3
Namun, pengaturan flag ini masih sangat berguna dengan Elpy — melalui variabel python-shell-interpreter-args. Jika Anda belum mencoba Elpy, Anda harus memeriksanya. Ini memungkinkan Anda untuk menulis definisi fungsi Anda di buffer terpisah dan dengan mudah meneruskannya ke penerjemah hanya dengan satu perintah. Dalam hal ini, Anda dapat menggunakan semua perintah pengeditan Emacs dan mendapatkan sesi interaktif — yang terbaik dari kedua dunia.
Ricardo Lima
1
@Literal alasan mengapa juga tertulis di tautan: mereka berubah dari menggunakan readlinemenjadi prompt_toolkitpada IPython 5. prompt_toolkittidak kompatibel dengan shell Emacs, yang bekerja secara berbeda dari term: sejauh yang saya tahu, shell menjalankan terminal bodoh dengan tujuan bekerja lebih seperti buffer Emacs standar, sedangkan termmenjalankan emulator terminal penuh yang sebenarnya. Tampaknya cangkang kompatibel dengan readlinetetapi tidak dengan prompt_toolkit, yang akan menjelaskan prompt yang menunjukkan urutan pelarian. Karena termmenjalankan terminal penuh, itu benar menafsirkan urutan melarikan diri.
Ricardo Lima
1
Saya tidak menerimanya karena saya ingin mempertahankan fitur lain, mungkin menggunakan mode shell lain dengan lebih banyak fitur. Tapi saya rasa saya harus hidup dengan itu.
Literal
1
@CodyChan Menonaktifkan fitur IPython yang berkaitan dengan UI, seperti penyelesaian, warna, dll. Ia menjaga hal-hal seperti% perintah ajaib, riwayat masukan / keluaran, perintah shell, perintah bantuan, dll.
jpkotta
0

Ada cara untuk membuka IPython di shell emacs tanpa menggunakan --simple-prompt

1. pip install rlipython

2. Open IPython in terminal

3. Run import rlipython; rlipython.install() 

Setelah ini, Anda harus dapat membuka ipython langsung di shell emacs tanpa mengalami masalah tampilan.

Ada satu masalah lagi dalam kasus saya: Untuk beberapa alasan, bahkan setelah tampilan menjadi benar, saya masih tidak bisa secara langsung menyalin dan menempelkan beberapa definisi kelas multi-baris ke ipython di shell emacs. Solusi saya saat ini adalah dengan menggunakan perintah% paste Ipython. Jika Anda memiliki pendekatan yang lebih baik, beri tahu saya.

PS: Saya menggunakan Ubuntu 16.04. Seseorang yang menggunakan MacOS mengatakan itu merusak IPython.

DataHungry
sumber
Ini merusak instalasi ipython
Diogo
dengan cara apa? itu berfungsi dengan baik untuk saya
DataHungry
Memecah
Alvin