используя readline () для завершения - PullRequest
9 голосов
/ 18 июля 2011

У меня есть вопрос по поводу библиотеки Readline.

Я хочу знать, может ли 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 ]

13 голосов
/ 25 июля 2011

Завершение имени файла - это встроенная функция 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_function и rl_filename_dequoting_function, чтобы помочь readline обеспечить правильное цитирование имени файла для вашего приложения.

Я думаю, вам нужно указать свою версию readline, если она не работает для вас. /etc/inputrc содержание также должно быть проверено. У вас есть bash, который использует readline? Работает ли завершение файла там, как ожидалось? В любом случае, info readline - это очень хорошая документация, при условии, что вы можете использовать сам info :) Если нет, посмотрите на Программирование с помощью GNU Readline .

5 голосов
/ 22 мая 2015

Чтобы использовать библиотеку 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;

}
1 голос
/ 18 июля 2011

Я был озадачен ссылкой на readline, на которую вы ссылались, но мне было указано, что вы имели в виду тот, что из библиотек GNU.

Пример этого приведен в ссылке Фредрика на библиотеку GNU Readline, которая именно это и делает.

Чтобы применить это к вашим потребностям вместо string cmd[], который вы видите, вам нужно использовать массив всех имен файлов в текущем каталоге, а остальная часть кода должна быть примерно такой же.

...