Добавить prompt к редактированию ввода
Есть код с попыткой реализации приглашения ввода с помощью сдвига, но поведение не соответствует ожиданиям, в добавок оно ломает поведение редактирования. Подскажите, как проще всего реализовать prompt для такого кода редактирования ввода (функцию подсветки убрал для простоты):
import sys, os, tty
def command_line():
tty.setraw(sys.stdin)
while True: # loop for each line
prompt = "> "
offset = len(prompt)
input = ""
index = offset
while True: # loop for each character
char = ord(sys.stdin.read(1)) # read one char and get char code
if char == 3: # CTRL-C
return
elif 32 <= char <= 126:
input = input[:index] + chr(char) + input[index:]
index += 1
elif char in {10, 13}:
sys.stdout.write("\u001b["+str(len(input)+1)+"D")
__execute(input)
input = ""
index = offset
elif char == 27:
next1, next2 = ord(sys.stdin.read(1)), ord(sys.stdin.read(1))
if next1 == 91:
if next2 == 68: # Left
index = max(offset, index - 1)
elif next2 == 67: # Right
index = min(len(input)+offset, index + 1)
elif next2 == 72: # Home
index = offset
elif next2 == 70: # End
index = len(input)+offset
elif next2 == 51: # Del
next4 = ord(sys.stdin.read(1))
if next4 == 126:
input = input[:index] + input[index+1:]
elif char == 127: # Backspace
input = input[:index-1] + input[index:]
if index > offset: index -= 1
sys.stdout.write("\u001b["+str(len(input)+1)+"D") # Move all the way left
sys.stdout.write("\u001b[0K") # Clear the line
sys.stdout.write(prompt)
sys.stdout.write("\u001b["+str(offset+1)+"B")
sys.stdout.write(input)
sys.stdout.write("\u001b["+str(len(input)+1)+"D") # Move all the way left again
if index > offset:
sys.stdout.write("\u001b[" + str(index) + "C") # Move cursor too index
sys.stdout.flush()
def __execute(cmd):
print("\nexecuting: ", cmd)
def main(argv):
command_line()
if __name__ == '__main__':
main(sys.argv)