如何以编程方式禁用 libreadline 的括号粘贴模式

如何以编程方式禁用 libreadline 的括号粘贴模式

从 libreadline 8.1 版开始,默认对“括号粘贴”操作给予特殊处理。这会破坏我的程序的解析,所以我想禁用它。

我知道可以通过将此行添加到 /etc/inputrc 来全局禁用它

   set enable-bracketed-paste off

我知道可以通过将同一行添加到 ~/.inputrc 来禁用每个用户

我知道该命令可以通过修改为特定于程序

   $if Progname
        set enable-bracketed-paste off
   $endif

但是,这些选项需要系统管理员或用户执行操作。我想让程序本身在进入时禁用此模式。 readline 文档说rl_startup_hook is the address of a function to call just before readline prints the first prompt。我认为这意味着以下代码应该执行我想要的操作。

int my_readline_init(void) {
    char *command = strdup("set enable-bracketed-paste off");
    rl_parse_and_bind(command);
    free(command);
}
rl_startup_hook = my_readline_init;

如果我向 init 例程添加调试行或跟踪点,我可以看到它确实被调用。但是(1)它在每个输入行上都会被调用,而不仅仅是第一次,并且(2)它没有达到预期的效果。即它不会关闭括号内的粘贴处理。我究竟做错了什么?

答案1

我最终找到了这个解决方案:

if (RL_VERSION_MAJOR >= 8)
    rl_variable_bind ("enable-bracketed-paste", "off");

相关内容