我正在为具有交互式shell的程序添加readline
支持。
我在网上发现了一些很棒的例子like this one但是当文件名有空格时,我无法告诉readline
使用\␣
自动扩展文件名
上面提到的博文解释了如何使用自定义完成功能。但是我有load filename
类型的命令,因此对于第二个参数,我让readline
通过将rl_attempted_completion_over
设置为0来执行默认行为,即完成文件名。
我也在阅读the api documentation并且有几个与该主题相关的功能和变量,但是我对这些文档感到有点不知所措,这些信息太多了它立刻。
这么简单的例子:
#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
但我希望{b}支持readline
,这意味着> file<TAB>
我想获得file\ with\ spaces.txt
。
我一直在玩readline
提供的不同变量,但我无法得到相同的结果。在rl_basic_word_break_characters
的文档中,它说bash使用" \t\n\"\\'@$><=;|&{("
。我尝试将rl_filename_completion_desired
和
rl_filename_quoting_desired
设置为1,但它也不起作用。
我应该在简单示例中做些什么,以便{b}将readline
扩展为文件名?
//编辑:
在阅读了一些bash源代码后,我看到了bashline.c
文件,找到了rl_filename_quote_characters
和rl_completer_quote_characters
设置的位置。在我的例子中,我评论了这一行,因为没有它,行为并没有改变。但是,如果我取消注释该行,readline
引用带有空格的文件名,这很好。到目前为止我在文档中找不到的是如何逃避完成而不是引用它。
我也试过rl_completer_quote_characters = "\"";