Por que pressionar Ctrl-h em xterm + tmux envia “^?”?

3

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

Quando fora de tmux , Ctrl - v Ctrl - h gera ^H . Dentro de tmux , começo a receber ^? se executado a partir de xterm . Dentro de screen executado a partir de xterm , ele ainda gera ^H . Qual é a razão por trás disso? Deverá produzir ^H ou ^? ? Como remediar isso?

    
por x-yuri 20.01.2015 / 17:15

3 respostas

6

O motivo é que no seu xterm, ^H é o caractere erase e tmux aparentemente traduz o caractere erase para o caractere de controle correspondente ( ^? ) para o terminal emulado, de modo que apagar funciona como esperado no modo cozido (por exemplo, o que acontece quando você digita cat ). A tradução é necessária caso você use um terminal com ^? como o caractere de apagamento (gerado pela tecla Backspace ), então retome a sessão com um terminal que usa ^H como o caractere de apagamento ( gerado pela tecla Backspace ). Infelizmente isto tem efeitos colaterais visíveis em alguns casos, e. se você digitar Ctrl + H .

O único bom remédio é certificar-se de que todos os seus terminais (reais ou em tmux) usem o mesmo caractere erase , que deve ser ^? (isso é padrão hoje em dia). Parece que seu xterm está mal configurado. Esta não é a configuração padrão, AFAIK.

Em qualquer caso, você precisa se certificar de usar um valor TERM para o qual kbs=7 . No entanto, isto não é não no caso de xterm-256color das ncurses oficiais. Portanto, você precisa selecionar um valor TERM diferente ou é necessário corrigir a entrada kbs para xterm-256color (isso pode ser feito pelo usuário final com: infocmp > file , modificar file e, em seguida, tic file ). Algumas distribuições do Linux não possuem esse problema; por exemplo, o Debian corrigiu este problema através de um arquivo debian/xterm.ti em seu pacote ncurses source, dando:

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

Você também deve ter:

$ appres XTerm | grep backarrowKeyIsErase:
*backarrowKeyIsErase:   true

Note que você pode fazer stty erase '^?' no xterm (antes de fazer qualquer outra coisa), mas isso é apenas uma solução alternativa (e pode quebrar o comportamento da tecla Backspace ). Você deve ter erase = ^? (como mostrado por stty -a ) por padrão!

Caso os problemas com Backspace e / ou Delete permaneçam, eu recomendo o BackSpace Consistente e Excluir Configuração documento por Anne Baretta.

    
por 20.01.2015 / 18:20
3

Depois de mudar para o xterm por causa da rolagem lenta no xfce4-terminal, tive esse mesmo problema. Em ~ / .Xresources, eu defino %código% . Veja a página do manual do xterm. Essa configuração deixa o XTerm*ptyInitialErase: true vs. ^H para o pseudo-terminal. Para testar isso, eu fiz Ctrl-V Ctrl-H e de fato isso gera ^? .

    
por 16.12.2015 / 22:02
1

Nenhuma das soluções aqui ou em outro lugar funcionou para mim. O que funcionou foi adicionar o seguinte ao meu arquivo $HOME/.tmux.conf :

bind-key -n Bspace send-keys C-h

que faz o tmux enviar Ctrl - H quando o Backspace é pressionado.

Eu forneço alguns comentários, histórico e reclamações abaixo, então fique à vontade para parar de ler aqui. -:)

Não concordo com o vinc17 que o "único bom remédio" é fazer com que o backspace / erase character seja apenas "". O usuário deve ser capaz de configurar as coisas conforme ele ou ela se encaixa.

Uma solução comum para muitos de nós usando Unixes desde os dias dos terminais reais era usar ^ H para Backspace e ^? para DEL (ou seja, excluir após o cursor, não antes). A distinção entre Ctrl-H e Backspace foi e nem sempre é necessária, especialmente para programas CLI / terminal.

Eu tenho usado esse mapeamento de ^ H / ^? para Backspace / DEL (respectivamente) desde o final dos anos 80, em muitas máquinas e tanto para programas de terminal e consoles virtuais desde a "morte" de terminais reais, e não tinha desejo de reconfigurar meu caracter de apagar em todas as minhas máquinas e as de meus clientes (muitas, muitas máquinas) para fazer o backspace enviar ^? trabalho.

Eu tentei todos os tipos de métodos baseados em todos os tipos de posts para que o tmux envie um Ctrl-H para Backspace. Em particular, "bind-key -n C-h send-keys C-h" não funciona frustrado, pois eu uso o tmux dentro do Terminator, e sei que o meu Terminator está configurado para enviar Ctrl-H quando a tecla Backspace é pressionada. Demorou um bom tempo para encontrar um post listando os nomes de chaves tmux disponíveis, que é onde eu encontrei o keyname do Bspace, e felizmente isso funcionou para obter o caracter ^ H para passar o tmux corretamente (tmux versão 2.1-3build1 no Ubuntu 16.04). 02).

    
por 17.06.2017 / 18:01