1

我一直在努力让标签完成工作。我很困惑,不知道该怎么做。请您看一下我的代码并告诉我如何修复它。

顺便说一下,rl_attempted_completion_function自从我从在线教程中获得它以来,我就使用了它,但它是一个 C++ 函数。我可以使用什么功能来替换它而不进行更改。

谢谢

   static char** completion( const char * text , int start,  int end){
            char **matches;
            matches = (char **)NULL;

            if (start == 0)
                    matches = rl_completion_matches ((char*)text, &generator);

            return (matches);
    }

    char* generator(const char* text, int state) {
            int index, len;
            char *comm;
            if (!state) {
                    index = 0;
                    len = (int)strlen (text);
            }

            while ( (*comm = newEnv[index])) {
                    index++;
                    if (strncmp (comm, text, len) == 0)
                            return ((comm));
            }
            return NULL;
    }

    int main (int argc,  char * argv[]) {

            using_history();
            rl_readline_name = basename(argv[0]);

            rl_attempted_completion_function = completion;

            while ( readline(">> ")!= NULL )  
                    rl_bind_key('\t',rl_complete);

            return 0;
    }
4

3 回答 3

2

我注意到这一点:

char *comm;
...
while ( (*comm = newEnv[index])) {

我不知道返回类型newEnv是什么,但你可能想把它放进去comm,而不是*comm,因为你没有指向comm任何东西。

于 2011-08-30T01:20:18.833 回答
1

您的代码与 readline 手册中的示例非常相似。我看到的错误是您没有在生成器函数中将 index 和 len 声明为static

于 2015-06-19T22:41:25.620 回答
0

正如 Tom Zych 的最佳答案中所述,您应该更改*comm = newEnv[index]comm = newEnv[index]

但我也看到了其他几个问题

一方面,这两个变量应该是静态的:

int index, len;

像这样:静态int索引,len;

否则,您总是返回第一个匹配项(而且我认为如果有匹配项,您最终可能会陷入无限循环)。使这些静态化使得后续对非零状态的调用从最后一个匹配开始查找匹配。如果我理解正确,对于每个选项卡完成请求的第一次完成建议搜索,您将获得 0 状态(这会将静态索引重置为 0)

仅在获得状态 0 时查找输入的长度是一种优化(由于您将获得相同的输入,您可以对其进行“缓存”),但静态索引不是:它是必需的

接下来,你应该改变

return ((comm));

return strdup(comm);

最后,将完成更改为:

char **completion(const char *text, int start, int end)
{
    return rl_completion_matches(text, generator);
}

不需要 0 开始检查

此外,请确保您的 newEnv 数组末尾有一个 NULL 值,如下所示:

char* envVar[] = {"a", "b", NULL};

顺便说一句,请确保您在generator使用它之前先声明或定义completion

于 2020-09-18T21:40:17.703 回答