使用readline()完成

时间:2011-07-17 22:23:10

标签: c shell filenames gnu readline

我对Readline Library有疑问。

我想知道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 个答案:

答案 0 :(得分:13)

文件名完成是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内容。你有使用readline的bash吗?文件名完成是否按预期工作? 无论如何,info readline是一个非常好的文档,前提是您可以使用info :)如果没有,请查看Programming with GNU Readline

答案 1 :(得分: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;

}

答案 2 :(得分:1)

我对你所指的readline感到困惑,但有人向我指出你是指GNU库中的那个。

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

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