o -> переход в режим ввода после курсора, повторное нажатие выключает этот режим

master
serr 2025-02-05 23:46:41 +03:00
parent c405e36dcf
commit 2604dd5dab
3 changed files with 39 additions and 16 deletions

View File

@ -79,7 +79,10 @@ class EditStrategy(BaseStrategy):
self.model.Backspace()
case _:
if not isAscii(symbolCode): return ReturnCode.GOOD
self.model.InsertSymbol(symbolCode)
if not self.model.inputAfterCursor:
self.model.InsertSymbol(symbolCode)
else:
self.model.InsertSymbolAfterCursor(symbolCode)
self.model.Scroll()
return ReturnCode.GOOD

View File

@ -24,10 +24,14 @@ class VimModel:
self.scrollX = 0 # горизонтальная прокрутка
self.file_path = "" # путь к файлу
self.mode = ""
self.inputAfterCursor = False
self.keyLog = [] # лог нажатий клавиш (кортежи вида (код символа, юникс время нажатия))
self.commandBuffer = [] # буффер для команды
self.exchangeBuffer = [] # буффер обмена
def InputAfterCursor(self) -> None:
self.inputAfterCursor = not self.inputAfterCursor
def UpdateKeyLog(self, symbolCode: int) -> None:
if len(self.keyLog) > 5000: self.keyLog.clear()
self.keyLog.append((symbolCode, tools.UnixSec()))
@ -73,6 +77,10 @@ class VimModel:
if self.currentCol <= len(self.displayBuffer[self.currentLine]): # проверяем, не превышает ли индекс колонки длину строки
self.displayBuffer[self.currentLine].insert(self.currentCol, chr(symbolCode))
self.currentCol += 1
def InsertSymbolAfterCursor(self, symbolCode: int) -> None:
if self.currentCol <= len(self.displayBuffer[self.currentLine]): # проверяем, не превышает ли индекс колонки длину строки
self.displayBuffer[self.currentLine].insert(self.currentCol, chr(symbolCode))
def ToLineStart(self) -> None:
self.currentCol = 0
@ -179,6 +187,9 @@ class VimModel:
self.currentCol = 0
self.displayBuffer[self.currentLine] = []
return ReturnCode.SET_EDIT_MODE
case "o":
self.InputAfterCursor()
return ReturnCode.SET_EDIT_MODE
case "h":
self.LoadFile("config/usage.txt")
return ReturnCode.SET_BASIC_MODE
@ -340,14 +351,17 @@ class VimModel:
print(f"Error writing file: {str(e)}")
def Reset(self) -> None:
self.displayBuffer = []
self.dump = []
self.currentLine = 0
self.currentCol = 0
self.scrollY = 0
self.scrollX = 0
self.file_path = ""
self.mode = ""
self.showLineNumbers = True
self.lastSearch = ()
self.commandBuffer = []
self.exchangeBuffer = []
self.displayBuffer = [] # буфер для хранения всех строк
self.dump = []
self.currentLine = 0 # текущий индекс строки
self.currentCol = 0 # текущий индекс колонки
self.scrollY = 0 # вертикальная прокрутка
self.scrollX = 0 # горизонтальная прокрутка
self.file_path = "" # путь к файлу
self.mode = ""
self.inputAfterCursor = False
self.keyLog = [] # лог нажатий клавиш (кортежи вида (код символа, юникс время нажатия))
self.commandBuffer = [] # буффер для команды
self.exchangeBuffer = [] # буффер обмена

View File

@ -34,8 +34,9 @@ class CursesAdapter:
self.lines = curses.LINES
curses.curs_set(1) # Make cursor visible
curses.start_color()
curses.init_pair(1, curses.COLOR_MAGENTA, curses.COLOR_BLACK) # Фиолетовый текст на черном фоне
self.colorPair = curses.color_pair(1)
curses.init_pair(1, curses.COLOR_BLUE, curses.COLOR_BLACK) # Фиолетовый текст на черном фоне
curses.init_pair(2, curses.COLOR_WHITE, curses.COLOR_BLUE) # Фиолетовый текст на черном фоне
self.colorPairs = [curses.color_pair(1), curses.color_pair(2)]
def Refresh(self) -> None:
"""Apply changes"""
@ -52,6 +53,9 @@ class CursesAdapter:
"""set char position (x, y)"""
self.screen.addch(x, y, code)
def SetColorString(self, x: int, y: int, data: str, attr: int):
self.screen.addstr(x, y, data, attr)
def SetString(self, x: int, y: int, data: str):
"""set string begin position (x, y)"""
self.screen.addstr(x, y, data)
@ -86,7 +90,7 @@ class VimView:
if show_line_numbers:
line_number = f"{i + scrollY + 1:6} " # 6 символов на номер строки
# Выводим номер строки фиолетовым цветом
self.curses_adapter.screen.addstr(i, 0, line_number, self.curses_adapter.colorPair)
self.curses_adapter.SetColorString(i, 0, line_number, self.curses_adapter.colorPairs[0])
# Выводим текст с учетом прокрутки и ширины нумерации
visible_text_start = scrollX # Начало видимой части текста
@ -113,6 +117,8 @@ class VimView:
"""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:])
self.curses_adapter.SetColorString(self.curses_adapter.lines - 1, 0,
modeBarData[scrollX + 1:], self.curses_adapter.colorPairs[1])
else:
self.curses_adapter.SetString(self.curses_adapter.lines - 1, 0, modeBarData)
self.curses_adapter.SetColorString(self.curses_adapter.lines - 1, 0,
modeBarData, self.curses_adapter.colorPairs[1])