这是一个使用libedit或GNU readlines生成自动完成选项的简单程序
#include <readline/readline.h>
#include <stdlib.h>
#include <string.h>
char *command_generator(char *word, int state) {
char *options[] = {"I_love_math", "he_love_math", "she_loves_math", "they_love_math", NULL};
return options[state] ? strdup(options[state]) : NULL;
}
int main(int argc, char **argv) {
rl_readline_name = "rl_example";
rl_completion_entry_function = (void*)command_generator;
rl_initialize();
rl_parse_and_bind("TAB: menu-complete");
while (1) {
char *line = readline("rl> ");
if (line == NULL) break;
printf("echo %s\n", line);
free(line);
}
return 0;
}
此程序有效,在某种意义上它显示完成选项,但它实际上并未完成它们。也就是说,它只会显示可用选项
$ gcc -ggdb3 -ledit example.c && ./a.out
rl> a
he_love_math I_love_math she_loves_math they_love_math
rl> a
即使按Tab键后,它也不会将“a”与“he_love_math”相关联,它只会显示选项。
从小型互联网搜索中,我发现需要将TAB键绑定到菜单完成,但正如您所见,无法运行
rl_parse_and_bind("TAB: menu-complete");
不在我的主目录中输入“TAB:menu-complete”有助于此。
如何完成工作?如何使libedit
用完成建议替换当前单词?
答案 0 :(得分:0)
readline 是通过libedit aka editline中的例程实现的。 不幸的是,兼容性并没有扩展到配置命令。
将绑定线更改为:
rl_parse_and_bind("bind ^I rl_complete");
或将其放入~/.editrc
bind ^I rl_complete
阅读editline
和editrc
的手册页;但他们没有关于库rl_*
libedit
例程的信息