Thursday, August 1, 2013

关于 stty, erase, ^H, ^?

引用这位同学的问题,之前自己经常遇到但是没有好好总结。

表现就是,在 terminal 里面,backspace 经常会出现问题,偶尔会看到 ^? 或 ^H 这种东西的出现。

由于历史原因 (追溯到打卡机时代),要删除一个字符,必须先 ASCII BS (0x08, ^H) 回到前一个字母,然后再 ASCII DEL (0x7F, ^?) 删除它。

现代电脑里,backspace 的作用基本上就相当于上述 BS+DEL的功能,而delete真正发送的是"^[[3"。而事实上 backspace 究竟定义为 ^H 还是 ^? 只是一个个人的选择,并且没有标准,所以不同的 terminal emulator 可能会采用不同的值。

我们知道可以用不同的 terminal (emulator) login 到一个机器上。但是不同 terminal 有不同的 key mapping,具体来说,它们 backspace 发送的值可能 *不一样*. 比如 linux console 是模拟 vt220 的,backspace 发送的是 DEL,而 xterm 模拟 vt100,backspace 发送的是 BS。

而 stty 是用来控制 terminal options 的。简单来说,是控制 terminal 怎么理解输入的字符串的。如果 backspace 发送的值与 stty 的设置定义不一样,那么就可能出现问题,最常见的,就是 stty 里 erase (向前删除一个字符) 设置为 ^? 而 backspace 发送的是 ^H. 这时解决方法是:

1. 设置 stty 理解 ^H 为 erase: stty erase ^H,或者
2. 设置 terminal emulator, 使得 backspace 发送 ^? 而不是 ^H。


历史与详细解决方法:http://www.ibb.net/~anne/keyboard.html

No comments: