import curses class VimView: def __init__(self) -> None: self.curses_adapter = CursesAdapter() def Render(self, displayBuffer: list[list[str]], currentLine: int, currentCol: int, scrollX: int, scrollY: int, file_path: str): """Отрисовка текущего состояния""" self.curses_adapter.screen.clear() # display visible part of text for i in range(self.curses_adapter.lines - 1): if i + scrollY < len(displayBuffer): line = ''.join(displayBuffer[i + scrollY]) if scrollX < len(line): self.curses_adapter.SetString(i, 0, line[scrollX:scrollX + self.curses_adapter.cols]) else: self.curses_adapter.SetString(i, 0, '') else: self.curses_adapter.SetString(i, 0, '') # update mode bar self.EditModeBar(currentLine, len(displayBuffer), file_path) # update cursor self.curses_adapter.SetCursor(currentLine - scrollY, currentCol - scrollX) self.curses_adapter.Refresh() def EditModeBar(self, currentLine, totalLines, fileName): """Print edit mode information panel""" self.curses_adapter.screen.addstr(self.curses_adapter.lines - 1, 0, ' ' * (self.curses_adapter.cols - 1)) # Очистка строки self.curses_adapter.screen.addstr(self.curses_adapter.lines - 1, 0, "FILE: ") self.curses_adapter.screen.addstr(fileName, curses.color_pair(1)) # Имя файла self.curses_adapter.screen.addstr(" | MODE:") self.curses_adapter.screen.addstr(" EDIT", curses.color_pair(1)) self.curses_adapter.screen.addstr(" | LINE: ") self.curses_adapter.screen.addstr(str(currentLine + 1), curses.color_pair(1)) self.curses_adapter.screen.addstr("/") self.curses_adapter.screen.addstr(str(totalLines), curses.color_pair(1)) # Общее количество строк class CursesAdapter: def __init__(self) -> None: self.KEY_LEFT = curses.KEY_LEFT self.KEY_RIGHT = curses.KEY_RIGHT self.KEY_UP = curses.KEY_UP self.KEY_DOWN = curses.KEY_DOWN self.KEY_BACKSPACE_1 = 127 self.KEY_BACKSPACE_2 = 8 self.KEY_ENTER = 10 self.KEY_CTRL_S = 19 self.KEY_ESCAPE = 27 self.screen = curses.initscr() self.screen.keypad(True) self.cols = curses.COLS self.lines = curses.LINES # init color system curses.start_color() # green color pair curses.init_pair(1, curses.COLOR_MAGENTA, curses.COLOR_BLACK) curses.curs_set(1) # Make cursor visible def Refresh(self) -> None: """Apply changes""" self.screen.refresh() def Cleanup(self) -> None: curses.endwin() def SetCursor(self, x: int, y: int): """set cursor position (x, y)""" self.screen.move(x, y) def SetChar(self, x: int, y: int, code: int): """set char position (x, y)""" self.screen.addch(x, y, code) def SetString(self, x: int, y: int, data: str): """set string begin position (x, y)""" self.screen.addstr(x, y, data) def GetChar(self) -> int: """Wait users input""" return self.screen.getch()