使bash区分Ctrl- <letter>和Ctrl-Shift- <letter> </letter> </letter>

时间:2013-02-14 03:32:42

标签: linux bash

我想知道是否有任何方法可以让bash为包含shift键的组合键发送不同的代码?例如,( Ctrl + V 向我显示) Ctrl + N Ctrl + Shift + N 被解释为相同(^ N)。或者是否有可以发挥作用的终端?或者可以抨击我进行修改,以便它可以吗?

3 个答案:

答案 0 :(得分:6)

终端不直接与键盘交互;它与它接收的字节流交互,这些字节通常(但不一定)由键盘生成。对于可打印的ASCII值,值与键盘上的键(或组合)之间存在明显的对应关系。 ASCII 97是 a ,ASCII 65是 Shift a ,依此类推。

但是,从ASCII 0到ASCII 31有32个非打印控制字符,因为它们用于控制终端。为了输入它们,添加了 Control 以允许您与其他键组合生成这些代码。使用了一个简单的方案。按 Control - x 将生成对应于从 x 减去64的控制代码。由于 @ 生成ASCII 64, Control @ 生成ASCII 0.同样的映射适用于 A _ (请参阅您最喜欢的ASCII参考,以查看其余的对应关系)。

但是,您是否需要使用Shift键来生成ASCII 64到ASCII 95取决于您的键盘。在我的美国键盘布局上,只有 [] 可以在没有shift键的情况下输入。 (请记住,这是我们在这里使用的大写 - 通信ASCII范围,而不是小写。)因此,为了简化,我怀疑是否会忽略 Shift 确定使用 Control - x 发送哪个键码。 (请注意,如果由于某种原因键盘上有两个由键/ Shift键对生成的64到95之间的字符,则终端需要为关联的控制字符定义备用映射。)

所有这些只是(?)来解释为什么 Control Shift - x Control - x 通常是相同的。显然,您的现代操作系统可以区分各种键盘组合。但是在众多可能性中,只有256个可以向终端发送唯一值;其余部分必须与一个或多个其他部分重复。为了有用,它们需要配置为向终端发送一些多字节序列,通常以ASCII 27(ESC)开头。当终端接收到该字节时,它们暂停片刻以查看是否有其他字节。功能键,箭头键等键具有相当标准的序列,终端以各种方式解释。其他键(例如 Control Shift n )没有达成一致意思,因此您的终端模拟器必须分配一个。大多数模拟器应该允许你这样做,但是他们这样做的方式显然是程序特定的。

答案 1 :(得分:1)

这里有关于bash键盘快捷键自定义的两篇很棒的文章:

Bash: call script with customized keyboard shortcuts?

In bash, how do I bind a function key to a command?

答案 2 :(得分:0)

iTerm2允许您将诸如 Control + Shift + (应表示C-<)之类的键组合映射到转义符顺序。 Emacs默认将某些转义序列转换为预期的键序列。因此,通过将iTerm中所需的组合键重新映射到适当的转义序列,您可以获得所需的行为。有关详细信息,请参见this response