Saída de shell estranha ao usar o IPython 5

37

Acabei de atualizar para a versão mais recente do IPython e agora algo está errado ao usá-lo no emacs.

Ao usá-lo em um terminal regular, ele funciona bem (cores, preenchimento de guias, etc.); no entanto, em M-x eshellou M-x shell, em vez de emitir In [1]:, na verdade ele gera [?12l[?25he Out[1]envia para [J[?7h[?12l[?25h[?2004l[?7hOut[1]:.

Talvez seja algum recurso do terminal que não está disponível no emacs usado pelo IPython, mas eu gostaria de saber qual é.

Terminal.app:

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

Emacs

[?12l[?25h2+2
[J[?7h[?12l[?25h[?2004l[?7hOut[1]: 4
Literal
fonte
Você abriu um bug a montante? Não consegui encontrar nada, mas também é um pouco difícil procurar caixas eletrônicos com o Gmane sendo reformulado.
rasmus
2
Para referência, bug montante é # 25306
npostavs

Respostas:

41

O IPython 5 possui uma nova interface de terminal, que não é compatível com as conchas inferiores do Emacs. Para corrigi-lo, adicione o --simple-promptsinalizador ao comando IPython:

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

A partir da documentação:

A nova interface não é compatível com o recurso 'shell inferior' do Emacs. Para continuar usando isso, adicione o --simple-promptsinalizador ao comando que o Emacs executa. Esse sinalizador desativa a maioria dos recursos do IPython, contando com o Emacs para fornecer itens como conclusão de guias.

Referência: http://ipython.readthedocs.io/en/stable/whatsnew/version5.html#id1

Ricardo Lima
fonte
6
Sim, foi o que fiz no início, no entanto, a falta de suporte a várias linhas (mais importante para definições de funções) me fez voltar ao ipython 4. Deve-se notar que o ipython 5 funciona bem com o termo Mx.
Literal
3
Definir essa bandeira ainda é muito útil com Elpy, embora-through a variável python-shell-interpreter-args. Se você ainda não experimentou o Elpy, deve verificar. Ele permite que você escreva suas definições de função em um buffer separado e passe-as facilmente para o intérprete com apenas um comando. Nesse caso, você pode usar todos os comandos de edição do Emacs e obter uma sessão interativa - o melhor dos dois mundos.
Ricardo Lima
11
@ Literalmente, a razão pela qual também está escrita no link: eles mudaram de usar readlinepara prompt_toolkitno IPython 5. prompt_toolkitnão é compatível com os shells do Emacs, que funcionam de maneira diferente de term: até onde eu sei, os shells executam terminais burros com o objetivo de trabalhar mais como um buffer Emacs padrão, enquanto termexecuta um emulador de terminal completo real. Parece que as conchas são compatíveis com, readlinemas não com prompt_toolkit, o que explicaria o prompt mostrando as seqüências de escape. Como termexecuta um terminal completo, ele interpreta corretamente as seqüências de escape.
Ricardo Lima
11
Não aceitei porque gostaria de manter os outros recursos, talvez usando outro modo de shell com mais recursos. Mas acho que vou ter que viver com isso.
Literal
11
@CodyChan Ele desativa IPython características relacionadas à interface do usuário, como conclusão, cores, etc. Ele mantém as coisas como comandos% mágicas, input / output história, comandos shell, comandos de ajuda, etc.!?
jpkotta
0

Existe uma maneira de abrir o IPython no emacs shell sem usar --simple-prompt

1. pip install rlipython

2. Open IPython in terminal

3. Run import rlipython; rlipython.install() 

Depois disso, você poderá abrir o ipython diretamente no emacs shell sem enfrentar o problema de exibição.

No entanto, há mais um problema no meu caso: por alguma razão, mesmo após a exibição ficar correta, eu ainda não conseguia copiar e colar diretamente algumas definições de classe de várias linhas no ipython no emacs shell. Minha solução atual é usar o comando Ipython% paste. Se você tiver melhores abordagens, entre em contato.

PS: Estou usando o Ubuntu 16.04. Alguém usa o MacOS diz que quebra o IPython.

DataHungry
fonte
Corrompe a instalação do ipython
Diogo
em que direção? funciona bem para mim
DataHungry
Ele quebra o IPython no macOS, github.com/ludwigschwardt/python-gnureadline/issues/50
Alvin