Wie verwende ich vi-Schlüssel in ipython unter * nix?

94

Derzeit set -o viaktiviere ich in Bash den vi-Modus in meiner Bash-Eingabeaufforderung.

Wie bringe ich das in ipython zum Laufen?

Hinweis: Wenn eine Antwort für alle * nix gilt, entferne ich OS X aus dem Titel :)

gak
quelle

Antworten:

165

Für den Fall, dass kürzlich jemand hierher gekommen ist, hat IPython 5.0 von readline zu prompt_toolkit gewechselt . Eine aktualisierte Antwort auf diese Frage besteht darin, eine Option zu übergeben:

$ ipython --TerminalInteractiveShell.editing_mode=vi

... oder um es global in der Profilkonfiguration festzulegen ( ~/.ipython/profile_default/ipython_config.py; erstellen Sie es mit, ipython profile createwenn Sie es nicht haben) mit:

c.TerminalInteractiveShell.editing_mode = 'vi'
imirisch
quelle
4
Ich bin hierher gekommen, um diese Antwort zu posten - danke, dass du mich geschlagen hast :)
Jason Sundram
2
Vielen Dank. Dies ist in den Dokumenten für IPython, Jupyter oder prompt_toolkit ärgerlich schwer zu finden.
n.
2
Wo füge ich meine benutzerdefinierten Schlüsselbindungszuordnungen hinzu?
Aravinda
Meine Antwort auf diese Frage zeigt eine Möglichkeit, benutzerdefinierte Tastenkombinationen hinzuzufügen.
Jellycola
2
Gibt es eine Möglichkeit zu verfolgen, ob ich mich im normalen Modus oder im Einfügemodus befinde?
Peeyush Kushwaha
32

Es sieht so aus, als ob eine Lösung für viele andere Readline-kompatible Apps funktioniert:

Stellen Sie Folgendes in Ihre ~/.inputrcDatei ein:

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

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

gak
quelle
7
Sei sehr vorsichtig mit set convert-meta on. Dies steht in Konflikt mit der Unicode-Eingabe. Wenn Sie also Unicode einfügen oder eingeben, können Sie verschiedene Ereignisse auslösen, was überraschend sein kann. Versuchen Sie beispielsweise, ü einzugeben, und Sie werden ein interessantes Ergebnis sehen.
Minrk
4
Wissen Sie, was die letzten beiden Zeilen bewirken? Eine kurze Überprüfung zeigt, dass nur die erste Zeile grundlegende vi-Tastenkombinationen enthält. Ich wünschte, ich wüsste, ob es einen Grund gibt, die anderen hinzuzufügen.
Weronika
@weronika Also set convert-meta on(und alles unterhalb dieser Zeile) gilt nur für den Befehlsmodus, nicht für den Einfügemodus.
s4y
6
Hinweis: Dies funktioniert ab IPython 5.0.0 nicht mehr. Siehe die Antwort von @ imiric unten.
Jason Sundram
11

Sie können auch interaktiv zwischen dem Vi-Modus und dem Emacs-Modus wechseln. Laut den Readline-Dokumenten , um zwischen ihnen zu wechseln, sollten Sie in der Lage sein, die MCj-Tastenkombination zu verwenden, aber das scheint mir nur zu erlauben, in den vi-Modus zu wechseln - auf meinem Mac (wo ESC als 'Meta'-Taste verwendet wird ) es ist: ESC+ CTRL+ j. Um wieder in den Emacs-Modus zu wechseln, kann man Ce verwenden, aber das schien bei mir nicht zu funktionieren - ich musste stattdessen MCe machen - auf meinem Mac ist es: ESC+ CTRL+ e.

Zu Ihrer Information, mein ~ / .inputrc ist wie folgt eingerichtet:

set meta-flag on
set input-meta on
set convert-meta off
set output-meta on
Pierz
quelle
Ich habe versucht herauszufinden, warum MCj die ganze Zeit nicht funktioniert hat!
Shangxiao
9

ipythonverwendet die Readline-Bibliothek und diese kann mithilfe der ~/.inputrcDatei konfiguriert werden . Du kannst hinzufügen

set editing-mode vi

In dieser Datei verwenden alle readlinebasierten Anwendungen Tastenkombinationen im vi-Stil anstelle von Emacs.

Noufal Ibrahim
quelle
9
ipythonvon schaltete readlineauf eine Python - Bibliothek namens prompt_toolkitin 5.0.0so dass diese nicht mehr funktioniert.
Jellycola
Vielen Dank, dies war sehr nützlich für den Umgang mit einer alten Version von IPython.
Timgeb
8

Ich musste in IPython 5 in der Lage sein, den Modus interaktiv zu wechseln, und ich stellte fest, dass Sie dies tun können, indem Sie den Eingabeaufforderungs-Manager im laufenden Betrieb neu erstellen:

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

Sie können vi in ​​Ihrer .ipython-Startkonfigurationsdatei festlegen. Erstellen Sie eine, wenn Sie sie nicht haben, indem Sie eine Datei hinzufügen, ~/.ipython/profile_default/startup/die so etwas wie aufgerufen heißt start.py. Hier ist ein Beispiel:

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

Diese letzte Zeile ist, wenn Sie ipython mit Django verwenden und standardmäßig alle Ihre Modelle importieren möchten.

Gregory
quelle