从 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");