我希望 xterm 停止将 Ctrl+h 转换为退格键。我将这个组合键用于其他用途,但终端每次都会捕获 Ctrl+h 并发送退格键。我怎样才能禁用这个功能?
请注意,这与其他禁用 Backspace 发送 Ctrl+h 的帖子不同,我正在处理相反的情况。
注意:如果有必要,请使用 Ubuntu 22.04。
答案1
退格键在终端中有两种不同的普遍行为。一种是生成字节 0x08(又名 ASCIIBS
或backspace
,通常表示为^H
)。另一种是生成字节0x7F(又名DEL
或delete
,通常表示为^?
)。
恐怕目前还没有就选择哪一个达成普遍共识。我的印象这^?
是比较典型的。事实上,通过这种选择,您确实有机会区分 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)。如果在特定应用程序中仍然不是这种情况,那么您需要研究该特定应用程序的文档和设置。$TERM
infocmp
如果您ssh
连接到远程主机,则应确保stty
登录后设置仍然正确,并且远程 terminfo 数据库也与实际行为一致。