Estes códigos não são virtuais.
Você está usando um terminal.
Os terminais operam com um simples fluxo de caracteres de 8 bits, às vezes até de 7 bits. Para tudo o que um aplicativo TUI como nano
sabe, há uma porta serial, dois modems, o PSTN e um DEC VT525 honesto para o bem entre você e ele. Tudo que ele vê é aquele fluxo de caracteres, um descritor de arquivo do dispositivo de terminal, uma variável de ambiente TERM
e um registro no banco de dados terminfo.
Não existe um modificador de chave de controle para uma chave alfabética nesse fluxo de caracteres. Quando você escreve bind ^M
, o software é na verdade compreendendo que como um número de caractere 13 . É assim que o software tem que trabalhar internamente, porque esse é o modelo real de E / S do terminal com o qual ele tem que trabalhar. O ^M
é um artefato do analisador de comandos do software, uma forma de denotar o caractere número 13 nos comandos de configuração que você digita.
Alguns sistemas operacionais, como o FreeBSD, fornecem funções de biblioteca comuns que os softwares de aplicativos podem usar em seus analisadores, para produzir semânticas uniformes para tais denotações entre aplicativos.
% printf '\x08\x0d' | vis -w ; echo
\^H\^M
%
Não há códigos de teclas virtuais aqui, além disso. Toda a tradução causada pela tecla modificadora ⎈ Control acontece no seu terminal ou emulador de terminal, antes que os caracteres sejam transmitidos pelo fio (virtual ou real).
Acontece que o seu terminal produz o caractere # 8 (␈) para ⎈ Controle + H e ⌫ Backspace e caractere 13 ( ␍) para ⎈ Controle + M e Enter . Isso é totalmente do emulador de terminal / terminal. Com muitos emuladores, há um mapa de teclado de algum tipo onde se pode mudar isso. Para os DEC VTs de boa fé, existe de fato uma seqüência de controle de saída, DECBKM, que alterna ⌫ Backspace entre o envio do caractere # 8 e o envio do caractere # 127 (DEL).
Leitura adicional