tôi sử dụng GNU Readline trong "chọn" thời trang, bằng cách đăng ký một hàm callback như vậy:GNU Readline: làm thế nào để xóa dòng đầu vào?
rl_callback_handler_install("", on_readline_input);
Và sau đó hooking lên rl_callback_read_char
như gọi lại cho select()
vòng lặp của tôi cho STDIN_FILENO
. Đó là tất cả những thứ khá chuẩn, và hoạt động tốt.
Hiện tại, chương trình của tôi không đồng bộ in các tin nhắn lên màn hình, đôi khi xen kẽ với đầu vào từ người dùng. Phiên "sạch" sẽ trông như sau:
user input
SERVER OUTPUT
SERVER OUTPUT
user input
SERVER OUTPUT
Nhưng nếu người dùng đang ở giữa đường khi máy chủ phản hồi thì sao? Sau đó nó được xấu xí:
user input
SERVER OUTPUT
user inSERVER OUTPUT
put
SERVER OUTPUT
tôi cố định này chỉ đơn giản bằng cách in một dòng mới trước khi sản lượng máy chủ nếu người dùng đã gõ bất cứ điều gì (điều này rất dễ dàng để nói bằng cách kiểm tra rl_line_buffer
), và sau đó làm rl_forced_update_display()
sau khi in ra máy chủ . Bây giờ nó trông như thế này:
user input
SERVER OUTPUT
user in
SERVER OUTPUT
user input
SERVER OUTPUT
Điều này tốt hơn, nhưng vẫn chưa hoàn hảo. vấn đề này được đưa ra khi người dùng gõ toàn bộ một dòng nhưng vẫn chưa nhấn Enter - sau đó nó trông như thế này:
user input
SERVER OUTPUT
user input
SERVER OUTPUT
user input
SERVER OUTPUT
này là xấu bởi vì nó dường như người dùng rằng họ đã gõ ba lệnh (ba câu trả lời cho ba đầu vào chỉ có thể là ba đáp ứng cho hai đầu vào, đó là những gì thực sự đã xảy ra).
Một hack khó chịu (có công trình) là để làm điều này:
user input
SERVER OUTPUT
user input - INCOMPLETE
SERVER OUTPUT
user input
SERVER OUTPUT
I figured tôi có thể cải thiện điều này bằng cách in BackSpace ký tự thay vì " - INCOMPLETE"
('\ b'), nhưng điều đó dường như không làm bất cứ điều gì ở tất cả trên thiết bị đầu cuối của tôi (gnome-terminal trên Ubuntu Hardy). printf("ABC\b");
chỉ in ABC
, vì bất kỳ lý do gì.
Vậy làm cách nào tôi có thể xóa dòng nhập không đầy đủ? Hoặc bằng cách in backspaces bằng cách nào đó (tôi có thể tìm ra bao nhiêu để in - đó là strlen(rl_line_buffer)
), hoặc bằng cách sử dụng một số cơ sở Readline tôi chưa biết về?
Một số thiết bị đầu cuối/giả lập thiết bị đầu cuối có hành vi khác nhau cho các nhân vật backspace. pmg có ý tưởng đúng. –
Tính năng này hoạt động trong thiết bị đầu cuối của tôi. Nhưng nếu không có một sự hiểu biết tốt hơn về lý do tại sao nó hoạt động và làm thế nào (un) di động nó được, tôi đã chọn để sử dụng '\ r' thay thế (như đề xuất trong một câu trả lời). –
Thay đổi ý định của tôi sau khi sử dụng mã '\ r' trong một thời gian ... Tôi làm như thế này tốt hơn, bởi vì nó không yêu cầu in đè lên không gian ở cuối (tôi thích làm quá mức trước khi đầu ra máy chủ, vì vậy giải pháp phù hợp với tôi nhất, chưa kể rằng đó là câu trả lời trực tiếp nhất cho câu hỏi ban đầu của tôi). –