使用readline()完成

lil*_*ood 9 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().你知道我是否使用正确的功能吗?谢谢 !!

unk*_*ulu 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;
}
Run Code Online (Sandbox Code Playgroud)

有一些方法可以自定义此机制,例如,您可以指定一些函数rl_filename_quoting_function,rl_filename_dequoting_function以帮助readline为您的应用程序提供正确的文件名报价.

如果这对您不起作用,我认为您需要指定您的readline版本./etc/inputrc内容也应该检查.你有bash,使用readline吗?文件名完成是否按预期工作?无论如何,info readline如果您可以info自己使用,这是一个非常好的文档:)如果没有,请查看使用GNU Readline编程.


小智 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;

}
Run Code Online (Sandbox Code Playgroud)

  • printf 之后不需要释放 inpt 吗? (2认同)