Использование GNU readline для автоквотирования / автоэкранирования имен файлов, как это делает bash

Я добавляю readline поддержка программы с интерактивной оболочкой.

Я нашел несколько отличных примеров в Интернете, таких как этот, но у меня возникают проблемы с рассказом readline автоматически расширять имена файлов с \␣ когда имя файла имеет пробел.

В сообщении блога, упомянутом выше, объясняется, как сделать это с пользовательским завершением. Однако у меня есть команда типа load filenameтак что для второго аргумента я даю readline сделать поведение по умолчанию, чтобы завершить имена файлов, установив rl_attempted_completion_over до 0.

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

Итак, простой пример:

#include <readline/readline.h>

int main(void)
{
    rl_filename_quoting_desired = 1;
    rl_filename_quote_characters = " \t\n\"\\'`@$><=;|&{(";
    rl_filename_completion_desired = 1;
    rl_filename_quoting_desired = 1;
    // rl_completer_quote_characters = "\"";  see explanation below

    char *buffer = readline("> ");
    free(buffer);
    return 0;
}

Итак, если я запустите это

> fi<TAB>
file with spaces.txt  firefox_shaoran/
> fil<TAB>
> file with spaces.txt

Но я хочу readline Exapnd, как Bash, это означает, что после > file<TAB> я хочу получить file\ with\ spaces.txt,

Я играл с различными переменными, предоставленными readline, но я не могу получить тот же результат. В документации rl_basic_word_break_characters он говорит, что использует Bash " \t\n\"\\'@$><=;|&{(", Я пробовал настройку rl_filename_completion_desired а также rl_filename_quoting_desired до 1, но это тоже не работает.

Что мне делать в простом примере, чтобы readline расширяет имена файлов, как это делает bash?

// редактировать:

Прочитав немного исходного кода bash, я наткнулся на bashline.c файл и нашел место, где rl_filename_quote_characters а также rl_completer_quote_characters установлены. В моем примере я прокомментировал эту строку, потому что без нее поведение не изменилось. Однако, если я раскомментирую строку, readline цитирует имена файлов с пустыми пробелами, и это здорово. То, что я до сих пор не нашел в документации, это как избежать завершения, а не цитировать его.

Я тоже пробовал rl_completer_quote_characters = "\"";

0 ответов

Другие вопросы по тегам