除了 Control 之外的其他键是否可以发送 SIG*?

除了 Control 之外的其他键是否可以发送 SIG*?

我想交换 Ctrl 和 Super,以便我可以使用物理 super/meta 键进行复制/粘贴/全选/查找/等。没有特定于应用程序的配置,而该配置通常不存在。

但是,我想在物理控制键上保留 SIGINT、EOF、挂起等。

我已经尝试过设置URxvt.keysym.M-c: ^C,并且我知道stty可以将其更改为例如^K,但据我所知,它无法更改修饰键 - 要么更改为不同的键符号,要么直接更改为键码。

这可能吗?

答案1

某些击键到信号的转换是在非常低的级别上执行的:它是由内核中的通用终端驱动程序在终端仿真器进程或物理终端硬件与终端中运行的程序之间进行中继时完成的。该驱动程序仅理解字符(这里所说的字符,我指的是字节——在设计这些接口时,多字节字符集还不是一个东西)。

大多数涉及除功能键之外的修饰符Shift或涉及功能键的击键没有相应的字符,因此终端必须发送多字符转义序列(以 ASCII 开头)转义字符)。看bash - 与 control+alt+space 的键序列绑定错误键盘输入和文本输出如何工作?有关此主题的更多背景信息。

有与Ctrl+对应的字符letter(ASCII控制字符),但不是Super+ letterMeta+C发送两个字符序列ESC C,并且Super+在大多数终端中默认C仅发送。因此,您可以将+C上的信号(和一些标点符号)重新绑定到单字节可打印字符,仅此而已(也绑定到非 ASCII 字节,但这会对 UTF-8 造成严重破坏)。Ctrlletter

唯一的解决方案是将您的终端模拟器配置为针对您想要触发 SIGINT 的任何击键发送Ctrl+ 。C对于 Rxvt,您的方向是正确的,但是^C插入两个字符^C,您需要 control-c 字符,您可以使用八进制转义来指定它。此外,M-cMeta+ C,而不是Super+ C;对于Super+ C、 run xmodmap -pm,注意mod1through中哪个mod5是 Super,并使用相应的数字作为修饰符,例如

URxvt.keysym.5-c: \003

相关内容