我使用GNU Readline庫中的「選擇」的方式,通過註冊一個回調函數,像這樣:GNU Readline:如何清除輸入行?
rl_callback_handler_install("", on_readline_input);
然後鉤住rl_callback_read_char
作爲回調我select()
環路STDIN_FILENO
。這都是非常標準的東西,並且工作正常。
現在,我的程序異步地將消息輸出到屏幕,有時與來自用戶的輸入交錯。 「乾淨」的會議將是這樣的:
user input
SERVER OUTPUT
SERVER OUTPUT
user input
SERVER OUTPUT
但是,如果用戶中途當服務器響應到達的線路呢?然後它得到醜陋:
user input
SERVER OUTPUT
user inSERVER OUTPUT
put
SERVER OUTPUT
我解決了這個問題通過簡單的打印服務器輸出前一個換行符,如果用戶輸入了什麼(這是很容易通過檢查rl_line_buffer
告訴),然後打印服務器輸出後做rl_forced_update_display()
。現在看起來像這樣:
user input
SERVER OUTPUT
user in
SERVER OUTPUT
user input
SERVER OUTPUT
這樣比較好,但還不完美。問題是當用戶輸入一整行但還沒有按Enter鍵 - 那麼它看起來是這樣的:
user input
SERVER OUTPUT
user input
SERVER OUTPUT
user input
SERVER OUTPUT
這是不好的,因爲它在用戶看來,他們鍵入的三個命令(用於三個響應三個輸入就像三個輸入的響應一樣,這是實際發生的情況)。
一個討厭的黑客(工作)是這樣做:
user input
SERVER OUTPUT
user input - INCOMPLETE
SERVER OUTPUT
user input
SERVER OUTPUT
我想我可以通過打印退格(「\ B」)字符,而不是" - INCOMPLETE"
改善這一點,但似乎沒有不在我的終端上執行任何操作(Ubuntu Hardy上的gnome-terminal)。無論出於何種原因,printf("ABC\b");
只是打印ABC
。
那麼如何擦除不完整的輸入行?要麼通過打印退格空間(我可以計算出打印數量 - 它是strlen(rl_line_buffer)
),還是通過使用一些我不知道的Readline工具?
某些終端/終端仿真器具有退格符不同的行爲。 pmg有正確的想法。 – 2009-10-02 22:20:16
這是在我的終端工作。但是,如果沒有更好的理解它爲什麼起作用以及它如何移動(不可移植),我選擇使用'\ r'(正如另一個答案中所建議的那樣)。 – 2009-10-05 16:35:25
使用'\ r'代碼一段時間後我改變了主意......我更喜歡這樣做,因爲它不需要在末尾使用空格套印(我更喜歡在服務器輸出之前進行套印,所以這個解決方案最適合我,更不用說它是我最初的問題最直接的答案)。 – 2009-10-12 14:59:53