退格字符怪异

myk*_*hal 10 terminal text backspace

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

这按预期工作:

$ echo -e "abc\b\b\bxyz"
xyz
Run Code Online (Sandbox Code Playgroud)

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

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

$ echo -e "abc\b\b\bx"
xbc
Run Code Online (Sandbox Code Playgroud)

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

$ echo -e "abc\e[D\e[D\e[Dx"
xbc
Run Code Online (Sandbox Code Playgroud)

擦除线后退工作正常:

$ echo -e "abc\e[1Kx"
x
Run Code Online (Sandbox Code Playgroud)

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

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

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

msa*_*ord 19

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


回答您的评论 - Backspace在VT100/ANSI系列终端中以这种方式定义,许多终端控制代码序列从这些终端借用.请参阅此处的VT100用户手册,其中将BS的功能定义为"将光标移动到左侧一个字符位置,除非它位于左边距,在这种情况下不会发生任何操作".换句话说,这是历史的怪癖:)

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

  • 它以这种方式工作的真正原因是因为即使是较旧的"硬拷贝"终端也像打字机一样在纸上打印.在这样的终端上,一旦输出字符就没有办法擦除它.类似打字机的终端也是我们仍然坚持使用单独的"回车"和"换行"字符到Windows终端线的原因. (8认同)
  • 同样`F ^ HF`是粗体,这个输出是由`man`和`less`处理它产生的,试试`echo -e F ^ HFO ^ HOO ^ HO | less`.现在我理解为什么,在同一个地方两次打印同一个角色很简单. (3认同)
  • 顺便说一句,我不了解常识,但是“退格”是指“向后移动”,而不是“擦除”。我不在乎这两种方式,但Richard Stallman明确表示您的拍摄有多错误以及Delete是真正的擦除方式。他拒绝释放emacs中的^ H键,因为他对“迎合损坏的协议”或某些此类协议不感兴趣。:-) (2认同)