Home / Ende-Tasten in zsh nicht mit Kitt arbeiten
-
03-07-2019 - |
Frage
Ich bin mit zsh als Standard-Shell auf einem Feld Ubuntu, und alles funktioniert mit gnome-terminal (die so weit ich weiß, xterm emuliert). Wenn ich mich einlogge von einem Windows-Box über ssh und Kitt (die auch xterm emuliert) suddendly der Start / Ende-Tasten funktionieren nicht mehr.
Ich habe in der Lage gewesen, dass das Hinzufügen dieser Zeilen zu meiner zshrc Datei zu lösen ...
bindkey '\e[1~' beginning-of-line
bindkey '\e[4~' end-of-line
... aber ich frage mich immer noch, was hier los ist. Jede Idee?
Lösung
Ich fand es ist eine Kombination:
Ein
Die ZSH Entwickler glauben nicht, dass ZSH die Aktionen der Startseite definieren sollte , Ende , Del , ... Tasten.
Debian und Ubuntu dieses Problem beheben, indem sie die normalen Aktionen der durchschnittliche Benutzer definieren würde in der globalen /etc/zsh/zshrc
Datei erwarten. Nach dem entsprechenden Code (es ist das gleiche auf Debian und Ubuntu):
if [[ "$TERM" != emacs ]]; then
[[ -z "$terminfo[kdch1]" ]] || bindkey -M emacs "$terminfo[kdch1]" delete-char
[[ -z "$terminfo[khome]" ]] || bindkey -M emacs "$terminfo[khome]" beginning-of-line
[[ -z "$terminfo[kend]" ]] || bindkey -M emacs "$terminfo[kend]" end-of-line
[[ -z "$terminfo[kich1]" ]] || bindkey -M emacs "$terminfo[kich1]" overwrite-mode
[[ -z "$terminfo[kdch1]" ]] || bindkey -M vicmd "$terminfo[kdch1]" vi-delete-char
[[ -z "$terminfo[khome]" ]] || bindkey -M vicmd "$terminfo[khome]" vi-beginning-of-line
[[ -z "$terminfo[kend]" ]] || bindkey -M vicmd "$terminfo[kend]" vi-end-of-line
[[ -z "$terminfo[kich1]" ]] || bindkey -M vicmd "$terminfo[kich1]" overwrite-mode
[[ -z "$terminfo[cuu1]" ]] || bindkey -M viins "$terminfo[cuu1]" vi-up-line-or-history
[[ -z "$terminfo[cuf1]" ]] || bindkey -M viins "$terminfo[cuf1]" vi-forward-char
[[ -z "$terminfo[kcuu1]" ]] || bindkey -M viins "$terminfo[kcuu1]" vi-up-line-or-history
[[ -z "$terminfo[kcud1]" ]] || bindkey -M viins "$terminfo[kcud1]" vi-down-line-or-history
[[ -z "$terminfo[kcuf1]" ]] || bindkey -M viins "$terminfo[kcuf1]" vi-forward-char
[[ -z "$terminfo[kcub1]" ]] || bindkey -M viins "$terminfo[kcub1]" vi-backward-char
# ncurses fogyatekos
[[ "$terminfo[kcuu1]" == "^[O"* ]] && bindkey -M viins "${terminfo[kcuu1]/O/[}" vi-up-line-or-history
[[ "$terminfo[kcud1]" == "^[O"* ]] && bindkey -M viins "${terminfo[kcud1]/O/[}" vi-down-line-or-history
[[ "$terminfo[kcuf1]" == "^[O"* ]] && bindkey -M viins "${terminfo[kcuf1]/O/[}" vi-forward-char
[[ "$terminfo[kcub1]" == "^[O"* ]] && bindkey -M viins "${terminfo[kcub1]/O/[}" vi-backward-char
[[ "$terminfo[khome]" == "^[O"* ]] && bindkey -M viins "${terminfo[khome]/O/[}" beginning-of-line
[[ "$terminfo[kend]" == "^[O"* ]] && bindkey -M viins "${terminfo[kend]/O/[}" end-of-line
[[ "$terminfo[khome]" == "^[O"* ]] && bindkey -M emacs "${terminfo[khome]/O/[}" beginning-of-line
[[ "$terminfo[kend]" == "^[O"* ]] && bindkey -M emacs "${terminfo[kend]/O/[}" end-of-line
fi
Also, wenn Sie auf einem Debian oder Ubuntu-Box anschließen, müssen Sie nichts tun. Alles sollte automatisch funktionieren (wenn nicht, siehe unten).
Aber ... wenn Sie in einer anderen Box verbinden (zum Beispiel FreeBSD), könnte es keine benutzerfreundliche Standard zshrc
sein. Die Lösung ist natürlich die Zeilen aus dem Debian / Ubuntu zshrc
Ihren eigenen .zshrc
.
Zwei
Putty sendet xterm
als Terminal-Typ zu der Remote-Host. Aber vermasselt irgendwo auf und sendet nicht die richtige Steuercodes für Home , Ende , ... dass man von einem xterm
erwarten. Oder ein xterm
Terminal ist nicht zu erwarten diejenigen, oder was auch immer senden ... ( Del -Taste funktioniert in xterm
jedoch, wenn Sie es in ZSH konfigurieren). Beachten Sie auch, dass Ihre Numpad-Tasten wirken komisch in Vim zum Beispiel mit xterm
Terminal.
Die Lösung ist Putty konfigurieren einen anderen Terminaltyp zu senden. Ich habe xterm-color
und linux
versucht. xterm-color
fixiert das Home / Ende Problem, aber die Numpad war noch lustig. Eine Einstellung beide Probleme behoben linux
.
Sie können unter Anschlussklemmentyp in Putty-Set -> Daten. Nicht versucht, Terminaltyp in Ihrem .zshrc
mit export TERM=linux
zu setzen, das ist einfach falsch. Der Terminaltyp sollte von Ihrem Terminal App angegeben werden. So dass es gesetzt, wenn zum Beispiel verbinden Sie von einem Mac-Box mit einem Mac SSH-Client kann über einen eigenen Terminal-Typ ist.
Beachten Sie, dass TERM Terminaltyp gibt und hat nichts mit dem Host zu tun, damit Sie eine Verbindung herstellen. Ich kann meinen Terminaltyp festgelegt in Putty auf linux
und FreeBSD-Servern ohne Probleme verbinden.
So beheben diese beiden Dinge, und Sie sollten in Ordnung sein:)
Andere Tipps
Auf dem PuTTY Konfigurationsdialog finden Sie unter Verbindung -.> Daten und Typ Linux in den Terminaltyp-Zeichenfolge vor dem Anschluss
Dies ist für mich arbeiten
bindkey -v
bindkey '\eOH' beginning-of-line
bindkey '\eOF' end-of-line
Es scheint eine Kitt Sache. Gnome-Terminal sendet die Codes ^[OH
und ^[OF
für Heim und Ende jeweils während Kitt ^[[1~
und ^[[4~
sendet. Es gibt eine Option in Kitt aus den Home / Ende-Tasten ändern Standard auf rxvt Modus, und das scheint die Home-Taste zu beheben, aber nicht das Ende-Taste (die jetzt sendet ^[Ow
). Denke, es ist Zeit, einen Fehlerbericht irgendwo in Datei ...: -)
die entsprechende Antwort, die über tragbar sein sollte alle Distros (nicht alle Versionen von zsh necessarly aber ymmv hier) ist das zkbd Hilfsprogramm von zkbd zu verwenden.
Tastatur Definition
Die große Anzahl der möglichen Kombinationen von Tastaturen, Workstations, Terminals, Emulatoren und Fenstersystemen macht es unmöglich für zsh Einbau-haben Tastenbelegungen für jede Situation. Das zkbd Dienstprogramm in Functions / Misc, können Sie Tastenbelegungen für Ihre Konfiguration erstellen helfen.Ausführen zkbd entweder als automatisch geladen Funktion oder als ein Shell-Skript:
zsh -f ~/zsh-4.3.17/Functions/Misc/zkbd
Wenn Sie zkbd laufen, es fragt Sie zuerst Ihren Terminaltyp einzugeben; wenn der Standard bietet es richtig ist, drücken Sie einfach die Eingabetaste. Es fordert Sie dann eine Reihe von verschiedenen Tasten zu drücken Eigenschaften Ihrer Tastatur und Terminal zu bestimmen; zkbd warnt wenn sie feststellt, etwas aus dem üblichen heraus, wie eine Löschtaste, die weder ^ H sendet noch ^ ?.
Die Tastenanschläge von zkbd gelesen werden als eine Definition für einen assoziatives Array namens Schlüssel aufgezeichnet, in dem Unterverzeichnis in eine Datei geschrieben .zkbd innerhalb entweder zu Hause oder im ZDOTDIR Verzeichnis. Der Name der Datei wird aus dem TERM, Hersteller- und OSTYPE zusammengesetzt Parameter, zusammen mit Bindestrichen.
Sie können diese Datei in Ihre .zshrc oder eine andere Startdatei mit dem
source' or
lesen.‘ Befehle, verweisen dann auf die Schlüsselparameter in bindkey Befehle, wie folgt aus:
source ${ZDOTDIR:-$HOME}/.zkbd/$TERM-$VENDOR-$OSTYPE
[[ -n ${key[Left]} ]] && bindkey "${key[Left]}" backward-char
[[ -n ${key[Right]} ]] && bindkey "${key[Right]}" forward-char
# etc.
Beachten Sie, dass für `automatischen Laden zkbd‘ zu arbeiten, die zkdb Datei in eines der Verzeichnisse in Ihrem FPATH Array (siehe zshparam (1)) genannt sein muss. Dies sollte bereits dann der Fall sein, wenn Sie eine Standard zsh Installation haben; wenn dies nicht der Fall, kopieren Funktionen / Misc / zkbd zu einem entsprechenden Verzeichnis.
siehe man -P "less -p 'keyboard definition'"
zshcontrib oder suchen Sie die Meta-manpage zshall
Diese Bindungen einfach erscheinen nicht Teil der Standardbindungen in Emacs-Modus eingestellt sein.
Ausführen „wo-ist beginning-of-line“ auf meinem Standard zsh Installation nach dem Ausführen „bindkey -en“ zeigt es nur gebunden ist, ein zu ^. Vielleicht sollten Sie die zsh Entwickler fragen, warum: -)