Como a exibição é atualizada quando o caractere de apagamento é digitado em um emulador de terminal?

Como a exibição é atualizada quando o caractere de apagamento é digitado em um emulador de terminal?

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 xtermeu faço

$ stty erase x
$ cat -
aaaaaaaaaax

o último xque digito parece apagar o último a. Porém se este fosse um terminal real, separado do computador, não teria como saber qual stty eraseera o personagem. A única maneira que eu esperaria obter esse comportamento seria se o caractere de apagamento fosse ^He 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 xcaractere 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 BScaractere é 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.

informação relacionada