2011-07-17 25 views
9

Tôi có câu hỏi về Thư viện Readline.sử dụng readline() để hoàn thành

Tôi muốn biết liệu Readline có thể tự động hoàn thành tên tệp từ các thư mục trong chương trình C không?

Tôi đã tìm kiếm và chỉ thấy hoàn thành tên lệnh.

cảm ơn trước.

EDIT: Tôi đã sao chép tên tệp vào một mảng. Đây là các hàm tôi sử dụng: trong tệp rline.c, char * command_generator, char ** tab_completion (const char * text, int start, int end), void initialize_readline(). Tôi nghĩ rằng tôi phải sử dụng char * filename_completion_function (char * text, int state)? Khi tôi gõ vào "tab" chìa khóa, nó gọi không có gì, ràng buộc() dường như không được sử dụng. Bạn có biết tôi có sử dụng đúng chức năng không? cảm ơn !!

+3

có lẽ đây [link] (http://cc.byexamples.com/2008/06/16/gnu-readline-implement-custom-auto-complete/) –

Trả lời

12

Hoàn thành tên tệp là tính năng tích hợp sẵn của readline, bạn không cần điền danh sách tên tệp v.v. Ở đây với readline 6.1, chương trình sau cho phép hoàn thành tên tệp theo mặc định.

#include <stdio.h> 
#include <stdlib.h> 

#include <readline/readline.h> 
#include <readline/history.h> 

int main() 
{ 
    printf("%s\n", readline("test> ")); 
    return 0; 
} 

Có nhiều cách để tùy chỉnh cơ chế này, ví dụ: bạn có thể chỉ định một số chức năng như rl_filename_quoting_functionrl_filename_dequoting_function để giúp đường dây cung cấp báo giá tên tệp phù hợp cho ứng dụng của bạn.

Tôi nghĩ rằng bạn cần phải chỉ định phiên bản của bạn của readline nếu điều này không làm việc cho bạn. /etc/inputrc nội dung cũng cần được kiểm tra. Bạn có bash, sử dụng readline không? Việc hoàn thành tên tệp có hoạt động như mong đợi không? Dù sao, info readline là tài liệu rất tốt miễn là bạn có thể tự mình sử dụng info :) Nếu không, hãy xem Programming with GNU Readline.

+0

Nó hoạt động hoàn hảo! cảm ơn – lilawood

+1

Có thể muốn nói rằng bạn có thể cần cờ - đường dẫn tùy thuộc vào trình biên dịch bạn sử dụng. –

1

Tôi đã nhầm lẫn về giới hạn mà bạn đang đề cập đến nhưng nó được chỉ ra với tôi rằng bạn có nghĩa là một từ thư viện GNU.

Để biết ví dụ về điều này, vui lòng xem liên kết của Fredrik tới thư viện GNU Readline thực hiện điều đó.

Để áp dụng điều này cho nhu cầu của bạn thay vì string cmd[] mà bạn thấy bạn cần sử dụng một mảng tất cả tên tệp trong thư mục hiện tại và phần còn lại của mã phải giống nhau.

+0

Sẽ không downvote, nhưng ông đang nói về http://www.gnu.org/software/readline/ – cnicutar

+0

@cnicutar Cảm ơn bạn đã chỉ ra rằng, tôi đã chỉnh sửa trong một tham chiếu đến bình luận của Fredrik mà tôi vừa thấy. –

+0

cảm ơn! Để lấp đầy mảng, nếu tôi sử dụng hệ thống ("ls") nó hoạt động? hoặc tôi sử dụng một hàm C khác? – lilawood

5

Để sử dụng thư viện readline, hãy chỉ định -lreadline cho trình biên dịch của bạn. Đoạn mã sau đây có thể được biên dịch với

cc -lreadline some.c -o some 


#include <stdio.h> 

#include <readline/readline.h> 
#include <readline/history.h> 

int main() 
{ 
     char *inpt; 

     int i = 0; 

     while (i < 10) 
     { 
       inpt = readline("Enter text: "); 
       add_history(inpt); 
       printf("%s", inpt); 
       printf("\n"); 
       ++i; 
     } 

     return 0; 

} 
+0

Bạn không cần phải tự do inpt sau khi printf? – netskink

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