Ich mag die allgemeine Geschwindigkeit von zsh sehr, aber zwei Dinge nerven mich.
- Ich habe zu schlagen warten Sie einen Moment zwischen Flucht schlagen und Slash auf die Geschichte Suche zu erhalten schlagen (wenn es zu schnell getroffen Slash es sagt
zsh: do you wish to see all 514 possibilities (172 lines)
) - Nach dem Aufrufen des Einfügemodus durch Drücken von
a
oderA
kann ich den Punkt, an dem ich den Einfügemodus aufgerufen habe , nicht mehr rückgängig machen.
Ich weiß, dass 2 wie klassisches vi ist, aber ich mag den Vim-Stil besser.
command-line
zsh
Chas. Owens
quelle
quelle
i
zweimal drücken müssen, um in den Einfügemodus zurückzukehren, kann ich dieses Update wärmstens empfehlen !Antworten:
(1). Aus irgendeinem Grund verhält sich bindkey merkwürdig, wenn es um "/" geht:
<esc>
gefolgt von/
wird interpretiert als<esc-/>
. (Ich habe dieses Verhalten neulich beobachtet; ich bin mir nicht ganz sicher, was es verursacht.) Ich weiß nicht, ob es sich um einen Fehler oder eine Funktion handelt und ob es sich um eine Funktion handelt, die deaktiviert werden kann, aber Sie können es ziemlich einfach umgehen .Diese Tastenkombination ist wahrscheinlich an gebunden
_history-complete-older
, was zu dem unerwünschten Ergebnis führt - Sie können sie verwenden, umbindkey -L
zu sehen, ob dies der Fall ist.Jedenfalls, wenn Sie nichts dagegen haben die Einbußen bei tatsächlichen
<esc-/>
(zusammengedrückt, als Akkord) zu binden, können Sie sich erneut binden sie an den vi-Modus Geschichte Suchbefehl, so dass die Eingabe<esc>
anschließend/
macht das Gleiche zu jeder Typisierung Geschwindigkeit. =)Da dies als Akkord behandelt wird, wird der vi-Befehlsmodus nicht zuerst aufgerufen. Wir müssen also sicherstellen, dass dies zuerst geschieht. Zunächst müssen Sie eine Funktion definieren.
fpath
Platziere es irgendwo in deinem, wenn du das benutzt, oder platziere es anders in deinem .zshrc:Der Rest geht in Ihre .zshrc-Richtung:
Sollte gut zu gehen sein.
(2). Sie können die Rücktaste wie folgt korrigieren:
Wenn Sie ein ähnliches Verhalten für andere vi-Befehle wünschen:
quelle
^[/
nicht\e/
, aber das sind beide gültige Möglichkeiten, Flucht zu sagen. Die Änderung funktioniert einwandfrei. Jetzt, da ich etwas ausführlicher damit spiele, sieht es so aus, als ob der vi-Modus von zsh im Vergleich zu bash nicht funktioniert (oder zumindest nicht vollständig konfiguriert ist). Ein Beispiel hierfür ist die Tatsache, dass Sie nach dem Suchverlauf in den Einfügemodus versetzt werden. Ich muss in den Befehlsmodus zurückkehren, um n zu drücken und den nächsten Suchbegriff zu finden..vi-history-search-backward
. Ich schreibe es und bearbeite meine Antwort - versuche es später noch einmal.bindkey | grep <searchterm>
für einen der Begriffe mache , sind sie alle mit einem Präfix versehenvi-
. Muss ichbindkey
Befehle einrichten , denen kein Präfix vorangestellt istvi-
?Ich werde nur Frage (1) ansprechen.
Ihr Problem ist KEYTIMEOUT. Ich zitiere aus zshzle (1):
Diese 0,4s ist die Verzögerung, die Sie erfahren, nachdem Sie ESC geschlagen haben. Das Update besteht darin, KEYTIMEOUT in einer der Shell-Startdateien auf 0,01 Sekunden zu setzen:
Leider hat dies einen negativen Effekt: Andere Dinge laufen schief ...
Erstens gibt es jetzt ein Problem im vi-Befehlsmodus: Wenn Sie ESC eingeben, bleibt der Cursor hängen, und jedes Zeichen, das Sie als Nächstes eingeben, wird verschluckt. Dies liegt daran, dass ESC im vi-Befehlsmodus standardmäßig an nichts gebunden ist, es jedoch Widgets mit mehreren Zeichen gibt, die mit ESC beginnen (Cursortasten!). Wenn Sie also ESC drücken, wartet ZLE auf das nächste Zeichen ... und verbraucht es dann.
Der Fix besteht darin, ESC an etwas im Befehlsmodus zu binden und so sicherzustellen, dass das etwas nach $ KEYTIMEOUT Zentisekunden an ZLE übergeben wird. Jetzt können wir Bindungen, die mit ESC beginnen, im Befehlsmodus beibehalten, ohne diese negativen Auswirkungen. Ich binde ESC an die Glocke, die ich noch weniger aufdringlich finde als die Selbsteinfügung (und meine Shell wird stummgeschaltet):
Nächstes Problem: Es gibt standardmäßig einige Zwei-Tasten-Widgets, die im vi-Einfügemodus in ^ X beginnen. Diese werden unbrauchbar, wenn $ KEYTIMEOUT ganz nach unten gesetzt ist. Was ich tue, ist das Aufheben der Bindung von ^ X im vi-Einfügemodus (standardmäßig ist es das Einfügen selbst). Auf diese Weise können diese Zwei-Schlüssel-Widgets weiterarbeiten.
Sie verlieren die Bindung für die Selbsteinfügung, aber Sie können sie natürlich auch an etwas anderes binden. (Ich nicht, da ich nichts dafür habe.)
Das letzte Problem (das ich bis jetzt gefunden habe): Es gibt einige verbleibende Standard-Tastaturbelegungen, die wir "verlieren", weil wir $ KEYTIMEOUT ganz nach unten setzen: diejenigen, die mit ESC im vi-Einfügemodus beginnen und keine Cursortasten sind. Ich binde sie persönlich neu, um stattdessen mit ^ X zu beginnen:
quelle