2011-07-17 46 views
9

我有一个关于Readline Library的问题。使用readline()完成

我想知道如果Readline可以自动完成C程序中的目录的文件名?

我已经搜索,只看到命令名称完成。

在此先感谢。

编辑:我已经复制文件名在数组中。 这些作为我使用的函数:文件rline.c中的 ,char * command_generator,char ** tab_completion(const char * text,int start,int end),void initialize_readline()。我想我必须使用char * filename_completion_function(char * text,int state)?当我键入“tab”键时,它什么都没有调用,bind()似乎没有被使用。你知道我使用正确的功能吗? 谢谢!!

+3

这也许[链接](http://cc.byexamples.com/2008/06/16/gnu-readline-implement-custom-auto-complete/) –

回答

12

文件名完成是readline的一个内置功能,您不需要填充文件名列表等。这里使用readline 6.1,以下程序允许默认文件名完成。

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

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

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

有一些方法可以定制这种机制,例如,您可以指定一些功能,如rl_filename_quoting_functionrl_filename_dequoting_function以帮助readline为您的应用程序提供正确的文件名引用。

我想你需要指定你的readline版本,如果这不适合你。还应该检查内容/etc/inputrc。你有bash,它使用readline吗?文件名完成是否按预期工作? 无论如何,info readline是一个非常好的文档提供您可以使用info本身:)如果没有,看看Programming with GNU Readline

+0

它完美的作品!谢谢 – lilawood

+1

可能要说你可能需要标志-lreadline,这取决于你使用的编译器。 –

1

我对你提到的readline感到困惑,但是有人指出你的意思是来自GNU库的那个。

有关此示例,请参阅Fredrik与GNU Readline库的链接。

要将此应用于您的需求而不是string cmd[],您会发现需要使用当前目录中所有文件名的数组,其余代码应该大致相同。

+0

被编译不会倒退,但他在谈论http://www.gnu.org/software/readline/ – cnicutar

+0

@cnicutar感谢您指出这一点,我编辑了Fredrik的评论,我刚刚看到。 –

+0

谢谢!为了填满阵列,如果我使用系统(“ls”)它可以工作吗?或者我使用其他C函数? – lilawood

5

要使用readline库,请在编译器中指定-lreadline。下面的代码段可以与

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

printf之后你不需要释放inpt吗? – netskink