问题

问题

问题

要向上滚动几行微信一个应该按<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]

相关内容