有TODO list的好处在于,一件自己想做的事情,只要写上去了,TODO list会督促着你。即使你很懒,那东西会一直提醒你,让你纠结,直到你狠 下心来把它作掉。这就是我现在在写这篇文章的动力所在。


起因

最近遇到一件奇怪的事情。

我在公司里面,从Debian下的xterm,ssh到AIX的服务器,在SMS或者VIOS里面,退格键会造成屏幕输出^?,也就是说,我在Debian下的xterm里面,backspace键输出的是^?,也就是ctrl-?H,而AIX的服务器端,它认的backspace是^H,也就是ctrl-H。

这本不是什么大不了的事情,因为我随时可以用下面的方法改变终端所识别的退格键

stty erase <ctrl-V><backspace>

但是,当我回到家里,用自己的笔记本上Archlinux的xterm,ssh到公司的AIX主机上,退格键就好使了,换句话说,Archlinux下的xterm,backspace键输出的就是AIX所认的^H。同样是xterm,为什么在Debian下和Archlinux下的backspace输出是不一样的呢?

再次请教google大神,找到了满意的答案。好吧,“The Linux Hall of Shame”。

渊源

这缘起一直要追到化石级的vt100终端去,尽管现在没人实际用它,但是它的一系列键的配置,已经成了事实标准。vt100在终端里面的地位,就好像sh在shell里面的地位一样。vt100里面,backspace实际上就是^?。现在,大家常用的终端类型,一般都是xterm兼容的,因为xterm的功能多些嘛。xterm的在终端类型里面的地位,就好像bash在shell里面一样。但是xterm不知道从哪个版本起,不知道出于什么原因,也许是错误也许是鬼迷心窍,默认编译好了,backspace就是^H。这下问题就出来了,那些开发终端的,到底兼容vt100还是兼容xterm好呢?事实结果是,有的选择了完全兼容xterm,有的选择了大部分兼容xterm但是backspace兼容vt100(rxvt-unicode),有的则在兼容xterm的同时让你选择backspace键输出(putty)。Debian的维护人员也觉得xterm这个配置太不靠谱,于是他们修改了Debian下的默认值,于是造成了Archlinux和Debian下的xterm的backspace输出不同。

可以用这个命令查看当前终端的backpace输出:

stty -a

这里罗列下不同终端或系统下的所认的退格键:

终端或者系统 vt100 vt220 xterm xterm(Debian) rxvt-unicode Windows AIX
backspace = ^? ^? ^H ^? ^? ^H ^H

这也解释了为什么在xterm里面开的screen,然后在rxvt-unicode里面去attach,就会发生backspace不好使的问题。尽管我对urxvt的开发者在某些事情上的态度不是太喜欢,但是,他们好歹把这个弄对了。

让xterm默认输出^?

办法是有的,在~/.Xresources添加下面的代码,就能让xterm在哪里都输出^?了。

*VT100.Translations: #override \
        <Key>BackSpace: string(0x7F)\n\
        <Key>Delete:    string("\033[3~")\n\
        <Key>Home:      string("\033[1~")\n\
        <Key>End:       string("\033[4~")
*ttyModes: erase ^?

xterm.*backarrowKey: false

这样xterm是不错了,坏处是,不管我在哪边的xterm,上到AIX上都要重新设下退格键了。