12 Stimmen

Gibt es eine Möglichkeit, Bash oder zsh mit einem Tastendruck vom Emacs-Modus in den vi-Modus zu schalten?

Ich würde gerne vorübergehend vom emacs-Modus in den vi-Modus wechseln können, da der vi-Modus manchmal besser, aber ich bin meist schon halb mit dem Tippen fertig, bevor ich merke, dass ich den vi-Modus verwenden möchte.

Ich möchte nicht dauerhaft in den vi-Modus wechseln, denn normalerweise bevorzuge ich den emacs-Modus auf der Kommandozeile, vor allem, weil ich daran gewöhnt bin und mir viele der Tastenanschläge im Laufe der Jahre zur zweiten Natur geworden sind. (Als Editor verwende ich emacs im Allgemeinen im viper-Modus, so dass ich mit beide vi- und emacs-Tastenkombinationen, da ich mich dabei ertappt habe, dass ich sie versehentlich ständig in vi benutzte und Dinge vermasselte, und weil ich in manchen Fällen vi-Tastenkombinationen einprägsamer und praktischer finde, und in anderen Fällen emacs).

14voto

Dennis Williamson Punkte 322329

Sie können eine Umschaltfunktion einrichten, da die Tastenbelegungen für den vi-Modus und den emacs-Modus getrennt sind.

$ set -o emacs
$ bind '"\ee": vi-editing-mode'
$ set -o vi
$ bind '"\ee": emacs-editing-mode'

Mit Alt-e (oder Esc e) können Sie nun zwischen den Modi umschalten.

Fügen Sie dies irgendwo in Ihrer Definition für PS1 damit Sie in Ihrer Eingabeaufforderung sehen können, in welchem Modus Sie sich befinden. Die Änderung wird nicht sofort angezeigt, wenn Sie zwischen den Modi wechseln, aber sie wird aktualisiert, wenn eine neue Eingabeaufforderung ausgegeben wird.

$(set -o | grep emacs.*on >/dev/null 2>&1 && echo E || echo V)

5voto

Cascabel Punkte 449595

Aha! Ich habe mir den Readline-Quelltext angesehen und herausgefunden, dass man das tun kann:

 "\M-v": vi-editing-mode
 "\M-e": emacs-editing-mode

Es scheint keinen Kippschalter zu geben, aber das ist wahrscheinlich gut genug!

Der Nachwelt zuliebe hier meine ursprüngliche Antwort, die für Leute nützlich sein könnte, die versuchen, Dinge zu tun, für die es keine Readline-Funktion gibt.

Hier ist eine Möglichkeit, wie Sie es einrichten können, wobei die aktuelle Befehlszeile gelöscht wird. Nicht das, was Sie wollen, ich weiß, aber vielleicht hilft es jemandem, der diese Frage findet. In ~/.inputrc:

"\M-v": "\C-k\C-uset -o vi\C-j" # alt (meta)-v: set vi mode
"\M-e": "\C-k\C-uset -o vi\C-j" # alt (meta)-e: set emacs mode

oder umzuschalten...das sollte funktionieren:

"\M-t": "\C-k\C-u[[ \"$SHELLOPTS\" =~ '\\bemacs\\b' ]] && set -o vi || set -o emacs\C-j"

Es handelt sich dabei im Wesentlichen um Aliase, die noch einen Schritt weiter gehen, um Tasten in Readline zuzuordnen, so dass Sie nicht erst einen Alias-Namen eingeben und die Eingabetaste drücken müssen.

3voto

Tom Hale Punkte 32065

Die folgenden .inputrc Linien ermöglichen Meta / Alt + E zum Umschalten zwischen emacs y vi-insert Modi.

Mooshing beide j y k führt Sie gleichzeitig zu vi-command Modus.

Anmerkung: Das einzige englische Wort mit "kj" ist "blackjack", kein Wort enthält "jk")

set keymap emacs
"\ee": vi-editing-mode
"jk": "\eejk"
"kj": "\eejk"

set keymap vi-insert
"\ee": emacs-editing-mode
"jk": vi-movement-mode
"kj": vi-movement-mode

set keymap vi-command
"\ee": emacs-editing-mode

Hinweis: Wenn Sie eine Bindung unter keymap emacs a vi-movement-mode zu versuchen, direkt zu vi-command Modus, wird die Eingabeaufforderung nicht aktualisiert, wenn Sie show-mode-in-prompt on Daher ist die oben beschriebene Abhilfe erforderlich.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X