bash - 与 control+alt+space 的键序列绑定错误

bash - 与 control+alt+space 的键序列绑定错误

我正在尝试安装一些按键序列绑定,但遇到了麻烦。我的 shell 是 bash,我的终端是 gnome-terminal,我的系统是图形模式的 Ubuntu 14.04。 编辑:我的键盘是法语 azerty,带有数字键盘和 ctrl、fn、super、alt。

编辑:Abash 指南,阅读章节

我想添加contol++altspace,但是这个确切的序列不起作用,而类似的其他序列则可以正常工作。我的目标是运行 shell-expand-line readline 但我尝试了 upcase-word 进行比较。

--我们来分析一下我的目标的安装效果。

这是我添加~/.inputrc的(ctrl++ ):metaspace

"\e\C- ": shell-expand-line

这是新的结果bind -p

"\e\C-@": shell-expand-line

当然,我启动了几个终端,一个在安装前,一个在每次安装后,以便进行彻底比较。

--一些确保 control+alt 代替 control+meta 工作的实验。

系统应该模拟Metawith Alt,bash 应该模拟Metawith Escape,两者都使用字节“\033”。我尝试了两者AltEsc得出结论它工作正常。我测试了一些 ctrl+meta+letter 序列来确定。

顺便说一句,Ctrl+的各个样本很简单:扩展一个孤立的波形符“~”(shell-expand-line)或用+ +或+ +Alt改变随机小写单词(upcase-word)的大小写。+ +已经绑定到 shell-expand-line 所以我只是将绑定与无用的+ +混合在一起。ctrlmetaectrlmetavCtrlmetaectrlmetav

——一些更复杂的观察……

我读到“^@”说明了“NUL”字符。为什么要这样逃跑呢?

我测试了 xev 并按下了ctrl+ alt+ space:报告的字符是“NUL”字符。

我看到alt+space通常打开gnome终端的窗口菜单,而alt则启用菜单,当然没有control键。

冲突似乎来自系统,但我是新手。我刚刚阅读了 bash 手册的大部分内容(尤其是 readline 章节)和一个关于 xev 的论坛建议。

- 问题

还有更多要说或纠正的吗?为什么要重写序列?如何使我的++ctrl与bash 和 gnome-terminal 一起工作?altspace

编辑:我发现“@”被转换为“NUL”,因为转义时应用了按位掩码,但我看不出Alt+space给出“NUL”的任何原因。

答案1

终端仿真器(在您的情况下为 Gnome 终端)将像Ctrl+ Alt+这样的组合键Space(它作为Space带有Ctrl和 meta 修饰符的键符号接收)转换为字节序列。和空格等文本字符a按原样发送;如果存在,则不对应于字符的键将作为控制字符发送(例如,字节 13 = 回车 = Return,字节 9 = 制表 = Tab),如果不存在,则作为以字节 27 = 转义开头的转义序列发送。Alt+ 字符作为转义符发送,后跟该字符(出于所有意图和目的,在当今的典型配置中,将“Alt”和“Meta”视为同义词 - 我不会在本文中讨论该主题)。也可以看看键盘输入和文本输出如何工作?

Ctrl如果存在+字符,则将其作为控制字符发送(例如+ 或++ CtrlA字节Ctrl1 = ^A)。没有控制空间字符,但由于历史原因,组合键+通常作为字节 0 = ^@ 传输。ShiftACtrlSpace

Ctrl您可以通过在 bash 命令行上按+,V然后按您感兴趣的键或组合键来查看终端发送的键序列。 Ctrl+V告诉 bash 插入下一个字符,无论它是什么,而不是将其解释为命令。

Ctrl将+ Alt+Space作为两字节序列 27, 0 = escape, ^@传输是合乎逻辑的。不幸的是,Gnome 终端不会这样做,它会发送 27, 32 = escape, space。无法配置 Gnome 终端发送的按键序列(您需要修补 VTE 库)。因此,如果您希望能够在终端中使用Ctrl++ Alt,您有几种可能性:Space

  • 使用不同的终端模拟器。 Ubuntu 中大约有 40 个。
  • 编辑源代码VTE图书馆使其发送不同的转义序列。您可能想建议将此作为增强功能。
  • 也许用于LD_PRELOAD修补从 Gnome 终端到 libvte 的调用。我还没有检查它是否实用,无论如何它会很麻烦——如果你很在意,请使用不同的终端模拟器。
  • 配置您的窗口管理器或外部程序,以便在 Gnome 终端窗口处于活动状态时将Ctrl+ Alt+更改SpaceEsc Ctrl+ 。Space在大多数环境中,要在不中断其他应用程序的情况下做到这一点并不容易。

简而言之,如果您想使用此绑定,则需要使用不同的终端模拟器,例如 xterm(其中组合键的转义序列是完全可配置的)。

答案2

你的 gnome 终端(实际上是底层的 vte-0.34)发出了错误的ctrl+ Alt+序列space。错误 (https://bugzilla.gnome.org/show_bug.cgi?id=710349)已在 vte-0.36 中修复。

如果您不害怕黑客攻击,并且能够在出现问题时安全地恢复,您可以尝试在 Ubuntu 14.04 上安装 vte-0.36。除了这一修复和改进之外,您还将获得许多其他修复和改进。您可能会在 Gnome3 staging 中找到 PPA 或软件包,或者自己编译它。升级到此版本的 vte 不需要接触任何其他软件组件。需要完全重新启动 gnome-terminal(关闭所有窗口)。

相关内容