[utils] write_string: Workaround newline issue in conhost

On windows `conhost`, when `WINDOWS_VT_MODE` is enabled, `\n` is not
actually sent if the window is exactly the length of printed line,
and the line does not end with a white-space character. So the
line-break disappears when resizing the window.

Fixes #1863
This commit is contained in:
pukkandan 2022-04-28 19:11:04 +05:30
parent 0a5a191a2a
commit 59f943cd50
No known key found for this signature in database
GPG key ID: 7EEE9E1E817D0A39
2 changed files with 5 additions and 1 deletions

View file

@ -3580,7 +3580,7 @@ def print_debug_header(self):
def get_encoding(stream): def get_encoding(stream):
ret = str(getattr(stream, 'encoding', 'missing (%s)' % type(stream).__name__)) ret = str(getattr(stream, 'encoding', 'missing (%s)' % type(stream).__name__))
if not supports_terminal_sequences(stream): if not supports_terminal_sequences(stream):
from .compat import WINDOWS_VT_MODE from .compat import WINDOWS_VT_MODE # Must be imported locally
ret += ' (No VT)' if WINDOWS_VT_MODE is False else ' (No ANSI)' ret += ' (No VT)' if WINDOWS_VT_MODE is False else ' (No ANSI)'
return ret return ret

View file

@ -1851,6 +1851,10 @@ def write_string(s, out=None, encoding=None):
assert isinstance(s, str) assert isinstance(s, str)
out = out or sys.stderr out = out or sys.stderr
from .compat import WINDOWS_VT_MODE # Must be imported locally
if WINDOWS_VT_MODE:
s = s.replace('\n', ' \n')
if 'b' in getattr(out, 'mode', ''): if 'b' in getattr(out, 'mode', ''):
byt = s.encode(encoding or preferredencoding(), 'ignore') byt = s.encode(encoding or preferredencoding(), 'ignore')
out.write(byt) out.write(byt)