У меня есть скрипт на python, который управляет stdin, stdout и stderr любого приложения и позволяет корректно вставлять readline. Подумайте о любом приложении, которое имеет много консольного вывода, но также принимает команды от стандартного ввода.
В любом случае мой скрипт использует эти две функции:
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()
Редактировать: чтобы попытаться визуализировать то, что я написал:
Терминал выглядит так:
----------------------------------------------
| |
| |
| <scolling command output here> |
| |
| <scolling command output here> |
| |
|: <user inputted text here> |
----------------------------------------------
Таким образом, выводимый текст постоянно прокручивается по мере поступления новых журналов. В то же время, пользователь в настоящее время редактирует и пишет новую команду, которая будет вставлена после нажатия клавиши ввода. Так что это выглядит как консоль python, но с выводом, всегда добавляемым.