set num -> включить нумерацию строк

master
serr 2025-02-05 22:21:14 +03:00
parent 492288f3db
commit 7cd502a806
3 changed files with 39 additions and 16 deletions

View File

@ -22,7 +22,8 @@ def main():
view.Render(model.displayBuffer,
model.currentLine, model.currentCol,
model.scrollX, model.scrollY,
model.ModeBar())
model.ModeBar(),
model.showLineNumbers)
symbolCode = view.curses_adapter.GetChar()

View File

@ -14,6 +14,7 @@ class VimModel:
def __init__(self, displayLinesCount: int, displayColsCount: int):
self.displayLinesCount = displayLinesCount
self.displayColsCount = displayColsCount
self.showLineNumbers = False
self.displayBuffer = [] # буфер для хранения всех строк
self.dump = []
self.currentLine = 0 # текущий индекс строки
@ -47,15 +48,22 @@ class VimModel:
return modeBar
def Scroll(self) -> None:
# Учитываем ширину нумерации строк (6 символов + 1 пробел)
line_number_width = 7 if self.showLineNumbers else 0
# Вертикальная прокрутка
if self.currentLine < self.scrollY:
self.scrollY = self.currentLine
elif self.currentLine >= self.scrollY + self.displayLinesCount - 1:
self.scrollY = self.currentLine - self.displayLinesCount + 2
# Горизонтальная прокрутка с учетом нумерации строк
# Видимая область для текста уменьшается на ширину нумерации строк
visible_text_width = self.displayColsCount - line_number_width
if self.currentCol < self.scrollX:
self.scrollX = self.currentCol
elif self.currentCol >= self.scrollX + self.displayColsCount:
self.scrollX = self.currentCol - self.displayColsCount + 1
elif self.currentCol >= self.scrollX + visible_text_width:
self.scrollX = self.currentCol - visible_text_width + 1
def InsertCommandSymbol(self, symbolCode: int) -> None:
self.commandBuffer.append(chr(symbolCode))
@ -174,6 +182,8 @@ class VimModel:
return ReturnCode.SET_BASIC_MODE
case "e!":
self.displayBuffer = [sublist.copy() for sublist in self.dump]
case "set num":
self.showLineNumbers = not self.showLineNumbers
case _:
# Открывает файл filename
if len(cmd) > 2 and cmd[:2] == 'o ':

View File

@ -32,6 +32,8 @@ class CursesAdapter:
self.cols = curses.COLS
self.lines = curses.LINES
curses.curs_set(1) # Make cursor visible
curses.start_color()
curses.init_pair(1, curses.COLOR_MAGENTA, curses.COLOR_BLACK) # Фиолетовый текст на черном фоне
def Refresh(self) -> None:
"""Apply changes"""
@ -61,33 +63,43 @@ class VimView:
def __init__(self, adapter: CursesAdapter) -> None:
self.curses_adapter = adapter
def Render(self,
displayBuffer: list[list[str]],
currentLine: int, currentCol: int,
scrollX: int, scrollY: int,
modeBarData: str):
modeBarData: str,
show_line_numbers: bool = False):
"""Отрисовка текущего состояния"""
self.curses_adapter.screen.clear()
# Ширина нумерации строк (6 символов + 1 пробел)
line_number_width = 7 if show_line_numbers else 0
# Отображение видимой части текста
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, '')
# Если нужно отображать номера строк, добавляем их перед текстом
if show_line_numbers:
line_number = f"{i + scrollY + 1:6} " # 6 символов на номер строки
# Выводим номер строки фиолетовым цветом
self.curses_adapter.screen.addstr(i, 0, line_number, curses.color_pair(1))
# Выводим текст с учетом прокрутки и ширины нумерации
visible_text_start = scrollX # Начало видимой части текста
visible_text_end = scrollX + self.curses_adapter.cols - line_number_width # Конец видимой части текста
visible_text = line[visible_text_start:visible_text_end]
self.curses_adapter.SetString(i, line_number_width, visible_text)
else:
self.curses_adapter.SetString(i, 0, '')
# Обновление панели режима
self.SetModeBar(modeBarData)
# Установка курсора с учетом прокрутки
# Установка курсора с учетом прокрутки и нумерации строк
cursor_x = currentLine - scrollY
cursor_y = currentCol - scrollX
cursor_y = currentCol - scrollX + line_number_width
# Проверка, чтобы курсор не вышел за пределы экрана
if 0 <= cursor_x < self.curses_adapter.lines - 1 and 0 <= cursor_y < self.curses_adapter.cols:
@ -98,7 +110,7 @@ class VimView:
def SetModeBar(self, modeBarData: str):
"""Print edit mode information panel"""
if len(modeBarData) > self.curses_adapter.cols - 1:
scrollX = len(modeBarData)-self.curses_adapter.cols
self.curses_adapter.SetString(self.curses_adapter.lines - 1, 0, modeBarData[scrollX+1:])
scrollX = len(modeBarData) - self.curses_adapter.cols
self.curses_adapter.SetString(self.curses_adapter.lines - 1, 0, modeBarData[scrollX + 1:])
else:
self.curses_adapter.SetString(self.curses_adapter.lines - 1, 0, modeBarData)