![使用 ahk 生成终端的转义序列](https://linux22.com/image/1334831/%E4%BD%BF%E7%94%A8%20ahk%20%E7%94%9F%E6%88%90%E7%BB%88%E7%AB%AF%E7%9A%84%E8%BD%AC%E4%B9%89%E5%BA%8F%E5%88%97.png)
我正在尝试为 putty 制作一个 ahk,以便发送我想要的一些组合键的键码,以便我的程序也可以在终端上运行。
为此,我已经有一个 ahk,它的一些组合键可以正常工作,通过从这里和那里、从键表等进行了大量实验,但我仍然不明白,没有想出一个清晰的、合乎逻辑的方法来计算我想要的退出键。
一个例子:
^F1::SendInput ^[O5P
在我的测试程序中它给出了 28。
我发现对于^[1
我得到 377 和对于^[2
376,并且我发现可以使用十六进制数(AF)中的字母,以及;和~或双精度[[
。
您了解这是如何运作的吗?有没有什么好的描述材料?非常感谢!
答案1
如果你想“发送”功能键,请使用适当的语法
^F1::SendInput {F5}
这会导致 Putty 表现得好像您按下了 F5 一样,然后它会向服务器发送适当的字符序列(转义序列)。
PC Server
+---------------------+ Network +-------------------------+
| [AHK] ----> [Putty] | ============> | [TTY] ------> [Program] |
| F5 | Esc [ 15 ~ | Esc… | ^ |
+---------------------+ | | | F5 |
| v | |
| $TERM------[Curses] |
| | |
| /usr/share/terminfo |
+-------------------------+
在服务器上,转义序列首先由 TTY 处理程序处理(查找中断信号等),然后提供给您的服务器程序,该程序通常会将其交给库,该库将curses
转义序列重新转换为函数名称。然后程序决定在收到该结果后要做什么。
实际的转义序列取决于“终端模拟”。默认情况下,Putty 模拟 xterm。Curses 库使用环境变量 TERM 的值在 terminfo 中查找转义序列所代表的函数。
功能键的转义序列可以在 /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 隐藏它。