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 :)

gak
fonte

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'
imírico
fonte
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

gak
fonte
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
Pierz
fonte
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.

Noufal Ibrahim
fonte
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()
Lex R
fonte
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.

Gregory
fonte