Вот функция, которую я написал для другого проекта. Это позволяет пользователю редактировать строку текста с поддержкой переноса строк и курсора | Вы можете двигаться вперед и назад с помощью клавиш со стрелками. Он полагается на модуль readchar для чтения кодов клавиш, поэтому он должен работать в Windows, но я тестировал его только на терминале Linux и как часть initramfs.
'''
init = initial text supplied to edit
prompt= Decoration presented before the text (not editable and not returned)
'''
def text_editor(init='', prompt=''):
term_width = shutil.get_terminal_size()[0]
ptr = len(init)
string = list(init)
prompt = list(prompt)
c = 0
while True:
if ptr and ptr > len(string):
ptr = len(string)
copy = prompt + string.copy()
if ptr < len(string):
copy.insert(ptr+len(prompt),'|')
#Line wraps support:
if len(copy) > term_width:
cut = len(copy) + 3 - term_width
if ptr > len(copy) / 2:
copy = ['<']*3 + copy[cut:]
else:
copy = copy[:-cut] + ['>']*3
print('\r'*term_width+''.join(copy), end=' '*(term_width-len(copy)))
if c in (53,54):
#Page up/down bug
c = readchar.readkey()
if c == '~':
continue
else:
c = readchar.readkey()
if len(c) > 1:
#Control Character
c = ord(c[-1])
if c == 68: #Left
ptr -= 1
elif c == 67: #Right
ptr += 1
elif c == 53: #PgDn
ptr -= term_width // 2
elif c == 54: #PgUp
ptr += term_width // 2
elif c == 70: #End
ptr = len(string)
elif c == 72: #Home
ptr = 0
else:
print("\nUnknown control character:", c)
print("Press ctrl-c to quit.")
continue
if ptr < 0:
ptr = 0
if ptr > len(string):
ptr = len(string)
else:
num = ord(c)
if num in (13, 10): #Enter
print()
return ''.join(string)
elif num == 127: #Backspace
if string:
string.pop(ptr-1)
ptr -=1
elif num == 3: #Ctrl-C
exit(1)
else:
string.insert(ptr, c)
ptr += 1
print("Result =", text_editor('Edit this text', prompt="Prompt:"))