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

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'

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


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

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.


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

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.