Windows 控制台 "ESC[2J" 并不是真正的 "clear" 屏幕

Windows console "ESC[2J" doesn't really "clear" the screen

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

新的 Windows 控制台支持 ANSI (VT100) 控制代码: ANSI/VT100 control codes & Windows document: the control codes.

但是,ESC[2J 并不是真正的 "clear" 屏幕,它只是向下滚动到 "hide" 打印的内容。只有ESC[H+ESC[J真正"clears"当前显示在屏幕上的内容。这是一个错误还是旨在执行此操作?它是写在某种文档上的吗?

请运行这个.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
#
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 只是 "scrolls down" 到 "make your screen clear",内容仍然存在。

这个有点难解释,不明白的请指正,谢谢!

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

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

控制台 window 有一个 "buffer" 保存可见字符 加上 回滚,cls 完全清除,大概需要更多时间而不是只清除可见字符。