
Ich verwende die zsh-Shell als Standard-Shell sowohl unter Ubuntu als auch unter Arch.
Ich habe eine Verknüpfung (den Aufwärtspfeil) zur automatischen Vervollständigung aus dem Verlauf in meiner ZSH-Shell konfiguriert, indem ich die folgende Zeile in meiner verwendet habe .zshrc
:
bindkey "^[[A" history-beginning-search-backward
Wenn ich jedoch .zshrc
in Ubuntu die Quelle ausführe und/oder einen Neustart durchführe, funktioniert die Verknüpfung nicht (ich erhalte nur den vorherigen Befehl, unabhängig davon, was ich eingegeben habe). In Arch hingegen funktioniert sie einwandfrei (ich erhalte nur den letzten Befehl, beginnend mit dem, was ich eingegeben habe).
Weiß jemand, wie man das löst?
Antwort1
Auf den meisten xterm-ähnlichen Terminals Upsendet das (und das ist bei den meisten Navigationstasten ähnlich) entweder ␛[A
oder, ␛OA
je nachdem, ob das Terminal inTastatur sendenModus oder nicht. Die Einträge smkx
und rmkx
terminfo können verwendet werden, um ein Terminal in diesen Modus zu versetzen oder aus diesem Modus zu entfernen.
Der kcuu1
Terminfo-Eintrag (Taste Cursor nach oben um 1) beschreibt die Sequenz, die gesendet wird, Upwenn inTastatur sendenModus, das heißt ␛OA
.
Debian und Derivate haben eine /etc/zsh/zshrc
Datei, die
function zle-line-init () {
emulate -L zsh
printf > /dev/tty '%s' ${terminfo[smkx]}
}
Dadurch wird das Terminal in diesen Modus versetzt, wenn zle aktiv ist. Das bedeutet, dass Sie sich jetzt auf die Terminfo-Datenbank verlassen können, um zu wissen, welche Zeichenfolgen Tasten übertragen.
Die Dateidefiniert ein $key
assoziatives Arraybasierend auf den Terminfo-Einträgen, um Ihnen dabei zu helfen, diese Widgets zuzuordnen. Auf diesen Systemen können Sie also Folgendes tun:
(($+key[Up])) && bindkey $key[Up] history-beginning-search-backward
Für etwas, das auf Systemen funktioniert, bei denen sich das Terminal inTastatur sendenModus und denen, die den Hash nicht haben oder nicht haben $key
, können Sie Folgendes tun:
bindkey $terminfo[kcuu1] history-beginning-search-backward
bindkey ${terminfo[kcuu1]/O/[} history-beginning-search-backward
Siehe auch:
Antwort2
Cursortasten machen Spaß.
Obwohl sie nicht ganz so viel Spaß machen wie das Bearbeiten von Schlüsseln, dieWirklichSpaß.
Du hastzwei Setsvon Cursortasten auf Ihrer Tastatur, die auf derCursor-Tastaturund diejenigen auf derTaschenrechner-Tastatur.
Die meisten Terminalemulatoren versuchen (manchmal recht schlecht) das Modell von DEC VTs zu verwenden, bei denen jeder Tastensatz einzeln umschaltbar ist zwischenAnwendungsmodusUndnormaler ModusVerwenden Sie hierzu die Einstellungen für den privaten Modus DECCKM
(Cursor-Tastaturmodus) bzw. DECNKM
(Ziffernblockmodus). Die Idee des Anwendungsmodus besteht im Wesentlichen darin, dass die Tasten auf dem entsprechenden Tastenblock in zusätzliche Anwendungsfunktionstasten umgewandelt werden.
-
⇐ Dies ist der Cursor-Tastenblock.
-
- Im Normalmodus senden die Pfeiltasten die ECMA-48- Steuersequenzen
CUB
,CUF
,CUU
, und , es sei denn, der Modifikator ist aktiv. In diesem Fall senden sie Steuersequenzen.CUD
⎇ AltDECFNK
- Im Anwendungsmodus senden die Pfeiltasten
SS3
Single-Shift-3-Sequenzen.
- Im Normalmodus senden die Pfeiltasten die ECMA-48- Steuersequenzen
-
⇐ Dies ist die Tastatur des Taschenrechners.
-
- Im Normalmodus senden die Pfeiltasten die ECMA-48- Steuersequenzen
CUB
,CUF
,CUU
, und , es sei denn, der Modifikator ist aktiv; in diesem Fall senden sie Steuersequenzen, oder die Kombination aus Ziffernblock und Umschalttaste bewirkt, dass sie Ziffern senden.CUD
⎇ AltDECFNK
- Im Anwendungsmodus senden die Pfeiltastenein anderer Satz von
SS3
Single-Shift-3-Sequenzen (es sei denn, die Kombination aus Ziffernblock und Shift bewirkt wiederum, dass Ziffern gesendet werden).
- Im Normalmodus senden die Pfeiltasten die ECMA-48- Steuersequenzen
Die ␛
[
A
Sequenz, die Sie ZLE angewiesen haben, an ein Widget zu binden, ist ein 7-Bit-Alias von ECMA-48 für die CSI
A
Steuersequenz, also die CUP
Steuersequenz („Cursor UP“). Diese Steuersequenz wird von DEC VTs und ihren nachahmenden Terminalemulatoren nur generiert, wenn sich eine Tastatur im Normalmodus befindet und der ⎇ AltModifikator nicht aktiv ist. Sie stimmt nicht mit den Umschaltsequenzen überein, die gesendet werden, wenn sich die entsprechenden Tastaturen im Anwendungsmodus befinden.
Die Terminfo-Datenbank trübt das Wasser und sorgt hier für zusätzlichen Spaß, da sie dieses Modell nicht für Terminal-E/A verwendet. Stattdessen verwendet sie ihre eigeneandersModell, das Begriffe wie „lokale“ und „entfernte“ Tasten enthält, was bei der Umschaltung zwischen DEC VT-Anwendung und Normalmodus eigentlich gar nicht der Fall ist; und es verfügt über einen einzigen lokalen/entfernten Umschaltmechanismus, der letztendlich umschaltetbeideTastaturen zwischen Anwendungs-/Normalmodus untrennbar.
Mit terminfo müssen Sie Ihre ZLE-Konfiguration nicht auf einen bestimmten Terminaltyp festlegen, falls Sie ein Terminal oder einen Terminalemulator haben, der kein DEC VT imitiert. Und die Z-Shell bietet Ihnen Möglichkeiten, auf die erforderlichen Fähigkeitseinträge aus dem Datenbankeintrag zuzugreifen. So können Sie aus terminfo lesen, welche Steuersequenzen terminfo von den Auf-/Ab-/Links-/Rechts-Cursortasten erwartet, und entsprechende bindkey
Befehle ausgeben, die diese Steuersequenzen Widgets zuordnen.
Das Problem ist, dass terminfo für diese Aufgabe ungeeignet ist. Es hat nur eine Möglichkeit,einsSteuersequenz pro Taste, wobei Tasten, wie Sie sehen können, senden könnenmindestensdrei verschiedene Sequenzen, abhängig vom Modus und den gedrückten Modifikatoren. (Modifikatoren können gesendete Steuersequenzen im DEC VT-Modell ziemlich stark beeinflussen.) Sie müssen das Terminal also in den Modus schalten, der das generiert, was terminfo Ihnen als zu erwartend anzeigt.
Aber es kommt noch schlimmer: terminfo ist nicht konsistent. Die einzelne Steuersequenz ist manchmal die DEC VT-Anwendungsmodussequenz, wie terminfo fürder putty
Terminaltyp, manchmal die DEC VT-Normalmodussequenz, wie terminfo aufzeichnet fürder rxvt
Terminaltyp, aber nie die DECFNK
Reihenfolge. Sie wissen also nicht, ob Sie bei einem bestimmten Terminal oder Terminalemulator in den Anwendungsmodus oder in den Normalmodus wechseln sollten. Was bei dem einen gut funktioniert, kann bei dem anderen schiefgehen.
Der andere Ansatz besteht daher darin, terminfo zu ignorieren und zu erkennen, dass Siebereitsund gehen Sie ganz unbekümmert davon aus, dass Ihr Terminal mit Ihrem ursprünglichen Befehl immer wie ein DEC VT reagiert bindkey
. Sie benötigen nur zwei davon, um sicherzustellen, dass die von Ihrem Terminal gesendete Steuersequenz übereinstimmt, egal ob sich Ihr Terminal im Anwendungs- oder Normalmodus befindet:
Bindkey "^[OA" Verlauf-Anfang-Suche-Rückwärts
Dies funktioniert jedoch nicht mit gedrückten Modifikatortasten, die zusätzliche Parameter zur CUP
Steuersequenz hinzufügen, was dazu führt, dass die einfache Zeichenfolgenübereinstimmung, die ZLE verwendet, fehlschlägt, wenn es nur nach einfachem Parameter ohne Parameter sucht CUP
. Sie müssen für jede mögliche Steuersequenz, die sich aus jeder möglichen Kombination von Modifikatoren ergibt, manuell einen zusätzlichen bindkey
Befehl eingeben.CUP
Folge 1 8 | während lesen -ri Tun Bindkey "^[[1;${i}A" Verlauf-Anfang-Suche-Rückwärts Erledigt
ZLE ist hier nicht allein. Andere terminfo-basierte Programme, wie die fish
Shell, leiden auf die gleiche Weise. ( fish
Auch die Shell-Leute haben herausgefunden, dass die Wahl des Anwendungs-/Normalmodus, die für einen Terminalemulator richtig funktioniert, für einen anderen falsch ist.) Eine Neustrukturierung (vergleichelibtermkey
die einen echten ECMA-48-Steuersequenzparser für die Eingabe hat) in diesen Programmen ist längst überfällig. Aber bisher hat sich noch niemand daran versucht.
Weiterführende Literatur
- https://unix.stackexchange.com/a/444270/5132
- "Tastaturfunktionen". Informationen zum VT510 Video Terminal-Programmierer. EK-VT510-RM. November 1993. Digital.
- https://unix.stackexchange.com/a/289871/5132
- Jonathan de Boyne Pollard (14.05.2018).Einige Terminals benötigen den Tastaturmodus (smkx). Fischpanzer-Bug Nr. 2139.
- https://unix.stackexchange.com/a/419092/5132