Как я могу получить (и установить) текущую позицию курсора bash при использовании строки чтения python?

У меня есть сценарий python, который управляет stdin, stdout и stderr любого приложения и позволяет аккуратно вставлять строку чтения. Подумайте о любом приложении, которое имеет много вывода на консоль, но также принимает команды от stdin.

В любом случае мой сценарий использует эти две функции:

def blank_current_readline():
    # Next line said to be reasonably portable for various Unixes
    (rows,cols) = struct.unpack('hh', fcntl.ioctl(sys.stdout, termios.TIOCGWINSZ,'1234'))

    text_len = len(readline.get_line_buffer())+2

    # ANSI escape sequences (All VT100 except ESC[0G)
    sys.stdout.write('\x1b[2K')                         # Clear current line
    sys.stdout.write('\x1b[1A\x1b[2K'*(text_len/cols))  # Move cursor up and clear line
    sys.stdout.write('\x1b[0G')                         # Move to start of line

def print_line(line):
    global cmd_state
    blank_current_readline()
    print line,
    sys.stdout.write(cmd_state["prompt"] + readline.get_line_buffer())
    sys.stdout.flush()

При обработке stdout я вызываю print_line (). Это очищает все, что пользователь мог бы печатать, печатает строку, а затем восстанавливает введенный пользователем текст. Все это происходит незаметно для пользователя.

Проблема возникает, когда курсор не находится в конце ввода, вводимого пользователем. Когда курсор находится в середине теста и печатается строка, курсор автоматически помещается в конец ввода. Чтобы решить эту проблему, я хочу сделать что-то вроде этого в print_line:

def print_line(line):
    global cmd_state
    cursorPos = getCurrentCursorPos() #Doesn't exist
    blank_current_readline()
    print line,
    sys.stdout.write(cmd_state["prompt"] + readline.get_line_buffer())
    sys.stdout.setCurrentCursorPos(cursorPos) #Doesn't exist
    sys.stdout.flush()

Edit: Чтобы попытаться визуализировать то, что я написал:

Терминал выглядит так:

----------------------------------------------
|                                            |
|                                            |
|   <scolling command output here>           |
|                                            |
|   <scolling command output here>           |
|                                            |
|: <user inputted text here>                 |
----------------------------------------------

Таким образом, выходной текст постоянно прокручивается по мере появления новых журналов проходят. В то же время пользователь в настоящее время редактирует и пишет новую команду, которая будет вставлена ​​после нажатия клавиши Enter. Так что это похоже на консоль python, но с всегда добавляемым выводом.

8
задан Jim Cortez 26 October 2011 в 22:06
поделиться