【问题标题】:Backspace character weirdness退格字符怪异
【发布时间】:2010-05-18 10:27:45
【问题描述】:

我想知道为什么普通 Linux 终端中的退格字符在打印时实际上并没有擦除字符(通常在键入时有效)..

这按预期工作:

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

(\b 计算为退格,也可以插入为 Ctrl+V Ctrl+H - 呈现为^H (0x08))

但是当退格后的字符较少时,就会发现奇怪的行为:

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

它的行为类似于左箭头键而不是退格键:

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

擦除回线正常工作:

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

事实上,当我在终端中键入 Ctrl+V Backspace 时,会产生^? (0x7f) 而不是@ 987654330@,这是 Del ascii 字符,但是 Ctrl+V Del 产生<ESC>[3~,但它是另一个故事..

那么有人可以解释为什么打印的退格字符不会删除字符吗?

(我的环境是xterm Linux和其他一些终端模拟器,$TERM == xterm,也试过vt100Linux

【问题讨论】:

    标签: text terminal backspace


    【解决方案1】:

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


    回答您的评论 - 退格键在 VT100/ANSI 终端系列中以这种方式定义,许多终端控制代码序列都从中借用。参见VT100用户手册here,其中将BS的功能定义为“将光标向左移动一个字符位置,除非它在左边距,在这种情况下不发生任何动作”。换句话说,这是历史的一个怪癖:)

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

    【讨论】:

    • 好吧,这不是解释为什么退格控制字符的行为类似于左光标键,而不是根据常识(擦除最后一个字符)
    • 它以这种方式工作的真正原因是因为更古老的“硬拷贝”终端可以像打字机一样在纸上打印。在这样的终端上,一旦字符被输出,就无法擦除它。类似打字机的终端也是我们仍然坚持在 Windows 上使用单独的“回车”和“换行”字符来结束行的原因。
    • 顺便说一句,我不知道常识,但“退格”的意思是“向后移动”,而不是“擦除”。无论哪种方式,我都不在乎,但 Richard Stallman 直言不讳地指出你的拍摄有多么错误,以及 Delete 是如何真正的擦除。他拒绝释放 emacs 中的 ^H 键,因为他对“满足损坏的协议”或类似的东西不感兴趣。 :-)
    • 还有F^HF是粗体,这个输出是由manless处理的,试试echo -e F^HFO^HOO^HO | less。现在我明白为什么了,在同一个地方两次打印同一个字符很简单。
    • @jcubic 的代码不太适合我。对于那些想玩这个尝试echo -e 'F\bFO\bOO\bO' | less
    猜你喜欢
    • 2012-07-18
    • 2012-10-28
    • 1970-01-01
    • 2014-10-31
    • 2013-04-30
    • 2010-11-07
    • 1970-01-01
    • 2014-10-12
    • 2013-05-28
    相关资源
    最近更新 更多