【问题标题】:Make bash differentiate between Ctrl-<letter> and Ctrl-Shift-<letter>让 bash 区分 Ctrl-<letter> 和 Ctrl-Shift-<letter>
【发布时间】:2013-01-29 19:33:05
【问题描述】:

我想知道是否有任何方法可以让 bash 为包含 shift 键的组合键发送不同的代码?例如, (Ctrl+V 告诉我) Ctrl+NCtrl+Shift+N 的解释相同 (^N)。或者是否有一个可以有所作为的终端?或者可以bash我修改它吗?

【问题讨论】:

  • 这取决于你的终端模拟器。当我按Ctrl+Shift+C 时,我的模拟器(Terminal.app)不发送^C
  • 但是我没有mac...
  • 关键是它依赖于你的终端模拟器。
  • 嗯,是的,你能推荐我一个会有所作为的吗?
  • 很遗憾,我不在 Linux 上。对不起:(

标签: linux bash


【解决方案1】:

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

但是,从 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 之间的两个字符,则您的终端需要为关联的控制字符定义备用映射。)

所有这一切都只是(?)解释为什么 ControlShift-xControl-x 通常是相同的。显然,您的现代操作系统可以区分各种键盘组合。但是在无数种可能性中,只有 256 个可以向终端发送唯一值;其余的必须重复一个或多个其他的。为了有用,它们需要配置为向终端发送一些多字节序列,通常以 ASCII 27 (ESC) 开头。当终端接收到该字节时,它们会暂停片刻以查看是否有任何其他字节随后出现。功能键、箭头键等键具有它们发送的相当标准的序列,终端以各种方式对其进行解释。其他键(例如您的示例中的 ControlShiftn )没有商定的含义,因此您的终端仿真器必须分配一个。大多数模拟器应该允许你这样做,但显然,它们是如何做到的,是特定于程序的。

【讨论】:

  • 谢谢。我也在使用美国布局。是否可以修改模拟器分配给不同键绑定的内容?比如说 bash。
  • bash 不是你的模拟器;模拟器是xterm之类的。
  • 好的。但是请告诉我,据你所知,我有没有办法实现我的目的?
【解决方案2】:

这里有两篇关于 bash 中键盘快捷键自定义的精彩文章:

Bash: call script with customized keyboard shortcuts?

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

【讨论】:

  • 不幸的是没有真正相关。问题是 Ctrl+A 和 Ctrl+Shift+A 都发出相同的键码。
  • 我的错。你在做什么系统?在我的 Fedora 机器上,CTL + Shift 的默认键映射主要属于系统,而不是单个应用程序。
  • Ubuntu 10.04。基本上我需要这个用于emacs。 Ctrl+e 转到行尾。我希望 Ctrl+shift+e 标记直到行尾(在终端模式下 - emacs -nw,在 GUI 模式下它可以工作。
【解决方案3】:

iTerm2 允许您将诸如 Control+Shift+, 之类的组合键(应该代表C-&lt;)映射到转义序列。默认情况下,Emacs 将某些转义序列转换为预期的键序列。因此,通过将 iTerm 中所需的组合键重新映射到适当的转义序列,您可以获得所需的行为。详情请见this response

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-09
    • 2016-03-16
    • 2010-10-25
    • 2010-09-08
    • 2011-01-07
    • 1970-01-01
    相关资源
    最近更新 更多