пофиксил баг с UP/DOWN с большой строки на ту которая меньше

master
serr 2025-02-04 20:15:11 +03:00
parent 94bbccde99
commit 7326aa1834
1 changed files with 18 additions and 20 deletions

View File

@ -46,19 +46,19 @@ class VimModel:
self.displayBuffer[self.currentLine].insert(self.currentCol, chr(symbolCode)) self.displayBuffer[self.currentLine].insert(self.currentCol, chr(symbolCode))
self.currentCol += 1 self.currentCol += 1
def MoveToLineStart(self) -> None: def MoveToPositionWithScroll(self, position: int) -> None:
"""Переместить курсор в начало строки и сбросить прокрутку""" """
self.currentCol = 0 Перемещает курсор в указанную позицию в текущей строке
self.scrollX = 0 # Сброс горизонтальной прокрутки и корректирует прокрутку, если это необходимо.
"""
def MoveToLineEnd(self) -> None:
"""Переместить курсор в конец строки с учетом прокрутки"""
line_length = len(self.displayBuffer[self.currentLine]) line_length = len(self.displayBuffer[self.currentLine])
self.currentCol = line_length self.currentCol = max(0, min(position, line_length))
# Если строка длиннее экрана, корректируем прокрутку # Корректируем прокрутку, если курсор выходит за пределы видимой области
if line_length > self.displayCols: if self.currentCol < self.scrollX:
self.scrollX = max(0, line_length - self.displayCols + 1) self.scrollX = self.currentCol # Прокрутка влево
elif self.currentCol >= self.scrollX + self.displayCols:
self.scrollX = self.currentCol - self.displayCols + 1 # Прокрутка вправо
def EnterCommand(self): def EnterCommand(self):
"""Обработка введенной команды""" """Обработка введенной команды"""
@ -66,38 +66,36 @@ class VimModel:
self.commandBuffer.clear() self.commandBuffer.clear()
match cmd: match cmd:
case "$": case "$":
self.MoveToLineEnd() # Перемещение в конец строки self.MoveToPositionWithScroll(len(self.displayBuffer[self.currentLine])) # Перемещение в конец строки
return ReturnCode.GOOD return ReturnCode.GOOD
case "^" | "0": case "^" | "0":
self.MoveToLineStart() # Перемещение в начало строки self.MoveToPositionWithScroll(0) # Перемещение в начало строки
return ReturnCode.GOOD return ReturnCode.GOOD
case "q": case "q":
return ReturnCode.EXIT_CODE return ReturnCode.EXIT_CODE
case "i": case "i":
return ReturnCode.SET_EDIT_MODE return ReturnCode.SET_EDIT_MODE
case "S": case "S":
self.MoveToLineStart() self.MoveToPositionWithScroll(0)
self.displayBuffer[self.currentLine] = [] self.displayBuffer[self.currentLine] = []
return ReturnCode.SET_EDIT_MODE return ReturnCode.SET_EDIT_MODE
case "RIGHT": case "RIGHT":
if self.currentCol < len(self.displayBuffer[self.currentLine]): self.MoveToPositionWithScroll(self.currentCol + 1)
self.currentCol += 1
return ReturnCode.GOOD return ReturnCode.GOOD
case "LEFT": case "LEFT":
if self.currentCol > 0: self.MoveToPositionWithScroll(self.currentCol - 1)
self.currentCol -= 1
return ReturnCode.GOOD return ReturnCode.GOOD
case "UP": case "UP":
if self.currentLine > 0: if self.currentLine > 0:
self.currentLine -= 1 self.currentLine -= 1
if self.currentCol > len(self.displayBuffer[self.currentLine]): if self.currentCol > len(self.displayBuffer[self.currentLine]):
self.currentCol = len(self.displayBuffer[self.currentLine]) self.MoveToPositionWithScroll(len(self.displayBuffer[self.currentLine]))
return ReturnCode.GOOD return ReturnCode.GOOD
case "DOWN": case "DOWN":
if self.currentLine < len(self.displayBuffer) - 1: if self.currentLine < len(self.displayBuffer) - 1:
self.currentLine += 1 self.currentLine += 1
if self.currentCol > len(self.displayBuffer[self.currentLine]): if self.currentCol > len(self.displayBuffer[self.currentLine]):
self.currentCol = len(self.displayBuffer[self.currentLine]) self.MoveToPositionWithScroll(len(self.displayBuffer[self.currentLine]))
return ReturnCode.GOOD return ReturnCode.GOOD
def Enter(self) -> None: def Enter(self) -> None: