如何导出代表屏幕中某个击键的字符序列?我的意思是,bind 将什么作为输入。例如,“s”代表“s”键上的明显击键。 “S”代表“shift+s”。但其他更复杂组合的表示对我来说并不清楚,并且遵循的方案似乎相当模糊。
我四处寻找之前询问过特定情况“tab”和“shift+tab”的表示是什么,但我找不到答案。所以我想最好的办法就是尝试理解总体方案。我也见过这,但它现在对我有用。
有人可以解释一下为此遵循什么方案/规则屏幕吗?导出任意组合键的表示形式的规则是什么?它们是特定于屏幕的还是与其他软件共享?也许还有其他 GNU 软件?这是在哪里记录的?
答案1
没有任何方案screen
像任何终端应用程序一样不处理击键,而是处理从终端设备读取的字符或字符序列。
终端(或类似终端仿真器xterm
)将击键转换为字符或字符序列,并通过线路(在终端仿真器的情况下,该线路是虚拟的)发送到系统。终端设备的线路规则可能会对此进行一些修改(例如将CR变成LF)。
要知道screen
当您在终端上键入内容时接收到什么字符或字符序列,您可以使用例如来od
为您显示它们。
例如,如果我输入od -tc
终端,od -tc
将从终端设备读取字符,并将它们显示在标准输出上(如果您没有重定向输出,则也显示在终端设备上)可打印方式。
例如,这是我输入时的输出:(Up Enter Ctrl+D后者表示od
输入结束):
0000000 033 [ A \n
0000004
Up已发送 3 个字符 ESC[
和A
,并且\r
已更改为\n
。
screen
实际上将其主机终端设置为生的模式,这样行规则就不会进行任何转换,并且不会对任何字符进行特殊处理(例如上面004
发送的字符Ctrl+D)。
要查看终端在该模式下发送的内容,您可以执行以下操作:
$ stty raw; stty min 1 time 10; dd count=1 2> /dev/null | od -tc; stty sane
0000000 033 [ A
0000003
请注意,\n
输出 byod
尚未转换为\r\n
for 输出(\n
是换行,当输出到终端时,它仅将光标向下移动,而不是移动到需要回车符 ( \r
) 的行的开头)。
上面,我们将终端设置为生的模式,但也要设置它,以便read
一旦接收到字符,终端设备上的 a 在百分之十秒后超时(因为否则,我们必须在完成返回1
之前输入很多字符)。read
od
按所有终端都会发送 TAB ASCII 字符,Tab也称为\t
或^I
或。对于,并非所有终端都发送相同的内容(例如,有些终端发送,有些也发送,有些不发送)。C-I
\011
Shift+TabESC
[
Z
\t
terminfo 数据库可以$TERM
通过kcbt
功能 (后标签,但不一定发送Shift-Tab)。
对于当前终端:
$ tput kcbt | od -tc
0000000 033 [ Z
0000003