
Pelo que entendi, ao digitar caracteres em um emulador de terminal eles aparecem porque são "ecoados". Imaginamos que o terminal é um dispositivo separado que se comunica com o computador através de um canal bidirecional, e cada tecla digitada não atualiza a tela imediatamente, mas aparece quando ela é enviada de volta do computador.
Minha pergunta é como é possível que a tecla backspace, ou qualquer tecla configurada para "apagar" stty
, pareça apagar um caractere na tela. Se em um xterm
eu faço
$ stty erase x
$ cat -
aaaaaaaaaax
o último x
que digito parece apagar o último a
. Porém se este fosse um terminal real, separado do computador, não teria como saber qual stty erase
era o personagem. A única maneira que eu esperaria obter esse comportamento seria se o caractere de apagamento fosse ^H
e fosse ecoado, e o terminal interpretasse isso como um caractere de controle especial dizendo para apagar o caractere antes do cursor.
Isso é uma peculiaridade dos emuladores de terminal, onde eles “trapaceiam” e procuram qual stty erase
é o personagem?
Responder1
O emulador de terminal envia o x
caractere e o driver do terminal vê que ele foi configurado como caractere de apagamento. Então, em vez de ecoá-lo de volta ao emulador, ele envia a sequência apropriada para apagar o caractere anterior (por exemplo, backspace-space-backspace).
Mesmo quando o caractere de apagamento está definido como Backspace, simplesmente ecoá-lo não apagaria o que foi digitado. Quando um BS
caractere é enviado para um terminal, ele apenas move o cursor um caractere para a esquerda, mas não o apaga. Portanto, o driver do terminal ainda teria que enviar um espaço extra para limpá-lo e deixar o cursor naquele local.