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