我刚刚设置了一台新计算机,像往常一样必须更改设置才能xterm
使删除键正常工作。 (Ctrl-H 发送^H
、退格发送^?
、删除发送^[[3~
。这当然是客观上正确的方法。)虽然默认的 xterm 设置有问题,但在此设置中一切正常,至少在 xterm 端是这样。
问题是,由于某种原因,stty
xterm 中的设置始终设置为erase = ^H
.除了在非 readline 标准输入中搞乱东西之外,这还使得开始在其窗口中默默地翻译,这使得像 emacs 这样的东西变得相当痛苦tmux
。^H
^?
我不知道为什么stty
要这样设置。这不是默认设置;单独键入stty
以显示与默认值的差异会显示该erase = ^H;
行,手动键入stty erase ^?
会删除该行。 (这也解决了 stdin 和 tmux 的问题。)但是,在我启动的每个终端中输入此内容非常乏味,虽然我可以将其放入.bashrc
或其他内容中,但我觉得这不是正确的方法。
是什么导致stty
使用这个特定的不正确的非默认设置?我怎样才能让它停止?
答案1
有很多方法可以做到这一点。你提到的方式可能是一种。xterm
是一个运行另一个程序的程序 - 它将另一个程序包装在 pty 中 - 通常是您的 shell - 并将您提供给包装的程序的输入传送到通道。关于伪终端的问题是它们只是模拟设备 - 因此xterm
需要猜测您最终将在其上打字的设备。当然,您可以得到更具体的信息。xterm
尊重各种环境变量 - 更好的是,xresources。
从man xterm
:
ttyModes
(班级TtyModes
)- 指定包含终端设置关键字及其可能绑定的字符的字符串。允许的关键字包括:布尔克,杜斯普,埃夫,停产,停产2,擦除,擦除2,冲水,整数,杀,下一个,辞职,转数,开始,地位,停止,悬念,开关和韦拉斯。控制字符可以指定为
^
char
(例如,^c
或^u
)并且^?
可用于指示删除(127)。用来^-
表示undef。使用\034
来表示^\
,因为 X 资源中的文字反斜杠会转义下一个字符。 stty
这对于覆盖默认终端设置非常有用,而无需每次xterm
启动时都执行操作。但请注意,给stty
定主机上的程序可能使用不同的关键字;xterm
的表是内置的。- 如果
ttyModes
资源指定了擦除值,则会覆盖ptyInitialErase
资源设置,即xterm
初始化终端以匹配该值。
- 指定包含终端设置关键字及其可能绑定的字符的字符串。允许的关键字包括:布尔克,杜斯普,埃夫,停产,停产2,擦除,擦除2,冲水,整数,杀,下一个,辞职,转数,开始,地位,停止,悬念,开关和韦拉斯。控制字符可以指定为