提问者:小点点

Windows控制台“ESC[2J”并没有真正“清除”屏幕


我知道这类问题经常被问到,但我认为这一个有点不同,需要问。

新的Windows控制台支持ANSI(VT100)控制代码:ANSI/VT100控制代码

然而,ESC[2J并没有真正“清除”屏幕,它只是向下滚动以“隐藏”打印内容。只有ESC[HESC[J才真正“清除”屏幕上当前显示的内容。这是一个bug还是设计用来这样做的?它是写在某种文档上的吗?

请运行这个. bat来理解我的意思:

@echo off
echo hello0
echo hello1
echo hello2
echo hello3
echo hello4
echo hello5
echo hello6
echo hello7
echo hello8
echo hello9
pause
echo [2J
pause
echo [H[J
pause

或者运行此。py(Python 2):

import sys
from ctypes import windll
windll.kernel32.SetConsoleMode(windll.kernel32.GetStdHandle(-11), 7)
#set ansi(vt100) control code interpreted
#https://stackoverflow.com/questions/36760127/how-to-use-the-new-support-for-ansi-escape-sequences-in-the-windows-10-console
show = lambda s: sys.stdout.write(s)
for i in range(10):
    print("\x1b[30;47m hello \x1b[0m%d"%i)
raw_input()
show("\x1b[2J")
raw_input()
show("\x1b[H\x1b[J")
raw_input()

正如您在运行这个简单脚本时所看到的,ESC[2J只需“向下滚动”以“使屏幕清晰”,内容仍然存在。

这个有点不好解释,不懂我意思的请评论,谢谢!

另一个小问题:为什么cls命令比ESC[2JESC[HESC[J慢?


共1个答案

匿名用户

在支持控制序列的旧版本Windows中,ESC[2J的问题是“已知的”。也就是说,它应该存在,但没有清除整个屏幕。您可能会找到一些最近的评论。实际上没有人测试最近恢复的Windows控制序列,以指出与其他终端的兼容性。

控制台窗口有一个“缓冲区”,其中包含可见字符和回滚,这将cls完全清除,可能比只清除可见字符花费更多的时间。