Como faço para usar chaves vi em ipython em * nix?


94

Atualmente no Bash eu uso set -o vipara habilitar o modo vi no prompt do bash.

Como faço para fazer isso no ipython?

Nota: Se uma resposta se aplica a todos os * nix, removerei o OS X do título :)

Respostas:


165

No caso de alguém estar vagando por aqui recentemente, o IPython 5.0 mudou de readline para prompt_toolkit , então uma resposta atualizada a esta pergunta é passar uma opção:

$ ipython --TerminalInteractiveShell.editing_mode=vi

... ou para defini-lo globalmente na configuração do perfil ( ~/.ipython/profile_default/ipython_config.py; crie-o com ipython profile createse você não tiver) com:

c.TerminalInteractiveShell.editing_mode = 'vi'

4
Eu vim aqui para postar esta resposta - obrigado por me
antecipar

2
Obrigado. Isso é irritantemente difícil de encontrar em qualquer lugar na documentação do IPython, Jupyter ou prompt_toolkit.
enésimo

2
Onde adiciono meus mapeamentos de vinculação de tecla personalizados?
Aravinda

Minha resposta a esta pergunta mostra uma maneira de adicionar combinações de teclas personalizadas.
jellycola

2
Existe alguma maneira de saber se estou no modo normal ou no modo de inserção?
Peeyush Kushwaha

32

Parece que uma solução funciona para muitos outros aplicativos compatíveis com readline:

Defina o seguinte em seu ~/.inputrcarquivo:

set editing-mode vi
set keymap vi
set convert-meta on

Fonte: http://www.jukie.net/bart/blog/20040326082602


7
Tenha muito cuidado com set convert-meta on. Ele entra em conflito com a entrada Unicode, portanto, se você colar ou digitar Unicode, poderá acionar vários eventos, o que pode ser surpreendente. Por exemplo, tente digitar ü e você verá um resultado interessante.
minrk de

4
Você sabe o que as duas últimas linhas fazem? Uma verificação rápida mostra que apenas a primeira linha fornece atalhos de teclado básicos do vi - eu gostaria de saber se há uma razão para adicionar as outras.
weronika


@weronika Portanto, set convert-meta on(e qualquer coisa abaixo dessa linha) só se aplica ao modo de comando, não ao modo de inserção.
s4y

6
Nota: Isso não funciona mais a partir do IPython 5.0.0. Veja a resposta de @imiric abaixo.
Jason Sundram

11

Você também pode alternar interativamente entre o modo Vi e o modo Emacs. De acordo com os documentos do readline para alternar entre eles você deve ser capaz de usar a combinação de teclas MCj, mas isso só me permite mudar para o modo vi - no meu Mac (onde ESC é usado como a tecla 'Meta' ) é: ESC+ CTRL+ j. Para voltar ao modo Emacs, pode-se usar Ce, mas isso não pareceu funcionar para mim - eu tive que fazer o MCe - no meu Mac é: ESC+ CTRL+ e.

Para sua informação, meu ~ / .inputrc é configurado da seguinte forma:

set meta-flag on
set input-meta on
set convert-meta off
set output-meta on

Tenho tentado descobrir por que MCj não estava funcionando todo esse tempo!
shangxiao

9

ipythonusa a biblioteca readline e isso é configurável usando o ~/.inputrcarquivo. Você pode adicionar

set editing-mode vi

a esse arquivo para fazer com que todos os readlineaplicativos baseados usem atalhos de teclado no estilo vi ao invés do Emacs.


9
ipythonmudado de readlineuma biblioteca python chamado prompt_toolkitde 5.0.0modo que este não funciona mais.
jellycola

Obrigado, isso foi muito útil para lidar com uma versão antiga do IPython.
timgeb de

8

Eu precisava ser capaz de alternar os modos interativamente no IPython 5 e descobri que você pode fazer isso recriando o gerenciador de prompt na hora:

a = get_ipython().configurables[0]; a.editing_mode='vi'; a.init_prompt_toolkit_cli()

0

Você pode definir o vi em seu arquivo de configuração de inicialização .ipython. Crie um se não o tiver, adicionando um arquivo a ~/.ipython/profile_default/startup/algo como start.py. Aqui está um exemplo:

# Initializing script for ipython in ~/.ipython/profile_default/startup/
from IPython import get_ipython
ipython = get_ipython()

# If in ipython, set vi and load autoreload extension
if 'ipython' in globals():
    ipython.editing_mode = 'vi'
    ipython.magic('load_ext autoreload')
    ipython.magic('autoreload 2')
from Myapp.models import * 

A última linha é se você usa ipython com Django e deseja importar todos os seus modelos por padrão.

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.