在以下代码INS=\x1b\x5b\x32\x7e
中,十六进制值对应插入键
是否存在与按键相对应的任何十六进制值列表?
答案 0 :(得分:0)
Bash使用ANSI-C quoting,因此首先注意\x
不是密钥代码的一部分,但用来表示以下字符是十六进制的1/2位代码。
让我们以\x1b\x5b\x32\x7e
为例:
\x1b
是ASCII escape code(ESC
)
\x5b
指的是角色[
。在转义代码之后使用(所以ESC[
),它与控制序列介绍者(CSI)一起形成。 CSI告诉终端将下一个参数解释为序列的一部分
这用于(不全面)的特殊情况:
INS , DEL ,⇱,结束, PgUp , PgDn 和 F6 到 F12 。
为什么我们需要在这些特殊键上使用CSI?因为这些键使用 4到6位十六进制代码 - 所以它不能用单个\x00
参数解释,它必须是一个序列。
\x32
和\x7e
一起是控制序列,基本上被转换为2~
,它引用 INS 命令。在ANSI standard for ASCII terminals中,前面列出的键由十进制代码和~
(\x7e
)字符组合标识。在CSI序列中,操作由最后一个字符定义 - 在本例中为~
,对应于"特殊键操作"。
让我们举一个例子来证明这一点:17~
表示 F6 ,并使用the ASCII table翻译为\x31\x37\x7e
:
HEX Chr
--- ---
31 1
37 7
7E ~
所以,看起来不错 - 我们在添加CSI时有\x1b\x5b\x31\x37\x7e
,这是bash中 F6 的有效代码 - 请参阅列出大部分特殊内容的this gist密码。
但是如何知道 F6 应该翻译成17~
?通过查看ANSI code table,您会发现以下内容:
176
7E
~
DECKEYS
通过特殊功能键发送
[1~=FIND, [2~=INSERT, [3~=REMOVE, [4~=SELECT, [5~=PREV, [6~=NEXT [11~=F1… [17~=F6…[34~=F20 ([23~=ESC,[24~=BS,[25~=LF,[28~=HELP,[29~=DO)
这并不完美,但是从这里你可以建立下表( 这是理论 ,可能需要一些验证):
+-----+------+-------------+-----------+------------+-------------------+
| Key | Code | Hex | Key | Code | Hex |
+-----+------+-------------+-----------+------------+-------------------+
| F6 | [17~ | 5B 31 37 7E | END | [4~ OR [OF | 5B 34 7E OR 4F 46 |
| F7 | [18~ | 5B 31 38 7E | Home (⇱) | [1~ OR [OH | 5B 31 7E OR 4F 48 |
| F8 | [19~ | 5B 31 39 7E | Page down | [6~ | 5B 36 7E |
| F9 | [20~ | 5B 32 30 7E | Page up | [5~ | 5B 35 7E |
| F10 | [21~ | 5B 32 31 7E | Up | [! | 5B 41 |
| F11 | [23~ | 5B 32 33 7E | Down | [" | 5B 42 |
| F12 | [24~ | 5B 32 34 7E | Right | [# | 5B 43 |
| INS | [2~ | 5B 32 7E | Left | [$ | 5B 44 |
| DEL | [3~ | 5B 33 7E | | | |
+-----+------+-------------+-----------+------------+-------------------+
对于大多数用途来说,这应该足够了。
请注意,这个答案是为了解释bash中的密钥的ANSI引用,由于缺乏关于此的文档,它可能不准确。