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

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


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.



Corrompe a instalação do ipython
— Diogo

em que direção? funciona bem para mim
— DataHungry

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.