Консоль Windows "ESC[2J" на самом деле не "очищает" экран

Я знаю, что такие вопросы часто задают, но я думаю, что этот вопрос немного отличается и его нужно задавать.

Новая консоль Windows поддерживает управляющие коды ANSI (VT100): управляющие коды ANSI/VT100 и документ Windows: управляющие коды.

Тем не мение, ESC[2J на самом деле не "очищает" экран, он просто прокручивает вниз, чтобы "скрыть" напечатанное содержимое. Только ESC[H+ESC[J действительно "очищает" отображаемое в данный момент содержимое на экране. Это ошибка или она предназначена для этого? Это написано на какой-то документации?

Пожалуйста, запустите это .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://stackru.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[2J или же ESC[H+ESC[J?

2 ответа

Решение

Вопрос сESC[2J был "известен" в более старых версиях Windows, которые поддерживали последовательности управления. То есть должен, но не очистил весь экран. Вы можете найти некоторые недавние комментарии. Никто на самом деле не тестировал недавно восстановленные последовательности управления Windows, чтобы указать совместимость с другими терминалами.

В консольном окне есть "буфер", содержащий видимые символы плюс прокрутку, которая cls полностью очищается, предположительно, занимает больше времени, чем очистка только видимых символов.

Довольно старая тема, ноprintf("\x1bc");использовать для работы на меня.

Другие вопросы по тегам