Comment utiliser les clés vi dans ipython sous * nix?

95

Actuellement dans Bash, j'utilise set -o vipour activer le mode vi dans mon invite bash.

Comment faire pour que cela se passe dans ipython?

Remarque: si une réponse s'applique à tous les * nix, je supprimerai l'OS X du titre :)

gak
la source

Réponses:

166

Au cas où quelqu'un se promènerait ici récemment, IPython 5.0 est passé de readline à prompt_toolkit , donc une réponse mise à jour à cette question est de passer une option:

$ ipython --TerminalInteractiveShell.editing_mode=vi

... ou pour le définir globalement dans la configuration du profil ( ~/.ipython/profile_default/ipython_config.py; créez-le avec ipython profile createsi vous ne l'avez pas) avec:

c.TerminalInteractiveShell.editing_mode = 'vi'
imirique
la source
4
Je suis venu ici pour poster cette réponse - merci de m'avoir battu :)
Jason Sundram
2
Merci. C'est extrêmement difficile à trouver n'importe où dans la documentation pour IPython, Jupyter ou prompt_toolkit.
nth
2
Où ajouter mes mappages de liaison de clé personnalisés?
Aravinda
Ma réponse à cette question montre une façon d'ajouter des raccourcis clavier personnalisés.
jellycola
2
Existe-t-il un moyen de savoir si je suis en mode normal ou en mode insertion?
Peeyush Kushwaha
32

On dirait qu'une solution fonctionne pour de nombreuses autres applications compatibles readline:

Définissez les éléments suivants dans votre ~/.inputrcfichier:

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

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

gak
la source
7
Soyez très prudent avec set convert-meta on. Il entre en conflit avec l'entrée Unicode, donc si vous collez ou tapez unicode, vous pouvez déclencher divers événements, ce qui peut être surprenant. Par exemple, essayez de taper ü et vous verrez un résultat intéressant.
minrk
4
Savez-vous ce que font les deux dernières lignes? Une vérification rapide montre que seule la première ligne donne les raccourcis clavier de base vi - j'aurais aimé savoir s'il y avait une raison d'ajouter les autres.
weronika
@weronika Donc, set convert-meta on(et tout ce qui se trouve en dessous de cette ligne) ne s'appliquera qu'au mode commande, pas au mode insertion.
s4y
6
Remarque: cela ne fonctionne plus à partir d'IPython 5.0.0. Voir la réponse de @ imiric ci-dessous.
Jason Sundram
11

Vous pouvez également basculer de manière interactive entre le mode Vi et le mode Emacs. Selon la documentation readline pour basculer entre eux, vous êtes censé pouvoir utiliser la combinaison de touches MCj, mais cela semble seulement me permettre de passer en mode vi - sur mon Mac (où ESC est utilisé comme touche `` Meta '' ) c'est: ESC+ CTRL+ j. Pour revenir en mode Emacs, on peut utiliser Ce mais cela ne semble pas fonctionner pour moi - je devais plutôt faire MCe - sur mon Mac c'est: ESC+ CTRL+ e.

Pour info, mon ~ / .inputrc est configuré comme suit:

set meta-flag on
set input-meta on
set convert-meta off
set output-meta on
Pierz
la source
J'ai essayé de comprendre pourquoi MCj ne fonctionnait pas tout ce temps!
shangxiao
9

ipythonutilise la bibliothèque readline et ceci est configurable à l'aide du ~/.inputrcfichier. Vous pouvez ajouter

set editing-mode vi

à ce fichier pour que toutes les readlineapplications basées utilisent des raccourcis clavier de style vi au lieu d'Emacs.

Noufal Ibrahim
la source
9
ipythoncommuté à partir readlined'une bibliothèque de python appelé prompt_toolkitdans 5.0.0si cela ne fonctionne plus.
jellycola
Merci, cela a été très utile pour traiter une ancienne version d'IPython.
timgeb
8

J'avais besoin de pouvoir changer de mode de manière interactive dans IPython 5 et j'ai trouvé que vous pouvez le faire en recréant le gestionnaire d'invites à la volée:

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

Vous pouvez définir vi dans votre fichier de configuration de démarrage .ipython. Créez-en un si vous ne l'avez pas en ajoutant un fichier ~/.ipython/profile_default/startup/appelé quelque chose comme start.py. Voici un exemple:

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

Cette dernière ligne concerne si vous utilisez ipython avec Django et que vous souhaitez importer tous vos modèles par défaut.

grégoire
la source