tty.py 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. import os
  2. from types import SimpleNamespace
  3. def new(original, max_cols):
  4. write = original.write
  5. flush = original.flush
  6. try:
  7. _fd = original.fileno()
  8. except OSError:
  9. _fd = 1
  10. def cols():
  11. try:
  12. return os.get_terminal_size(_fd)[0]
  13. except (ValueError, OSError):
  14. # original is closed, detached, or not a terminal, or
  15. # os.get_terminal_size() is unsupported
  16. return max_cols
  17. def _ansi_escape_sequence(code, param=''):
  18. def inner(_available=None): # because of jupyter.
  19. write(inner.sequence)
  20. inner.sequence = f'\x1b[{param}{code}'
  21. return inner
  22. def factory_cursor_up(num):
  23. return _ansi_escape_sequence('A', num) # sends cursor up: CSI {x}A.
  24. clear_line = _ansi_escape_sequence('2K\r') # clears the entire line: CSI n K -> with n=2.
  25. clear_end_line = _ansi_escape_sequence('K') # clears line from cursor: CSI K.
  26. clear_end_screen = _ansi_escape_sequence('J') # clears screen from cursor: CSI J.
  27. hide_cursor = _ansi_escape_sequence('?25l') # hides the cursor: CSI ? 25 l.
  28. show_cursor = _ansi_escape_sequence('?25h') # shows the cursor: CSI ? 25 h.
  29. carriage_return = '\r'
  30. return SimpleNamespace(**locals())