¿Por qué al presionar Ctrl-h en xterm + tmux se envía "^?"?

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 -istrip -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 -istrip -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 

Cuando está fuera de tmux , Ctrlv Ctrlh produce ^H Dentro de tmux , empiezo a get ^? si se ejecuta desde xterm . Dentro de la screen ejecutar desde xterm todavía muestra ^H ¿Cuál es la razón detrás de esto? ¿Debería salir ^H o ^? ? Cómo remediar esto?

La razón es que en su xterm, ^H es el carácter de erase , y tmux aparentemente traduce el carácter de erase carácter de control correspondiente ( ^? ) Para el terminal que emula, por lo que el borrado funciona como se espera en modo cocido (por ejemplo, que pasa cuando solo escribes cat ). La traducción es necesaria en caso de que use una terminal con ^? como el carácter de borrado (generado por la tecla Retroceso ), reanuda la session con un terminal que utiliza ^H como el carácter de borrado (generado por la tecla Retroceso ). Lamentablemente, esto tiene efectos secundarios visibles en algunos casos, por ejemplo, si escribe Ctrl + H.

El único buen remedio es asegurarse de que todos sus terminales (reales o en tmux) usen el mismo carácter de erase , que debería ser ^? (esto es estándar hoy en día). Parece que tu xterm está mal configurado. Esta no es la configuration pnetworkingeterminada, AFAIK.

En cualquier caso, debe asegurarse de usar un valor TERM para el cual kbs=\177 . Sin embargo, este no es el caso para xterm-256color de los ncurses oficiales. Por lo tanto, debe seleccionar un valor TERM diferente o debe corregir la input kbs para xterm-256color (esto puede hacerlo el usuario final con: infocmp > file , modificar file , luego tic file ). Algunas distribuciones de Linux no tienen este problema; por ejemplo, Debian ha solucionado este problema a través de un file debian/xterm.ti en su package fuente ncurses , dando:

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

También deberías tener:

 $ appres XTerm | grep backarrowKeyIsErase: *backarrowKeyIsErase: true 

Tenga en count que puede hacer stty erase '^?' en xterm (antes de hacer cualquier otra cosa), pero esto es solo una solución (y puede romper el comportamiento de la tecla Retroceso ). ¿De verdad debería tener erase = ^? (como se muestra por stty -a ) por defecto!

En caso de que los problemas con Backspace y / o Delete permanezcan, recomiendo el documento Back-space y Delete Configuration de Anne Baretta.

Después de cambiar a xterm debido al desplazamiento lento en xfce4-terminal, tuve el mismo problema. En ~ / .Xresources, establezco XTerm*ptyInitialErase: true . Ver la página man de xterm. Esta configuration deja el ^H vs. ^? al pseudo-terminal. Para probar esto, hice Ctrl-V Ctrl-H y de hecho esta salidas ^H

Ninguna de las soluciones aquí o en otro lugar funcionó para mí. Lo que funcionó fue agregar lo siguiente a mi file $HOME/.tmux.conf :

 bind-key -n Bspace send-keys Ch 

lo que hace que tmux envíe CtrlH cuando se presiona Retroceso .


Proporciono algunos comentarios, antecedentes y respuestas a continuación, así que siéntase libre de dejar de leer aquí. – 🙂


No estoy de acuerdo con vinc17 que el "único remedio bueno" sea hacer que el carácter de retroceso / borrado sea solamente ^. El usuario debe ser capaz de configurar las cosas como mejor le parezca.

Una solución común para muchos de nosotros que usamos Unix desde los días de terminales reales era usar ^ H para Retroceso y ^? para DEL (es decir, eliminar después del cursor, no antes). La distinción entre Ctrl-H y Retroceso fue y no siempre es necesaria, especialmente para los progtwigs CLI / terminal.

He estado usando este mapeo de ^ H / ^? para retroceder / teclas DEL (respectivamente) desde finales de los 80, en muchas máquinas y tanto para progtwigs de terminal y consoles virtuales desde la "muerte" de terminales reales, y no tenía ningún deseo de reconfigurar mi carácter de borrado en todas mis máquinas y las de mis clientes (muchas, muchas máquinas) para hacer Backspace enviando ^? trabajo.

Intenté todo tipo de methods basados ​​en todo tipo de publicaciones para que tmux enviara Ctrl-H para Retroceso. En particular, "bind-key -n Ch send-keys Ch" no funcionaba me frustraba, ya que uso tmux dentro de Terminator, y sé que mi Terminator está configurado para enviar Ctrl-H cuando se presiona la tecla Retroceso. Tardé bastante time en encontrar una publicación que incluyera los nombres de key tmux disponibles, que es donde encontré el nombre key de Bspace, y afortunadamente funcionó para que el carácter ^ H pasase correctamente por tmux (tmux versión 2.1-3build1 en Ubuntu 16.04. 02).