问题
要向上滚动几行微信一个应该按<Alt> + <PgUp>
。当我按下这些键时,程序认为我按下了<Alt> + ,
。
调试
在我的终端中,输入内容<PgUp>
为meta2-5~
。这可以正常工作并代表<PgUp>
转义序列:<Esc>[5~
。(因此,我的理解是meta2
。<Esc>[
)
键入内容<Alt> + <PgUp>
接收为meta-,
而不是meta-meta2-5~
。 (键入内容<Alt> + ,
也接收为meta-,
,因此我的理解<Alt>
与meta
此处相对应。)之所以<Alt>
接收为 ,meta-
是因为我在 Terminal.app 设置中选中了“将 Alt 发送为 Meta”。
现在(请稍等一下,这种行为很奇怪),如果我按下<Esc>
,这个家伙就会被接收为meta
!因此,要向上滚动几行,我可以按<Esc> + <PgUp>
几次。(我不能简单地一直<Esc>
按住并按几次s。我还<PgUp>
需要重新按下。)<Esc>
总结
<PgUp>
正确转义为meta2-5~
。<Alt> + <PgUp>
被错误地转义为meta-,
(应该是meta-meta2-5~
)。<Alt> + ,
正确转义为meta-,
。<Esc> + <PgUp>
被错误地转义(?)为meta-meta2-5~
。
设置
我坐在 Mac 上,使用 Terminal.app,通过 ssh 进入 CentOS 7.6.1810,连接到 tmux 会话,在一个窗口中运行 WeeChat。
附加信息
这里可以找到 ANSI 转义序列的完整列表。奇怪的是,<PgUp>
似乎被编码为0;73
,而不是预期的<Esc>[5~
。所以,我也不确定这个网站发生了什么。
附加背景信息锯末答案
您似乎误解了所需的击键以及哪些键可以生成字符。
我明白了。
那么,您是否按住了该
<Alt>
键,按下了该<PgUp>
键,然后松开了该<Alt>
键?
如果程序响应您“紧迫<Alt> + ,
”,那么您显然做了其他事情。
我确实做到了“按住该<Alt>
键,按下该<PgUp>
键,然后松开该<Alt>
键”。
我想知道 MacOS 是否捕获了该组合键并将其他内容发送到我的终端,就像这样<Alt> + ,
。
此
<Esc>
键不是修饰键,不应保留“按下”。
知道了。
该密钥的双字节代码
<PgUp>
为0x0 0x49
或十进制0 73
。
那么,你明白<Esc>[5~
“可能”指的是什么吗?
这个答案指出有时有必要强制执行 Mac 的终端应用程序发送正确的转义序列,并且准确无误<PgUp>
,\033[5~
这正是我的机器上正在发生的事情。我现在想知道当<Alt> + <PgUp>
按下时应该发送什么序列。
这些是按键之间的“绑定”和……?
谢谢你解答了我的困惑。
答案1
您似乎误解了所需的击键以及哪些键可以生成字符。
标准终端键盘的关键概念:
、和键本身不生成任何字符。这些键与另一个键组合时会<Shift>
生成 替代字符代码。 用于描述此类键组合的符号为: <Ctrl>
<Alt>
<modifier_key> + <char_key>
该符号表示您应该按住<modifier_key>
,键入(即按下并释放)<char_key>
,然后释放<modifier_key>
。此符号中使用的
加号+
表示组合键,并不表示应作为此组合键的击键键入或按下的键。
... 应该按
<Alt> + <PgUp>
。当我按下这些键时,程序认为我按的<Alt> + ,
是
那么,您是否按住了该<Alt>
键,按下了该<PgUp>
键,然后松开了该<Alt>
键?
如果程序响应您“紧迫<Alt> + ,
”,那么您显然做了其他事情。
请注意(与您的假设相反),修饰键不一定会添加字符以形成转义序列。修饰键可以根据类型键生成唯一的字符代码。
例如,<Shift> + <A>
生成大写A
字符。如果没有修饰键,则会生成<Shift>
小写字符。而生成 ASCII (标题开头)字符。a
<Ctrl> + <A>
SOH
<Alt>
之所以收到这样的原因meta-
,是因为我在 Terminal.app 设置中选中了“将 Alt 作为 Meta 发送”。
在 PC 上,键盘硬件会生成扫描码,以便每一个可以检测到按键(和释放)。
软件负责翻译和重新映射按键。
这意味着,前面关于<Shift>
、<Ctrl>
和<Alt>
键在标准终端上的行为方式的评论可能并不适用于所有情况。
您似乎在描述这种非标准的、自定义的键盘扫描码处理。
在 PC 上,可以定义复合修饰键,即<Ctrl> + <Shift> + <A>
。在电传打字机终端上,只有少数此类键组合会生成实际的字符代码。
显然,您描述的这个选项是为了替换密钥的功能<Alt>
。维基百科:
Meta 键是某些键盘上的修饰键。...通常
,
Meta 键的工作方式与 Macintosh 的键类似Command
,按住时会将字母和符号修改为即时命令(快捷方式)。在这些键盘上,您可以通过将 Meta 与其他修饰键(如Hyper
和)组合来获得每个字母的多个命令Super
。
...如果我按下
<Esc>
,这个家伙就会被接收为meta!
键<Esc>
是生成(控制)字符的键。它不是 、 和 键之类的<Shift>
修饰<Ctrl>
键<Alt>
。
<Esc> + <PgUp>
因此,需要通过先键入<Esc>
键,然后键入键来输入诸如 的序列<PgUp>
。(在这种情况下,加号实际上是多余的,如果不是不正确的话,按键应该简单地写成<Esc> <PgUp>
。
我不能只是一直
<Esc>
按住并点击几下。我还<PgUp>
需要再次按下。<Esc>
此<Esc>
键不是修饰键,不应保留“按下”。
此处可以找到 ANSI 转义序列的完整列表。奇怪的是,
<PgUp>
似乎被编码为0;73
,而不是预期的<Esc>[5~
。所以,我也不确定这个网站发生了什么。
您似乎误解了该网页。PC
键盘上按键和释放按键产生的数据在被应用程序“读取”之前要经过多次映射或转换。
最初键盘硬件生成扫描码操作系统
的键盘服务程序会将扫描码转换为双字节值或辅助字节值. 许多这些价值观都是由登记册建立的艾尔和啊 原始 IBM PC BIOS 的键盘服务例程返回的内容。
该键的双字节代码<PgUp>
为0x0 0x49
或十进制0 73
。
如果您希望<PgUp>
生成转义字符序列,则可以使用Set Keyboard Strings
您引用的网页上描述的命令。
ANSI 转义序列(一般来说)用于控制终端的显示端。
一般来说,终端键盘不会生成转义序列(除非该键没有 ASCII 字符,或者该键已被重新编程)。
附录
那么,你明白
<Esc>[5~
“可能”指的是什么吗?
不是。
您的问题很复杂,因为它是按键如何转换为(ANSI)转义码序列的混合体。问题在于:
- (a)软件可以将接收到的键盘扫描码翻译成它选择的任何内容,
有关如何在不同的软件环境中翻译/解释各种扫描码序列(即按键和释放)的示例,请参阅JavaScript 键盘事件
结论部分指出了要点 :
识别键盘上按下的键这样简单的事情竟然会变得如此混乱,这真是令人印象深刻。你会认为现在计算机技术已经足够先进,可以让这一切变得更好。
此外,ANSI 终端标准提供了用户重新定义各个键将生成的字符的能力(即Set Keyboard Strings
您引用的网页上描述的命令)。
- 并且 (b)
<Esc>[5~
可以被归类为用于“私人用途”的 ANSI 控制序列(由定义终端使用)。
ANSI 标准将两个字符序列ESC
和定义[
为“ESCape 序列的前缀”和“控制序列引入符”,又称 CSI。
终止字符~
或 0x7E 似乎将此序列归类为“私有”序列,终端(或终端仿真程序)可以将其定义为自己使用的序列。
显然,您提到的“将 Alt 发送为 Meta”选项是为了替代该键的功能<Alt>
。维基百科:
Meta 键是某些键盘上的修饰键。...通常
,
Meta 键的工作方式类似于 Macintosh 的键,当按住它时 ,Command
它会将字母和符号修改为即时命令(快捷方式)。在这些键盘上,您可以通过将 Meta 与其他修饰键(例如Hyper
和)组合来获得每个字母的多个命令Super
。... 软件通常提供另一种解决方法,例如使用 Alt 键
因此,大概会有配置能力来定义这些 Meta 键组合将响应的字符串(例如类似于Set Keyboard Strings
您引用的网页上描述的 ANSI 命令)。
<Alt> + <PgUp>
接收到的输入meta-,
为 而不是meta-meta2-5~
。
修饰键实际上可以为键组合生成全新的字符序列,并且可能不会简单地添加固定的子字符串。
因此,仅仅因为“<PgUp>
被接收为[或生成] meta2-5~
”,您不能使用它来预测的 Meta 版本是什么<PgUp>
。
所以我猜测在那个终端仿真程序的某个地方有一个定义,<Meta> + <PgUp>
这不是你所期望的。
答案2
回答
微信需要一个\033[5;3~
转义序列(参见源代码)向上滚动几行。您可以配置终端应用程序,使其在按下 时发送此类转义序列(如果尚未发送)<Alt> + <PgUp>
。
对于 Apple 来说终端应用程序去终端 > 首选项... > 配置文件 > 键盘添加此类缺失的键-操作对。(使用\033[6;3~
。<Alt> + <PgDn>
)
信用
我应该感谢锯末为了他的全面回答并指导我解决这个问题。 上的人们还提供了调试帮助。#[email protected]