Использование 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 = "\"";