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?

¿Fue útil?

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é :-)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top