Pourquoi appuyer sur Ctrl-h dans xterm + tmux envoie "^?"?

xterm :

 $ echo $TERM xterm-256color $ stty -a speed 38400 baud; rows 52; columns 91; line = 0; intr = ^C; quit = ^\; erase = ^H; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0; -parenb -parodd -cmspar cs8 -hupcl -cstopb cread -clocal -crtscts -ignbrk -brkint -ignpar -parmrk -inpck -issortingp -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel iutf8 opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0 isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke 

gnome-terminal :

 $ echo $TERM xterm-256color $ stty -a speed 38400 baud; rows 57; columns 100; line = 0; intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = M-^?; eol2 = M-^?; swtch = M-^?; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0; -parenb -parodd -cmspar cs8 hupcl -cstopb cread -clocal -crtscts -ignbrk brkint -ignpar -parmrk -inpck -issortingp -inlcr -igncr icrnl ixon -ixoff -iuclc ixany imaxbel iutf8 opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0 isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke 

En dehors de tmux , Ctrlv Ctrlh délivre ^H À l'intérieur de tmux , je commence à recevoir ^? si exécuter à partir de xterm . L' screen intérieur fonctionne à partir de xterm il sort toujours ^H Quelle est la raison derrière cela? Devrait-il émettre ^H ou ^? ? Comment remédier à cela?

La raison en est que dans votre xterm, ^H est le caractère d' erase , et tmux traduit apparemment le caractère d' erase caractère de contrôle correspondant ( ^? ) Pour le terminal qu'il émule, de sorte que l'effacement fonctionne comme prévu en mode cuit Qu'est-ce qui se passe quand vous tapez juste cat ). La traduction est nécessaire dans le cas où vous utilisez un terminal avec ^? en tant que caractère d'effacement (généré par la touche Retour arrière ), puis reprenez la session avec un terminal qui utilise ^H comme caractère d'effacement (généré par la touche Retour arrière ). Malheureusement, cela a des effets secondaires visibles dans certains cas, par exemple si vous tapez Ctrl + H.

Le seul bon remède est de s'assurer que tous vos terminaux (réels ou en tmux) utilisent le même caractère d' erase , qui devrait être ^? (c'est standard aujourd'hui). Il semble que votre xterm soit mal configuré. Ce n'est pas la configuration par défaut, AFAIK.

Dans tous les cas, vous devez vous assurer d'utiliser une valeur TERM pour laquelle kbs=\177 . Cependant ce n'est pas le cas pour xterm-256color des ncurses officiels. Vous devez donc sélectionner une valeur TERM différente ou vous devez corriger l'input kbs pour xterm-256color (ceci peut être fait par l'user final avec: infocmp > file , file modification, puis tic file ). Certaines dissortingbutions Linux n'ont pas ce problème; Par exemple, Debian a résolu ce problème via un file debian/xterm.ti dans son package source ncurses , en donnant:

 $ infocmp xterm-256color | grep kbs kbs=\177, kcbt=\E[Z, kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, 

Vous devriez aussi avoir:

 $ appres XTerm | grep backarrowKeyIsErase: *backarrowKeyIsErase: true 

Notez que vous pouvez faire stty erase '^?' dans xterm (avant de faire quoi que ce soit d'autre), mais il s'agit simplement d'une solution de contournement (et cela peut rompre le comportement de la touche Backspace ). Vous devriez effectivement avoir erase = ^? (comme indiqué par stty -a ) par défaut!

En cas de problème avec Backspace et / ou Delete , je recommand le document Consistent BackSpace et Delete Configuration par Anne Baretta.

Après avoir basculé sur xterm en raison d'un défilement lent dans xfce4-terminal, j'ai eu ce même problème. Dans ~ / .Xresources, je définis XTerm*ptyInitialErase: true . Voir la page man xterm. Ce paramètre laisse le ^H contre ^? au pseudo-terminal. Pour tester cela, j'ai fait Ctrl-V Ctrl-H et en effet cela produit ^H

Aucune des solutions ici ou ailleurs n'a fonctionné pour moi. Qu'est-ce que le travail était d'append ce qui suit à mon file $HOME/.tmux.conf :

 bind-key -n Bspace send-keys Ch 

ce qui fait que tmux envoie CtrlH lorsque Backspace est pressé.


Je fournis des commentaires, des antécédents et des commentaires ci-dessous, alors n'hésitez pas à arrêter de lire ici. – 🙂


Je ne suis pas d'accord avec vinc17 pour dire que le "seul bon remède" est de faire que le caractère backspace / erase ne soit que ^ ?. L'user devrait être capable de configurer les choses comme il ou elle le voit.

Une solution commune pour beaucoup d'entre nous utilisant Unix depuis l'époque des terminaux réels était d'utiliser ^ H pour Backspace et ^? pour DEL (c'est-à-dire supprimer après le slider, pas avant). La distinction entre Ctrl-H et Backspace était et n'est pas toujours nécessaire, en particulier pour les programmes CLI / terminaux.

J'ai utilisé cette cartographie de ^ H / ^? depuis la fin des années 80 sur de nombreuses machines et à la fois pour les programmes terminaux et les consoles virtuelles depuis la «mort» des vrais terminaux et je n'ai pas eu envie de reconfigurer mon caractère d'effacement sur toutes mes machines et celles de mes clients (beaucoup, beaucoup de machines) pour faire revenir l'envoi ^? travail.

J'ai essayé toutes sortes de methods basées sur toutes sortes de messages pour que tmux envoie un Ctrl-H pour Backspace. En particulier, "bind-key -n Ch send-keys Ch" ne fonctionne pas frustré moi, car j'utilise tmux dans Terminator, et je sais que mon Terminator est configuré pour envoyer Ctrl-H lorsque la touche Backspace est pressée. Il a fallu du time pour trébucher sur un post listant les noms de keys tmux disponibles, où j'ai trouvé le nom de key Bspace, et heureusement cela a fonctionné pour get le caractère ^ H à traverser tmux correctement (tmux version 2.1-3build1 sur Ubuntu 16.04. 02).