использование readline () для завершения

У меня вопрос о библиотеке 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 () не использовалась. Вы знаете, правильно ли я использую функции? Благодарность !!


person lilawood    schedule 17.07.2011    source источник
comment
возможно, эта ссылка   -  person Fredrik Pihl    schedule 18.07.2011


Ответы (3)


Завершение имени файла - это встроенная функция 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, в котором используется строка чтения? Автозавершение имени файла там работает должным образом? В любом случае, info readline - очень хорошая документация при условии, что вы можете использовать сам info :) Если нет, посмотрите Программирование с помощью GNU Readline.

person unkulunkulu    schedule 24.07.2011
comment
Можно сказать, что вам может понадобиться флаг -lreadline в зависимости от используемого вами компилятора. - person Shamikul Amin; 24.01.2014

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

}
person Community    schedule 22.05.2015
comment
Разве вам не нужно освобождать inpt после printf? - person netskink; 01.03.2017

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

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

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

person Jesus Ramos    schedule 17.07.2011
comment
@cnicutar Спасибо, что указали на это, я отредактировал ссылку на комментарий Фредрика, который я только что видел. - person Jesus Ramos; 18.07.2011
comment
Благодарность! Чтобы заполнить массив, если я использую system (ls), он работает? или я использую другую функцию C? - person lilawood; 19.07.2011
comment
ls может работать, вы также можете использовать DIR *, а затем добавить имена файлов в динамический массив, получив все файлы в текущем каталоге. - person Jesus Ramos; 19.07.2011
comment
@lilawood Нет, system (ls) не будет работать (она отправит вывод ls на стандартный вывод). Вам необходимо прочитать и понять документацию для чтения. - person Jens; 21.07.2011