将GNU readline告诉自动引用/ autoescape文件名,如bash,

时间:2017-07-20 18:10:45

标签: c readline libreadline

我正在为具有交互式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_charactersrl_completer_quote_characters设置的位置。在我的例子中,我评论了这一行,因为没有它,行为并没有改变。但是,如果我取消注释该行,readline引用带有空格的文件名,这很好。到目前为止我在文档中找不到的是如何逃避完成而不是引用它。

我也试过rl_completer_quote_characters = "\"";

0 个答案:

没有答案