Генерация escape-последовательностей для терминала с помощью ahk
Я пытаюсь сделать akk для putty для отправки кодов клавиш, которые я хочу для некоторых комбинаций клавиш, чтобы моя программа работала также через терминал.
Для этого у меня уже есть ахк с некоторыми комбинациями клавиш, которые работают должным образом, экспериментируя очень много времени здесь и там, с таблицами ключей и т. Д., Но я до сих пор не понимаю, не придумал четкого, логичного метода для расчета выхода ключ, который я хочу.
Пример:
^F1::SendInput ^[O5P
Это дает 28 в моей тестовой проге.
Я вижу это для ^[1
Я получаю 377 и для ^[2
376, и я вижу, что буквы из шестнадцатеричных чисел (AF) могут быть использованы, а также ; и ~ или двойной [[
,
Вы понимаете, как это работает? Есть хороший описательный материал для этого? Большое спасибо!
1 ответ
Если вы хотите "отправить" функциональную клавишу, используйте соответствующий синтаксис
^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 скрыть это от нас.