假设你的终端窗口宽 80 列,并且你运行的 Python 脚本仅包含以下内容:
print("x" * 81 + "\b\by")
您可能希望输出是一行,x
除了最后一行,而最后一行应该是y
。我的问题是,我得到的输出是一行x
,而第二行只包含一个y
。事实是,每当要将退格符打印到 stdout 时,它都会按预期工作,除非有换行,它应该将光标放在上一行:在这种情况下,它似乎被排除在 stdout 缓冲区之外。
我可以沿着上面代码片段的思路用多种方式重现这种行为,例如echo -e "xx...x\b\by"
尝试使用 bash 和 sh、printf(...);
C/C++ 和C++。当文件包含退格字符时以及在输入需要多个终端窗口行的标准输入读取时也会cout << ...;
出现同样的问题。在后一种情况下,我多次按退格键替换字符:当我超出窗口宽度并换行时,我无法通过反复按退格键到达前几行,但这些命中会按预期由调用程序处理,例如在调用中,将包含 79和 1 ,按照上面的例子。这里有趣的是,如果我调整窗口大小,使新的光标位置不再位于窗口的第一列,那么我就可以退格回到新的第一列的位置并继续这样做,直到只剩下一个终端行;然后发现有一个位置我无法再退格了——但我不知道如何预测那个位置。cat
'\b'
scanf("%s", s);
s
x
y
最后,换行和退格键相遇的另一种情况是输入长命令并希望退格回到第一行。我这样做没有遇到任何问题。
我使用的是 Ubuntu 18.04,并使用各种终端仿真器(即 gnome-terminal、xvt 和 tilda)尝试了上述所有操作。如能提供任何提示,我将不胜感激。谢谢!
答案1
tmux
,,screen
按照urxvt
您希望的方式行事。xterm
可以通过启用反向环绕模式:printf '\e[?45h'
。
这是遗留问题,确实在设计上存在问题,但没有人真正关心修复它。问题比你指出的要多。参见VTE 第 62 期了解更多详情。
当输入长命令并愿意退格回到第一行时。我这样做没有遇到任何问题。
在这种情况下,您正在使用 shell 的行编辑(例如 readline 库),它可以执行比仅仅发出退格键更复杂的屏幕处理。
答案2
Windows 7 Python 3.7.4
print("x" * 81 + "y")
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxy
那是你要的吗?