2009-03-17 9 views
9

Tôi đang viết một chương trình tương tự như trình bao. Sau khi bắt đầu, có lời nhắc và bạn nhập vào một số lệnh dành riêng cho ứng dụng.Khởi tạo NCurses mà không xóa màn hình

Cho đến nay công trình này rất tốt. Tuy nhiên, tôi muốn thêm hỗ trợ cho lịch sử lệnh như trong Bash, vì vậy người dùng có thể nhấn mũi tên lên hoặc xuống và xem các lệnh đã nhập trước đó.

Tôi đã bao gồm thư viện ncurses và tôi đã thực hiện bài kiểm tra hello world đơn giản với getch() để đảm bảo các mũi tên lên và xuống được báo cáo chính xác.

Điều làm tôi bận tâm là có vẻ như đó là một yêu cầu mà tôi gọi initscr() sẽ xóa màn hình để tôi sử dụng getch().

OKAY Vậy câu hỏi là:

Không ai biết một cách để sử dụng) chức năng (ncurses getch mà không gọi initscr() đầu tiên? Nếu không, tôi có thể làm cho nó không rõ ràng màn hình? Về cơ bản, tôi đang tìm cách để có getch() hành động giống như getchar(), nếu điều đó có ý nghĩa.

Cảm ơn trước!

EDIT: Tôi nghĩ rằng ví dụ tốt nhất về điều này là cách Python chạy ở chế độ tương tác.

Trả lời

8

Những lời nguyền muốn kiểm soát hoàn toàn màn hình và tối ưu hóa việc ghi lên màn hình, đặc biệt là trên các dòng nối tiếp chậm. Để làm điều này, nó cần phải biết những gì trên màn hình, và cách hợp lý duy nhất để làm điều đó với hầu hết các thiết bị đầu cuối là bắt đầu từ một màn hình trống và theo dõi những gì bạn ghi vào thiết bị đầu cuối.

Vì vậy, tôi nghi ngờ (n) lời nguyền là công cụ sai cho trình bao của bạn. Bạn có thể cần phải đi xuống một bước trên lớp trừu tượng và sử dụng terminfo và không chặn lần đọc từ thiết bị đầu cuối (đầu vào tiêu chuẩn) để thay thế.

(Đây không phải là rất hữu ích. Xin lỗi.)

5

Bạn chỉ có thể gọi chương trình của bạn từ whithin rlwrap và có các chức năng mà không có sự đau đớn ...

3

Dưới đây là một discussion về việc này. Các giải pháp được cung cấp là:

  1. "Chức năng 'filter() cho phép bạn sử dụng lời nguyền như một dòng đơn."
  2. "Bạn có thể viết một cái gì đó tương đương trong C, sử dụng setupterm để lấy dữ liệu thiết bị đầu cuối và tparm, tputs để định dạng và xuất."

Tất nhiên, có tùy chọn thứ ba để lấy mã nguồn ncurses và sửa đổi nó để nó không xóa màn hình nữa.

+0

Liên kết đó cung cấp 404 Không tìm thấy. :-( –

+0

Đã chỉnh sửa.Đáng buồn thay, Wayback Machine chỉ có một phiên bản đã có 404. Tuy nhiên, cảm ơn bạn đã báo cáo liên kết chết. – schnaader

+0

Chỉ cần Googling cho dòng chủ đề của cuộc thảo luận đã tìm thấy cuộc thảo luận được lưu trữ tại URL ổn định hơn, được chỉnh sửa để giới thiệu lại liên kết. –

0

Bạn đã xem xét việc tạo một mục nhập terminfo hoặc termcap tùy chỉnh thiếu một chuỗi để xóa màn hình và sau đó chuyển thiết lập đầu cuối sang phải trước khi chạy chương trình của bạn? Bạn cũng có thể sử dụng newterm() và set_term() trong ncurses. Điều này được sử dụng để dễ dàng hơn với termcap, vì bạn có thể bao gồm một thiết bị đầu cuối khác và ghi đè lên một số khả năng của nó.

+0

Đây là một hack thực sự xấu xí và sẽ không dẫn đến một ứng dụng có thể sử dụng trên hệ thống của người dùng cuối. –

+0

Điều đó thật vô nghĩa. Bạn có thể thiết lập TERMINFO trong môi trường của quá trình, và cài đặt một cơ sở dữ liệu TERMINFO tùy chỉnh theo một đường dẫn thay thế với số lượng nhỏ các mục nhập tại thời điểm cài đặt. Sau đó, bạn đặt biến TERM thành mục nhập thích hợp . Thậm chí về mặt lý thuyết có thể thực hiện điều này tự động tại thời gian chạy bằng cách sử dụng các tiện ích terminfo để biên dịch một mục nhập thay thế terminfo , được lưu trữ ở một vị trí không chuẩn được chỉ định bởi TERMINFO. Nếu bạn làm điều đó khi chạy, bạn thậm chí có thể căn cứ vào mục nhập bị nghi ngờ trên thiết bị đầu cuối hiện tại. Nó không đẹp, nhưng nó không phải là xấu như bạn yêu cầu bồi thường. –

8

Có thể đơn giản hơn khi sử dụng giao diện như readline() thay vì sử dụng các mũi nhọn đầy đủ.

+0

ncurses và readline có giấy phép khác nhau. Hãy chắc chắn để kiểm tra đầu tiên! – sdgfsdh