Gerando as seqüências de escape para o terminal por ahk

1

Estou tentando fazer um ahk para o putty enviar os códigos de teclas que eu quero para algumas combinações de teclas para que meu programa funcione também no terminal.

Para isso eu já tenho um ahk com algumas combinações de teclas funcionando corretamente experimentando muito tempo aqui e ali, a partir de tabelas de chaves, etc mas eu ainda não entendi, não surgiu com um método claro e lógico para calcular a chave de escape que eu quero.

Um exemplo:

^F1::SendInput ^[O5P

Dá 28 no meu teste.

Eu vejo que para ^[1 eu recebo 377 e para ^[2 376, e vejo que letras de números hexadecimais (AF) podem ser usadas, assim como ; e ~ ou duplo [[ .

Você entende como isso funciona? Algum bom material descritivo para isso? Muito obrigado!

    
por obeliksz 24.10.2012 / 09:11

1 resposta

2

Se você quiser "enviar" uma tecla de função, use a sintaxe apropriada

^F1::SendInput {F5}

Isso faria com que Putty agisse como se você tivesse pressionado F5 e então enviará uma seqüência apropriada de caracteres (uma sequência de escape) para o servidor.

               PC                                         Server
   +---------------------+   Network     +-------------------------+
   | [AHK] ----> [Putty] | ============> | [TTY] ------> [Program] |
   |        F5           |  Esc [ 15 ~   |        Esc…    |   ^    |
   +---------------------+               |                |   | F5 |
                                         |                v   |    |
                                         |    $TERM------[Curses]  |
                                         |                 |       |
                                         |    /usr/share/terminfo  |
                                         +-------------------------+

No servidor, a seqüência Escape é processada primeiro pelo manipulador TTY (procurando por sinais de Interrupção etc) e, em seguida, é entregue ao programa do servidor, que a transfere para a biblioteca curses , que traduz as seqüências de escape novamente em nomes de Funções . O programa então decide o que fazer como resultado de receber isso.

A sequência de escape real depende da "emulação de terminal". Por padrão, Putty emula um xterm. A biblioteca Curses usa o valor da variável de ambiente TERM para procurar no terminfo qual função é representada por uma seqüência de escape.

Sequências de escape para teclas de função podem ser encontradas em / etc / termcap, aqui estão algumas

                                    SCO     PuTTY    PuTTY
  Key    Termcap  VT100    VT220    ANSI    XTERM    VT400
  ---    -------  -------  -------  ------  ------   -------
  F1     k1       Esc[OP   Esc[OP   Esc[M   Esc[OP   Esc[11~
  F2     k2       Esc[OQ   Esc[OQ   Esc[N   Esc[OQ   Esc[12~
  F3     k3       Esc[OR   Esc[OR   Esc[O   Esc[OR   Esc[13~
  F4     k4       Esc[OS   Esc[OS   Esc[P   Esc[OS   Esc[14~
  F5     k5       -        -        Esc[Q   Esc[15~  Esc[15~
  F6     k6       -        Esc[17~  Esc[R   Esc[17~  Esc[17~
  F7     k7       -        Esc[18~  Esc[S   Esc[18~  Esc[18~
  ...
  F10    k0       -        Esc[21~  Esc[V   Esc[21~  Esc[21~
  F11    k1       -        Esc[23~  Esc[X   Esc[23~  Esc[23~
  ...
  F14    kD       -        Esc[26~  Esc[Z   Esc[26~  Esc[26~
  F15    kE       -        Esc[27~  Esc[a   Esc[27~  Esc[27~
  ...
  F36    FP       -
  ...
  F63    Fr       -

Notas

  • A série VT100 tinha apenas quatro teclas de função rotuladas PF1 a PF4
  • O VT220 tinha 20 teclas de função rotuladas até F20
  • O VT220 usou uma tecla de função na posição 5 para uma função "break". (portanto, lacuna acima)
  • Nem todos os emuladores ou arquivos termcap / terminfo existentes concordam com o acima.
  • Existem lacunas estranhas na progressão.
  • xterm não é uma definição, é uma família indisciplinada de desajustados, não há dois iguais.
  • Idem "ANSI"
  • Muitos emuladores usam algo como Shift + F1 para F13, Alt + F1 para F25, etc.
  • No PuTTY, shift + F1 é o mesmo que F11 (não F13)
  • Sim, é uma bagunça. É por isso que deixamos o PuTTY e o Terminfo escondê-lo de nós.
por 24.10.2012 / 11:33