Question

J'utilise zsh en tant que shell par défaut sur une boîte Ubuntu, et tout fonctionne correctement avec gnome-terminal (qui, autant que je sache, émule xterm). Lorsque je me connecte à partir d’une fenêtre Windows via ssh et mastic (qui émule également xterm), les touches home / end ne fonctionnent plus.

J'ai pu résoudre le problème en ajoutant ces lignes à mon fichier zshrc ...

bindkey '\e[1~' beginning-of-line
bindkey '\e[4~' end-of-line

... mais je me demande toujours ce qui ne va pas ici. Une idée?

Était-ce utile?

La solution

J'ai trouvé que c'était une combinaison:

One

Les développeurs de ZSH ne pensent pas que ZSH devrait définir les actions des clés Home , Fin , Del , .... <. / p>

Debian et Ubuntu ont résolu ce problème en définissant les actions normales qu'un utilisateur moyen pouvait attendre dans le fichier global / etc / zsh / zshrc . En suivant le code correspondant (il en va de même pour Debian et 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

Donc, si vous vous connectez à une boîte Debian ou Ubuntu, vous n’avez rien à faire. Tout devrait fonctionner automatiquement (sinon, voir ci-dessous).

Mais ... si vous vous connectez à une autre boîte (par exemple, FreeBSD), il pourrait ne pas y avoir de zshrc convivial par défaut. La solution consiste bien sûr à ajouter les lignes du zshrc de Debian / Ubuntu à votre propre .zshrc .

Deux

Putty envoie xterm en tant que type de terminal à l'hôte distant. Mais, quelque chose ne va pas et n’envoie pas les codes de contrôle corrects pour Accueil , Fin , ... qu’on attendrait d’un xterm . Ou un terminal xterm n'est pas censé envoyer ceux-ci ou quoi que ce soit ... (La touche Del fonctionne dans xterm . Toutefois, si vous le configurez en ZSH). Notez également que vos touches du clavier numérique sont amusantes dans Vim, par exemple avec le terminal xterm .

La solution consiste à configurer Putty pour envoyer un autre type de terminal. J'ai essayé xterm-color et linux . xterm-color a corrigé le problème Accueil / Fin , mais le pavé numérique était toujours amusant. La définition de linux a corrigé les deux problèmes.

Vous pouvez définir le type de terminal dans Putty sous Connexion - > Les données. Ne soyez pas tenté de définir votre type de terminal dans votre .zshrc avec export TERM = linux , c'est tout simplement faux. Le type de terminal doit être spécifié par votre application de terminal. Ainsi, si, par exemple, vous vous connectez à partir d’un ordinateur Mac avec un client Mac SSH, il peut définir son propre type de terminal.

Notez que TERM spécifie votre type de terminal et n’a aucun rapport avec l’hôte auquel vous vous connectez. Je peux définir mon type de terminal sur linux dans Putty et me connecter sans problèmes aux serveurs FreeBSD.

Alors, corrigez ces deux problèmes et tout devrait bien se passer:)

Autres conseils

Dans la boîte de dialogue de configuration de PuTTY, accédez à Connexion - > Données et tapez linux dans la chaîne de type Terminal avant la connexion.

Cela fonctionne pour moi

bindkey -v

bindkey '\eOH'  beginning-of-line
bindkey '\eOF'  end-of-line

Cela semble être une chose de mastic. Gnome-terminal envoie les codes ^ [OH et ^ [OF pour Home et End respectivement, tandis que putty envoie ^ [[1 ~ et < code> ^ [[4 ~ . Putty permet de changer le mode standard en mode rxvt pour les touches Accueil / Fin, ce qui semble corriger la touche Accueil, mais pas la touche Fin (qui envoie ^ [Ow ). Je suppose qu'il est temps de déposer un rapport de bogue quelque part ...: -)

La réponse appropriée qui devrait être portable sur toutes les distributions (pas nécessairement toutes les versions de zsh, ymmv ici) consiste à utiliser l'utilitaire d'assistance zkbd de zkbd.

  

Définition du clavier
  Le grand nombre de combinaisons possibles de claviers, de postes de travail, de terminaux, d'émulateurs et de systèmes de fenêtres empêche zsh de disposer de combinaisons de touches intégrées pour chaque situation. L'utilitaire zkbd, disponible dans Functions / Misc, peut vous aider à créer rapidement des liaisons de clé pour votre configuration.

     

Exécutez zkbd en tant que fonction à chargement automatique ou en tant que script shell:

zsh -f ~/zsh-4.3.17/Functions/Misc/zkbd
  

Lorsque vous exécutez zkbd, il vous est d'abord demandé de saisir votre type de terminal. Si la valeur par défaut proposée est correcte, appuyez simplement sur Retour. Il vous demande ensuite d'appuyer sur un certain nombre de touches pour déterminer les caractéristiques de votre clavier et de votre terminal. zkbd vous avertit          s'il trouve quelque chose hors de l'ordinaire, tel qu'une touche Suppr qui n'envoie ni ^ H ni ^ ?.

     

Les séquences de touches lues par zkbd sont enregistrées en tant que définition d’un tableau associatif nommé key, écrit dans un fichier du sous-répertoire .zkbd, dans votre répertoire HOME ou ZDOTDIR. Le nom du fichier est composé de TERM, VENDOR et OSTYPE.          paramètres, joints par des traits d'union.

     

Vous pouvez lire ce fichier dans votre fichier .zshrc ou dans un autre fichier de démarrage avec source 'ou .' commandes, puis référencez le paramètre key dans les commandes bindkey, comme ceci:

          source ${ZDOTDIR:-$HOME}/.zkbd/$TERM-$VENDOR-$OSTYPE
          [[ -n ${key[Left]} ]] && bindkey "${key[Left]}" backward-char
          [[ -n ${key[Right]} ]] && bindkey "${key[Right]}" forward-char
          # etc.
  

Notez que pour que `autoload zkbd 'fonctionne, le fichier zkdb doit se trouver dans l’un des répertoires nommés dans votre tableau fpath (voir zshparam (1)). Cela devrait déjà être le cas si vous avez une installation standard de zsh; Si ce n'est pas le cas, copiez Functions / Misc / zkbd dans un répertoire approprié.

voir man -P zshcontrib, ou recherchez la méta-page de manuel zshall

Ces liaisons ne semblent tout simplement pas faire partie des liaisons par défaut définies en mode emacs.

exécution de "où-est le début de ligne" sur mon installation zsh par défaut après avoir exécuté " bindkey -e " montre qu'il est seulement lié à ^ a. Peut-être devriez-vous demander aux développeurs zsh pourquoi: -)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top