printf 和退格键

jok*_*ker 1 less vim editors

我想玩一下find -fprintf。如果您不知道它的作用,它与写入您指定其名称的文件-fprintf相同。-printf

现在,当我运行这样的命令时:

find -maxdepth 1 -type d  -fprintf output "%p\b\n"
Run Code Online (Sandbox Code Playgroud)

我得到以下内容output(使用vim几乎任何文本编辑器):

.^H
./directory-1^H
./directory-2^H
./directory-3^H
Run Code Online (Sandbox Code Playgroud)

我知道这^H是退格字符。开头:outputless

./directory-
./directory-
./directory-
Run Code Online (Sandbox Code Playgroud)

所以,问题是:

  1. 为什么vim和其他文本编辑器(尝试过nanoemacs)会显示退格键而不通过删除其前面的字符来解释它,但less会显示退格键?
  2. 为什么编辑器不打印一个字符而\n不是换行呢?
  3. 打印退格键和在键盘上按退格键(按键盘上的退格键实际上会删除字符)之间有什么区别?

我在我的机器(笔记本电脑)上运行它,而无需在任何地方进行 sshing。使用带有 konsole 和 tmux 的 GNU/Linux Ubuntu 16.04 LTS。

小智 5

为什么 vim 和其他文本编辑器(尝试过 nano 和 emacs)显示退格键而不通过删除其前面的字符来解释它,但 less 却这样做?

他们为什么要这么做?FWIW,浏览器也没有:-)

$ printf "<html>foo\bbar</html>" > /tmp/foo.html
$ firefox /tmp/foo.html
Run Code Online (Sandbox Code Playgroud)

编辑器是否还应该解释其他类型的标记,例如迷你 Markdown*foo***bar**

请注意,退格键不仅仅是“删除”中的前一个字符less,而且还用作粗略的格式化字符。x\bx将以x粗体打印,并在x\b_其下划线(在某些终端上会导致它以不同的颜色打印):

printf "H\b_e\b_r\b_e\b_'s\bs Johnny!" | less
Run Code Online (Sandbox Code Playgroud)

为什么编辑器不打印 \n 字符而不是向下换行?

他们可以做到这一点。例如,如果您使用:set listin vi,则换行符将打印为$,制表符将打印为^I

打印退格键和在键盘上按退格键(按键盘上的退格键实际上会删除字符)之间有什么区别?

在硬类型终端(在纸上打印)上,打印退格会导致笔架向左移动一个位置,因此后续的字符将覆盖而不是删除纸上已有的内容。在玻璃 (CRT) 和模拟终端上,向左移动位置并写入字符会产生“擦除”效果,因为覆盖字符会完全替换它。但\b本身并没有删除任何内容:printf "123\b\n"will print 123not 12

后者是 tty 驱动程序的一个功能,它将一些输入字符解释为编辑/控制命令(eraseweraseintrkill-- 查看stty(1)termios(3)手册页以获取完整列表)。

并且退格键并不总是生成\b/ ^H(BS) 字符。大多数时候是\x7f/ ^?(DEL)。

但你可以将其设置为你喜欢的任何值:

$ stty erase '#'
Run Code Online (Sandbox Code Playgroud)

现在点击#将删除之前的字符,就像在 unix v7 中一样。