I've got a question about Readline Library.
I want to know if Readline can autocomplete filename from directories in a C program ?
I've searched and only seen command name completion.
thanks in advance.
EDIT: I've copy filename in an array. These as functions that I use : in the file rline.c, char *command_generator,char **tab_completion (const char *text, int start, int end),void initialize_readline (). I think I have to use char * filename_completion_function (开发者_JS百科char *text, int state) ? When I type on "tab" key, it calls nothing, bind() didn't seem to be used. Do you know if I use right functions ? thanks !!
Filename completion is a built-in feature of readline, you don't need to populate filename lists etc. Here with readline 6.1 the following program allows filename completion by default.
#include <stdio.h>
#include <stdlib.h>
#include <readline/readline.h>
#include <readline/history.h>
int main()
{
printf( "%s\n", readline( "test> " ) );
return 0;
}
There are ways to customize this mechanism, e.g. you can specify some functions like rl_filename_quoting_function
and rl_filename_dequoting_function
to help readline provide proper filename quotation for your application.
I think you need to specify your version of readline if this doesn't work for you. /etc/inputrc
contents should be examined as well. Do you have bash
, which uses readline? Does the filename completion work there as expected?
Anyway, info readline
is a very good documentation provided you can use info
itself :) If not, look at Programming with GNU Readline.
To use the readline library specify -lreadline to your compiler. The following code snippet can be compiled with
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;
}
I was confused about the readline you were referring to but it was pointed out to me that you meant the one from the GNU libraries.
For an example of this please see Fredrik's link to the GNU Readline library that does just that.
To apply this to your needs instead of the string cmd[]
that you see you need to use an array of all the file names in the current directory and the rest of the code should be about the same.
精彩评论