I have a python script that controls the stdin, stdout and stderr of any application and allows you to correctly insert readline. Think of any application that has many console outputs, but also accepts commands from stdin.
Anyway, my script uses these two functions:
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()
When processing stdout, I call print_line (). This runs through everything the user can print, prints a line, and then restores the user input text. All this happens without the user noticing something.
The problem occurs when the cursor is not at the end of any input that the user enters. When the cursor is in the middle of the test and a line is printed, the cursor will automatically be placed at the end of the input. To solve this problem, I want to do something like this in print_line:
def print_line(line): global cmd_state cursorPos = getCurrentCursorPos()
Edit: try and visualize what I wrote:
The terminal is as follows:
---------------------------------------------- | | | | | <scolling command output here> | | | | <scolling command output here> | | | |: <user inputted text here> | ----------------------------------------------
Thus, the output text constantly scrolls as new magazines arrive. At the same time, the user is currently editing and writing a new command, which will be inserted after clicking. This way it looks like a python console, but output is always added.
python bash readline
Jim cortez
source share