Inicio / Fin de las teclas en zsh no funcionan con masilla
-
03-07-2019 - |
Pregunta
Estoy ejecutando zsh como el shell predeterminado en un cuadro de Ubuntu, y todo funciona bien usando gnome-terminal (que, por lo que sé, emula xterm). Cuando inicio sesión desde un cuadro de Windows a través de ssh y putty (que también emula xterm) de repente, las teclas de inicio / fin ya no funcionan.
He podido resolverlo al agregar estas líneas a mi archivo zshrc ...
bindkey '\e[1~' beginning-of-line
bindkey '\e[4~' end-of-line
... pero todavía me pregunto qué está mal aquí. ¿Alguna idea?
Solución
Encontré que es una combinación:
One
Los desarrolladores de ZSH no creen que ZSH deba definir las acciones de las teclas Home , End , Del , .... / p>
Debian y Ubuntu solucionan esto definiendo las acciones normales que el usuario promedio esperaría en el archivo global / etc / zsh / zshrc
. Siguiendo el código relevante (es el mismo en Debian y 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
Entonces, si te estás conectando a una caja de Debian o Ubuntu, no tienes que hacer nada. Todo debería funcionar de forma automática (si no, vea más abajo).
Pero ... si se está conectando a otra caja (por ejemplo, FreeBSD), es posible que no haya un zshrc
fácil de usar. La solución es, por supuesto, agregar las líneas del zshrc
de Debian / Ubuntu a su propio .zshrc
.
Two
Putty envía xterm
como tipo de terminal al host remoto. Pero se mete en alguna parte y no envía los códigos de control correctos para Home , End , ... que uno esperaría de un xterm
. O no se espera que un terminal xterm
envíe esos o lo que sea ... (Sin embargo, la tecla Del funciona en xterm
, si lo configura en ZSH). Observe también que sus teclas Numpad actúan de forma divertida en Vim, por ejemplo con el terminal xterm
.
La solución es configurar Putty para enviar otro tipo de terminal. He intentado con xterm-color
y linux
. xterm-color
solucionó el problema Home / End , pero el Numpad seguía siendo divertido. Al establecerlo en linux
se solucionaron ambos problemas.
Puede configurar el tipo de terminal en Putty en Connection - > Datos. No tenga la tentación de configurar su tipo de terminal en su .zshrc
con export TERM = linux
, eso es simplemente incorrecto. El tipo de terminal debe ser especificado por su aplicación de terminal. De modo que si, por ejemplo, se conecta desde una caja Mac con un cliente Mac SSH, puede configurar su propio tipo de terminal.
Observe que TERM especifica su tipo de terminal y no tiene nada que ver con el host al que se está conectando. Puedo configurar mi tipo de terminal en linux
en Putty y conectarme a los servidores de FreeBSD sin problemas.
Entonces, corrige ambas cosas y deberías estar bien :)
Otros consejos
En el cuadro de diálogo de configuración de PuTTY, vaya a Conexión - > Los datos y el tipo linux en la cadena de tipo Terminal antes de conectarse.
Esto está funcionando para mí
bindkey -v
bindkey '\eOH' beginning-of-line
bindkey '\eOF' end-of-line
Parece una cosa de masilla. Gnome-terminal envía los códigos ^ [OH
y ^ [OF
para Home y End respectivamente, mientras que putty envía ^ [[1 ~
y < código> ^ [[4 ~ . Hay una opción en la masilla para cambiar las teclas Inicio / Fin del modo estándar al modo rxvt , y eso parece arreglar la tecla Inicio, pero no la tecla Finalizar (que ahora envía ^ [Ow
). Supongo que es hora de presentar un informe de error en alguna parte ... :-)
la respuesta adecuada que debería ser portátil a través de todas distribuciones (no necesariamente todas las versiones de zsh, ymmv aquí) es usar la utilidad de ayuda de zkbd de zkbd.
Definición de teclado
La gran cantidad de combinaciones posibles de teclados, estaciones de trabajo, terminales, emuladores y sistemas de ventanas hace que sea imposible para zsh tener enlaces de teclas incorporados para cada situación. La utilidad zkbd, que se encuentra en Funciones / Misceláneos, puede ayudarlo a crear rápidamente enlaces de teclas para su configuración.Ejecute zkbd como una función autocargada o como un script de shell:
zsh -f ~/zsh-4.3.17/Functions/Misc/zkbd
Cuando ejecuta zkbd, primero le pide que ingrese su tipo de terminal; Si el valor predeterminado que ofrece es correcto, simplemente presione regresar. Luego le pide que presione varias teclas diferentes para determinar las características de su teclado y terminal; zkbd te advierte si encuentra algo fuera de lo común, como una tecla Eliminar que no envía ^ H ni ^?
Las pulsaciones de teclas leídas por zkbd se registran como una definición para una matriz asociativa llamada key, escritas en un archivo en el subdirectorio .zkbd dentro del directorio HOME o ZDOTDIR. El nombre del archivo se compone del TÉRMINO, VENDEDOR y OSTYPE Parámetros, unidos por guiones.
Puede leer este archivo en su archivo .zshrc o en otro archivo de inicio con la fuente
o
. Comandos, luego haga referencia al parámetro clave en los comandos de vinculación, como este:
source ${ZDOTDIR:-$HOME}/.zkbd/$TERM-$VENDOR-$OSTYPE
[[ -n ${key[Left]} ]] && bindkey "${key[Left]}" backward-char
[[ -n ${key[Right]} ]] && bindkey "${key[Right]}" forward-char
# etc.
Tenga en cuenta que para que `autoload zkbd 'funcione, el archivo zkdb debe estar en uno de los directorios nombrados en su matriz fpath (vea zshparam (1)). Este ya debería ser el caso si tiene una instalación zsh estándar; si no lo está, copie Funciones / Varios / zkbd a un directorio apropiado.
vea man -P " less -p 'definición de teclado' "
zshcontrib, o busque en la página de metanombre zshall
Estos enlaces simplemente no parecen ser parte de los enlaces predeterminados establecidos en el modo emacs.
ejecutando " donde-es principio de línea " en mi instalación zsh predeterminada después de ejecutar " bindkey -e " muestra que solo está vinculado a ^ a. Tal vez debería preguntar a los desarrolladores de zsh por qué :-)