1

Я пытаюсь сделать akk для putty для отправки кодов, которые я хочу для некоторых комбинаций клавиш, чтобы моя программа работала также через терминал.

Для этого у меня уже есть ахк с некоторыми комбинациями клавиш, которые работают должным образом, экспериментируя очень много времени здесь и там, с таблицами ключей и т.д., Но я до сих пор не понимаю, не придумал ясного, логичного метода для расчета выхода ключ, который я хочу.

Пример:

^F1::SendInput ^[O5P

Это дает 28 в моей тестовой проге.

Я вижу, что для ^[1 я получаю 377 и для ^[2 376, и я вижу, что можно использовать буквы из шестнадцатеричных чисел (AF), а также ; и ~ или двойной [[ .

Вы понимаете, как это работает? Есть хороший описательный материал для этого? Большое спасибо!

1 ответ1

2

Если вы хотите "отправить" функциональную клавишу, используйте соответствующий синтаксис

^F1::SendInput {F5}

Это приведет к тому, что Putty будет действовать так, как если бы вы нажали F5, а затем отправит соответствующую последовательность символов (последовательность Escape) на сервер.

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

На сервере последовательность Escape сначала обрабатывается обработчиком TTY (ищет сигналы прерываний и т.д.), А затем передается вашей серверной программе, которая обычно передает ее в библиотеку curses которая переводит последовательности Escape обратно в имена функций. Затем программа решает, что делать в результате ее получения.

Фактическая последовательность Escape зависит от "эмуляции терминала". По умолчанию Putty эмулирует xterm. Библиотека Curses использует значение переменной окружения TERM для поиска в terminfo, какая функция представлена escape-последовательностью.


Escape-последовательности для функциональных клавиш можно найти в /etc /termcap, вот несколько

                                    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       -

Заметки

  • В серии VT100 было только четыре функциональных клавиши с маркировкой от PF1 до PF4
  • VT220 имел 20 функциональных клавиш с маркировкой до F20
  • VT220 использовал функциональную клавишу в положении 5 для функции "прерывания". (следовательно, разрыв выше)
  • Не все эмуляторы или существующие файлы termcap/terminfo согласны с вышеизложенным.
  • Есть странные пробелы в прогрессии.
  • xterm - это не определение, это неуправляемая семья неудачников, нет двух одинаковых.
  • То же самое "ANSI"
  • Многие эмуляторы используют что-то вроде Shift+F1 для F13, Alt+F1 для F25 и т.д.
  • В PuTTY shift+F1 - это то же самое, что F11 (не F13)
  • Да, это беспорядок. Вот почему мы позволяем PuTTY и Terminfo скрыть это от нас.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .