我想知道是否有任何方法可以让 bash 为包含 shift 键的组合键发送不同的代码?例如,(Ctrl+V告诉我)+ 和 ++Ctrl被N解释Ctrl为相同的(^N)。或者是否有一个可以有所作为的终端?或者可以抨击我修改它吗?ShiftN
3 回答
终端不直接与您的键盘交互;它与接收到的字节流交互,这些字节流通常(但不一定)由键盘生成。对于可打印的 ASCII 值,该值与键盘上的键(或组合)之间存在明显的对应关系。ASCII 97 是a,ASCII 65 是Shifta,依此类推。
但是,从 ASCII 0 到 ASCII 31 有 32 个非打印控制字符,之所以这样称呼,是因为它们旨在控制终端。为了输入它们,Control添加了 以允许您结合其他键生成这些代码。使用了一个简单的方案。按-xControl将生成对应于从x中减去 64 的控制代码。由于生成 ASCII 64,因此生成 ASCII 0。相同的映射适用于直通(请参阅您最喜欢的 ASCII 参考以查看其余对应关系)。@Control@A_
但是,是否需要 shift 键来生成 ASCII 64 到 ASCII 95 取决于您的键盘。在我的美国键盘布局上,只有[并且]可以在没有 shift 键的情况下键入。(请记住,我们在这里使用的是大写字母 ASCII 范围,而不是小写字母。)所以为了简化,我怀疑在确定使用-x发送Shift哪个键码时会忽略它。(请注意,如果由于某种原因,您的键盘有两个由键/Shift 键生成的介于 64 和 95 之间的字符,则您的终端需要为关联的控制字符定义备用映射。)Control
所有这些都只是(?)解释为什么ControlShift- x和Control- x通常是相同的。显然,您的现代操作系统可以区分各种键盘组合。但是在无数种可能性中,只有 256 个可以向终端发送唯一值;其余的必须重复一个或多个其他的。为了有用,它们需要配置为向终端发送一些多字节序列,通常以 ASCII 27 (ESC) 开头。当终端接收到该字节时,它们会暂停片刻以查看是否有任何其他字节随后出现。功能键、箭头键等键具有它们发送的相当标准的序列,终端以各种方式对其进行解释。其他键(如ControlShiftn在您的示例中)没有商定的含义,因此您的终端仿真器必须分配一个。大多数仿真器应该允许您这样做,但显然,它们如何做到这一点是特定于程序的。
iTerm2 允许您将 ++ Control(应该表示)之类的组合键映射到转义序列。默认情况下,Emacs 将某些转义序列转换为预期的键序列。因此,通过将 iTerm 中所需的组合键重新映射到适当的转义序列,您可以获得所需的行为。有关详细信息,请参阅此响应。Shift,C-<