Editor de nano: as teclas de atalho do Ctrl são realmente bitmasked?

1

Eu queria que o Nano tivesse atalhos mais comuns (por exemplo, Ctrl-F para pesquisa, Ctrl-H para substituir, etc.) e editei o arquivo nanorc para adicionar:

bind ^F whereis all
bind ^H replace all
bind ^M mark all
...

Para meu espanto, pressionar Backspace ativa a função Replace e pressionar Enter ativa Mark.

Então eu percebi que seus códigos virtuais são: Backspace 0x08, H 0x48, Enter 0x0D, M 0x4D.

As atalhos de teclas do Ctrl são realmente exibidas em 0x40?

    
por iamanigeeit 28.09.2018 / 11:46

2 respostas

1

O terminal virtual em que você está usando o nano on é modelado após os terminais seriais físicos de décadas passadas. Por convenção, esses terminais produziam códigos de controle ASCII quando uma tecla de letra ou uma das chaves com o rótulo @ , [ , \ , ] , ^ , _ era pressionada junto com a Ctrl chave. O código de controle emitido tem o código ASCII do código da letra subtraído por 64. Assim, pressionar Ctrl-M produz o código ASCII de M (0x53) subtraído por 0x40 = 0x13, que é o código para retorno de carro. A tecla Return também produz retorno de carro, porque essa é a função da chave.

    
por 28.09.2018 / 13:41
1

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

por 28.09.2018 / 13:52

Tags