Come si usano le chiavi vi in ​​ipython sotto * nix?


94

Attualmente in Bash utilizzo set -o viper abilitare la modalità vi nel mio prompt di bash.

Come posso ottenerlo in ipython?

Nota: se una risposta si applica a tutti i * nix, rimuoverò OS X dal titolo :)

Risposte:


165

Nel caso qualcuno sia entrato qui di recente, IPython 5.0 è passato da readline a prompt_toolkit , quindi una risposta aggiornata a questa domanda è passare un'opzione:

$ ipython --TerminalInteractiveShell.editing_mode=vi

... o per impostarlo globalmente nella configurazione del profilo ( ~/.ipython/profile_default/ipython_config.py; crealo con ipython profile createse non ce l'hai) con:

c.TerminalInteractiveShell.editing_mode = 'vi'

4
Sono venuto qui per pubblicare questa risposta - grazie per avermi battuto :)
Jason Sundram

2
Grazie. Questo è fastidiosamente difficile da trovare ovunque nei documenti per IPython, Jupyter o prompt_toolkit.
ennesimo

2
Dove aggiungo le mie associazioni di tasti personalizzate?
Aravinda

La mia risposta a questa domanda mostra un modo per aggiungere associazioni di tasti personalizzate.
jellycola

2
C'è un modo per controllare se sono in modalità normale o in modalità di inserimento?
Peeyush Kushwaha

32

Sembra che una soluzione funzioni per molte altre app compatibili con readline:

Imposta quanto segue nel tuo ~/.inputrcfile:

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

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


7
Stai molto attento con set convert-meta on. È in conflitto con la voce Unicode, quindi se incolli o digiti Unicode, puoi attivare vari eventi, il che potrebbe essere sorprendente. Ad esempio, prova a digitare ü e vedrai un risultato interessante.
minrk

4
Sai cosa fanno le ultime due righe? Un rapido controllo mostra che solo la prima riga fornisce le associazioni di tasti di base per vi: vorrei sapere se c'era un motivo per aggiungere le altre.
weronika


@weronika Quindi, set convert-meta on(e qualsiasi cosa sotto quella riga) si applicherà solo alla modalità di comando, non alla modalità di inserimento.
s4y

6
Nota: non funziona più a partire da IPython 5.0.0. Vedi la risposta di @ imiric di seguito.
Jason Sundram

11

Puoi anche passare interattivamente tra la modalità Vi e la modalità Emacs. Secondo i documenti di readline per passare da uno all'altro dovresti essere in grado di utilizzare la combinazione di tasti MCj ma questo sembra consentirmi solo di passare alla modalità vi - sul mio Mac (dove ESC è usato come tasto "Meta" ) è: ESC+ CTRL+ j. Per tornare alla modalità Emacs si può usare Ce ma non sembra funzionare per me - ho dovuto invece fare MCe - sul mio Mac è: ESC+ CTRL+ e.

Cordiali saluti, il mio ~ / .inputrc è impostato come segue:

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

Ho cercato di capire perché MCj non funzionava per tutto questo tempo!
shangxiao,

9

ipythonusa la libreria readline e questa è configurabile usando il ~/.inputrcfile. Puoi aggiungere

set editing-mode vi

a quel file per fare in modo che tutte le readlineapplicazioni basate usino combinazioni di tasti in stile vi invece di Emacs.


9
ipythonpassato da readlinea una libreria python chiamata prompt_toolkitin 5.0.0modo che non funzioni più.
jellycola

Grazie, è stato molto utile per gestire una vecchia versione di IPython.
timgeb

8

Avevo bisogno di essere in grado di cambiare modalità in modo interattivo in IPython 5 e ho scoperto che puoi farlo ricreando il prompt manager al volo:

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

0

Puoi impostare vi nel tuo file di configurazione di avvio .ipython. Creane uno se non ce l'hai aggiungendo un file a ~/.ipython/profile_default/startup/chiamato qualcosa di simile start.py. Ecco un esempio:

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

L'ultima riga è se usi ipython con Django e desideri importare tutti i tuoi modelli per impostazione predefinita.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.