2010-05-18 42 views
8

我不知道为什么在常见的Linux终端退格键实际上并不删除字符,打印时(通常键入时有效)..退格性格古怪

这按预期工作:

$ echo -e "abc\b\b\bxyz" 
xyz 

\b计算结果为退格,也可以插入作为Ctrl键 + VCtrl键 + ħ - 呈现为^H0x08))

,但是当有在退格后更少的字符,行为怪异揭晓:

$ echo -e "abc\b\b\bx" 
xbc 

它像左箭头键而不是退格键:

$ echo -e "abc\e[D\e[D\e[Dx" 
xbc 

擦除回线正常工作:

$ echo -e "abc\e[1Kx" 
x 

实际上当I型按Ctrl + V退格在终端,^?0x7f)的产生,而不是^H,这是德尔 ASCII字符,但Ctrl键 + V德尔产生<ESC>[3~,但这是另一回事..

所以有人可以解释为什么打印退格字符不会擦除字符?

(我的环境是Linux的的xterm和其他一些终端仿真器,$TERM == xterm,试图vt100Linux为好)

回答

16

你们看到的是正确的。退格或^H将光标向左移动,不擦除。要删除一个字符,您需要输出^H ^H(Backspace-Space-Backspace)。


为了回答您的评论 - Backspace键被定义这种方式在VT100/ANSI家庭终端,从很多终端控制代码序列的借款。请参阅VT100用户手册here,该手册将BS的功能定义为“将光标移动到左侧的一个字符位置,除非它位于左边缘,在这种情况下不会发生任何动作”。换句话说,它是一个历史的怪癖:)

至于为什么它是最初定义这种方式 - 我想它有一个非破坏性的光标移动控制代码更灵活,因为破坏性的退格可以实现,如上所示。

+0

好吧,这不是一个解释_why_退格控制字符的行为像左光标键,而不是根据普通意义上(擦除最后一个字符) – mykhal 2010-05-18 10:51:00

+0

现在我很满意,谢谢你的spec链接:) – mykhal 2010-05-18 11:23:06

+7

真正的原因它的工作原理这种方式是因为更旧的“硬拷贝”终端,像打字机一样在纸上打印。在这样的终端上,一旦输出字符就无法擦除字符。类似打字机的终端也是我们仍然在Windows上使用单独的“回车”和“换行”字符结束行的原因。 – alexis 2012-03-12 13:24:04