当我选择“Ctrl+h”时,如何阻止 xterm 发送退格键

当我选择“Ctrl+h”时,如何阻止 xterm 发送退格键

我希望 xterm 停止将 Ctrl+h 转换为退格键。我将这个组合键用于其他用途,但终端每次都会捕获 Ctrl+h 并发送退格键。我怎样才能禁用这个功能?

请注意,这与其他禁用 Backspace 发送 Ctrl+h 的帖子不同,我正在处理相反的情况。

注意:如果有必要,请使用 Ubuntu 22.04。

答案1

退格键在终端中有两种不同的普遍行为。一种是生成字节 0x08(又名 ASCIIBSbackspace,通常表示为^H)。另一种是生成字节0x7F(又名DELdelete,通常表示为^?)。

恐怕目前还没有就选择哪一个达成普遍共识。我的印象^?是比较典型的。事实上,通过这种选择,您确实有机会区分 Backspace 按键和 Ctrl+H 按键。对于其他选择,它们必然是相同的。因此,由于您的目标是区分这两者,因此您应该投票给^?

在 Ubuntu 上,这是我的默认行为xterm。上游xterm并且terminfo似乎默认为^H,但 Debian(以及 Ubuntu)有一个补丁将其修改为^?。我不确定您为什么会看到这种^H行为(如果您看到的话),也许您已经xterm为自己手动安装了。或者也许您的 xterm 生成了^?,但您使用的应用程序决定执行与 相同的操作^H

三个主要组件必须彼此保持一致。

一是终端模拟器的实际行为。要验证这一点,请运行该命令showkey -a,然后按 Backspace。如果它报告,^H那么您应该将终端的行为更改为发出^?

另一个是行规则设置,当行处于烘焙模式时由内核使用(例如,当您运行cat并期望 Backspace 键照常工作,而不是打印^H或 时^?)。您可以通过stty -a和 查找来查询该值erase = ...,或者通过stty erase '^?'或设置stty erase '^H'

第三个是terminfo定义。 Run infocmp | grep kbs, 的值kbs应该是^?^H匹配所有其余的(即^?,这就是我们想要的)。如果不是这种情况,您应该深入研究 terminfo 以研究如何更改其定义,或者如何为 TERM 选择不同的值。不知道如果设置不正确会有什么后果;我假设 ncurses 应用程序中的文本输入字段可能在按退格键时无法正常工作。

以上三项应该按什么顺序设置?这里没有明显的答案。有多种有效的解决方案。您可以将终端模拟器设置为某种行为,也许某些终端甚至会自动设置stty属性来匹配。或者您可以stty先设置该属性,然后将终端配置为按照stty指示运行。您还可以将您的行为配置xterm为根据 terminfo 中描述的行为。至于xterm,请参阅backarrowKeyIsErase其手册页以研究可能性并选择一个来使用。不幸的是,我不熟悉非常确切的细节来告诉你到底该怎么做;主要是因为在 Ubuntu 上我^?默认得到了一致的行为,所以我不必篡改这些。

一旦您设法一致地配置这三个位置以供使用^?(回顾一下:1. 经 验证的终端实际行为showkey -a,2.设置,以及 3.经 验证stty的 terminfo 对当前情况的描述),绝大多数应用程序应该正常运行,并且应该能够区分 Ctrl+H(字节 0x08)和 Backspace 键(字节 0x7F)。如果在特定应用程序中仍然不是这种情况,那么您需要研究该特定应用程序的文档和设置。$TERMinfocmp

如果您ssh连接到远程主机,则应确保stty登录后设置仍然正确,并且远程 terminfo 数据库也与实际行为一致。

相关内容