¿Cómo uso las claves vi en ipython bajo * nix?

95

Actualmente en Bash utilizo set -o vipara habilitar el modo vi en mi indicador de bash.

¿Cómo hago para que esto funcione en ipython?

Nota: Si una respuesta se aplica a todos * nix, eliminaré OS X del título :)

gak
fuente

Respuestas:

166

En caso de que alguien haya entrado aquí recientemente, IPython 5.0 cambió de readline a prompt_toolkit , por lo que una respuesta actualizada a esta pregunta es pasar una opción:

$ ipython --TerminalInteractiveShell.editing_mode=vi

... o para configurarlo globalmente en la configuración del perfil ( ~/.ipython/profile_default/ipython_config.py; créelo con ipython profile createsi no lo tiene) con:

c.TerminalInteractiveShell.editing_mode = 'vi'
imírico
fuente
4
Vine aquí para publicar esta respuesta, gracias por
adelantarme
2
Gracias. Esto es muy difícil de encontrar en los documentos de IPython, Jupyter o prompt_toolkit.
enésimo
2
¿Dónde agrego mis asignaciones de enlace de claves personalizadas?
Aravinda
Mi respuesta a esta pregunta muestra una forma de agregar combinaciones de teclas personalizadas.
jellycola
2
¿Hay alguna forma de saber si estoy en modo normal o en modo de inserción?
Peeyush Kushwaha
32

Parece que una solución funciona para muchas otras aplicaciones compatibles con readline:

Establezca lo siguiente en su ~/.inputrcarchivo:

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

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

gak
fuente
7
Tenga mucho cuidado con set convert-meta on. Entra en conflicto con la entrada Unicode, por lo que si pega o escribe Unicode, puede activar varios eventos, lo que puede resultar sorprendente. Por ejemplo, intente escribir ü y verá un resultado interesante.
minrk
4
¿Sabes qué hacen las dos últimas líneas? Una comprobación rápida muestra que solo la primera línea proporciona combinaciones de teclas vi básicas; desearía saber si había una razón para agregar las demás.
weronika
@weronika Entonces, set convert-meta on(y cualquier cosa debajo de esa línea) solo se aplicará al modo de comando, no al modo de inserción.
s4y
6
Nota: Esto ya no funciona a partir de IPython 5.0.0. Vea la respuesta de @ imiric a continuación.
Jason Sundram
11

También puede cambiar de forma interactiva entre el modo Vi y el modo Emacs. De acuerdo con los documentos de readline para cambiar entre ellos, se supone que debe poder usar la combinación de teclas MCj, pero eso solo parece permitirme cambiar al modo vi, en mi Mac (donde ESC se usa como la tecla 'Meta' ) es: ESC+ CTRL+ j. Para volver al modo Emacs, se puede usar Ce, pero eso no pareció funcionar para mí, tuve que hacer MCe en su lugar, en mi Mac es: ESC+ CTRL+ e.

FYI my ~ / .inputrc se configura de la siguiente manera:

set meta-flag on
set input-meta on
set convert-meta off
set output-meta on
Pierz
fuente
¡He estado tratando de averiguar por qué MCj no estaba funcionando todo este tiempo!
shangxiao
9

ipythonusa la biblioteca readline y esto se puede configurar usando el ~/.inputrcarchivo. Puedes añadir

set editing-mode vi

a ese archivo para hacer que todas las readlineaplicaciones basadas usen combinaciones de teclas estilo vi en lugar de Emacs.

Noufal Ibrahim
fuente
9
ipythoncambió de readlinea una biblioteca de Python llamada, prompt_toolkitpor 5.0.0lo que esto ya no funciona.
jellycola
Gracias, esto fue muy útil para tratar con una versión antigua de IPython.
timgeb
8

Necesitaba poder cambiar de modo de forma interactiva en IPython 5 y descubrí que puede hacerlo recreando el administrador de mensajes sobre la marcha:

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

Puede configurar vi en su archivo de configuración de inicio .ipython. Cree uno si no lo tiene agregando un archivo ~/.ipython/profile_default/startup/llamado algo como start.py. He aquí un ejemplo:

# 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 * 

La última línea es si usa ipython con Django y desea importar todos sus modelos por defecto.

Gregorio
fuente