Readline 的绑定命令的意外行为

Ant*_*gan 7 bash readline

我还没有研究我的 Ubuntu 16.04 系统上的 Bash/Readline 版本是否支持括号粘贴模式(它不是),出于好奇,我运行了这个Ask Ubuntu answer 中提供的以下命令。

bind 'set-enable-bracketed-paste off'
Run Code Online (Sandbox Code Playgroud)

如果set-enable-bracketed-paste设置不存在,我希望bind要么抱怨语法错误,要么什么都不做。相反,它取消了小写字母的绑定p,即,字符在键入时消失在黑洞中。

似乎该bind命令的这种用法解除了紧跟在第一个空格字符之前的最后一个连字符之后的字符(如果字符串中有任何空格)。例如,我运行了以下命令:

这会导致r角色未绑定:

bind '__-r anymorecharacters'
Run Code Online (Sandbox Code Playgroud)

这解除了字符的绑定2

bind 'xxxx-1-2xxx'
Run Code Online (Sandbox Code Playgroud)

仍然可以通过 在输入字符之前输入Ctrl- 来V输入字符,从而允许它们重新绑定:

bind 'r: self-insert'
bind '2: self-insert'
Run Code Online (Sandbox Code Playgroud)

对我来说,这是出乎意料和令人惊讶的行为,我认为这是一个错误。但是,我对 Readline 不是很熟悉,所以我想我会在这里询问是否对这种行为有合理的解释。

Jde*_*eBP 7

Readline 的配置文件解析器有一些糟糕的错误检查。

set-enable-bracketed-paste被解析的方式,说,control-DELmeta-q将被解析。Readline 取最后一个减号分隔的部分,并尝试将其理解为键名,并尝试将其余部分理解为修饰符序列。

如果在其键名表中没有匹配的名称,则识别键的代码会轻松地回退到仅查看第一个字符。Sopaste被用来表示p密钥。

查找修饰符的代码不关心字符串中是否还有其他非修饰符的东西,也不希望修饰符以减号结尾。所以set-enable-bracketed-被简单地视为没有修饰符。

这不会“解除绑定p密钥”。它将键重新绑定p到名为“ off”的函数。 如果在函数表中找不到名为“ ”的函数,则执行此操作的代码不会引发错误off默认函数表没有这样的函数。