Завершение вкладки в C (библиотека readline) - PullRequest
1 голос
/ 30 августа 2011

Я пытался заставить работать завершение табуляции .. Я очень запутался и не знаю, что делать. Не могли бы вы взглянуть на мой код и сказать, как я мог бы это исправить.

Кстати, я использовал 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;
    }

Ответы [ 2 ]

2 голосов
/ 30 августа 2011

Я замечаю это:

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

Я не знаю, что такое тип возврата newEnv, но вы, вероятно, хотите поместить его в comm, а не *comm, потому что выне указывал comm ни на что.

1 голос
/ 20 июня 2015

Ваш код очень похож на пример в руководстве по readline.Я вижу ошибку, что вы не объявили index и len в функции генератора равными static .

...