2013-07-30 28 views
6

Tôi đang cố thêm chức năng tự động hoàn tất vào ứng dụng dòng lệnh của mình. Cho đến nay tất cả các câu trả lời đều nói rằng nó là ưu tiên của vỏ nhưng trong trường hợp của tôi thì nó khác. Chương trình của tôi đi vào một vòng lặp (để có được lệnh) trong main(), vì vậy tôi không nghĩ rằng nó có bất cứ điều gì để làm với vỏ. Làm thế nào tôi có thể đạt được mục tiêu đó?Tự động hoàn thành với C++ (KHÔNG có Shell)

Đây là chương trình của tôi sau đây. Nó bắt đầu phân tích cú pháp khi người dùng truy cập vào (std::getline()). Làm thế nào tôi có thể nhận được đầu vào của người dùng tại thời gian chạy mà không cần sử dụng bất kỳ thư viện bên ngoài nào?

while (input != "exit") { 

    std::cout << "\nCommand >> "; 
    std::getline(std::cin, input); 

    com.parse(input); 
} 
+0

Từ cơ sở dữ liệu nào bạn muốn tự động hoàn thành? –

+2

Bạn cần sử dụng thư viện. Hãy xem xét 'readline' nếu nó có sẵn cho nền tảng của bạn. –

+0

@CodyGray có thể là vectơ của từ khóa. – khajvah

Trả lời

2

Như David Rodríguez đã nói, bằng cách sử dụng GNU readline thực hiện công việc (tôi phải sử dụng thư viện) trong linux.

This là tài liệu chính thức, nó có một số ví dụ C nhưng chúng quá khó hiểu, vì vậy tôi đã sử dụng this để tạo tự động hoàn thành tùy chỉnh của mình.

1

Bạn có thể sử dụng ReadConsoleInput để tìm hiểu xem phím nào đang được người dùng nhấn. Nó có thể được tìm thấy trên MSDN ở đây: http://msdn.microsoft.com/en-us/library/windows/desktop/ms684961%28v=vs.85%29.aspx

Sau đó, bạn có thể sử dụng WriteConsole, mà viết thư cho giao diện điều khiển từ những vị trí con trỏ hiện tại, cố gắng để tự động hoàn thành những gì người dùng đang gõ.

Sau đó, sử dụng SetConsoleCursorPosition quay lại vị trí con trỏ trước khi gọi đến WriteConsole. Điều này sẽ cho phép người dùng tiếp tục nhập nơi anh ta đã dừng lại. Chỉ cần sử dụng WriteConsol để điền vào các khoảng trống để hoàn tác tự động hoàn tất trong trường hợp bạn đã đoán sai.

Tôi không nghĩ rằng getline() sẽ bắt các ký tự từ WriteConsole vì vậy bạn có thể muốn theo dõi cả những gì người dùng đang gõ, mà còn những gì bạn đang thêm bằng cách sử dụng WriteConsole hoặc chỉ theo dõi những gì lệnh suy nghĩ của bạn, ông sẽ viết và sau đó gọi đó là một nếu anh ta nhấn enter sau khi bạn đề xuất một lệnh.

Lời khuyên cuối cùng của tôi là sử dụng SetConsoleAttributes để thay đổi màu của chuỗi được thêm vào thành màu xám nhạt để cho người dùng biết rằng đó là đề xuất chứ không phải thứ gì đó mà anh ấy viết.

+0

Vì OP nói rằng anh ta sử dụng linux, vì vậy msdn sẽ không giúp đỡ – Bogolt

+0

Vâng ... Có lẽ tôi nên đọc những bình luận đầu tiên ..: P – Hjorthenify

+1

Bạn được chào đón! Ill để lại câu trả lời trong trường hợp bất cứ ai khác có cùng một vấn đề cho các cửa sổ. – Hjorthenify

Các vấn đề liên quan