![Readline 的配置文件解析器有一些较差的错误检查。](https://linux22.com/image/109098/Readline%20%E7%9A%84%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E8%A7%A3%E6%9E%90%E5%99%A8%E6%9C%89%E4%B8%80%E4%BA%9B%E8%BE%83%E5%B7%AE%E7%9A%84%E9%94%99%E8%AF%AF%E6%A3%80%E6%9F%A5%E3%80%82.png)
我还没有研究我的 Ubuntu 16.04 系统上的 Bash/Readline 版本是否支持括号粘贴模式(不支持),出于好奇,我运行了本文中提供的以下命令询问Ubuntu答案。
bind 'set-enable-bracketed-paste off'
如果该set-enable-bracketed-paste
设置不存在,我希望bind
要么抱怨语法错误,要么什么也不做。相反,它解除了小写字母的绑定p
,即,字符在键入时消失在黑洞中。
看来该bind
命令的这种用法会解除紧跟在第一个空格字符之前的最后一个连字符之后的字符(如果字符串中有任何空格)。例如,我运行了以下命令:
这会导致r
角色被解除绑定:
bind '__-r anymorecharacters'
这会解除角色的绑定2
:
bind 'xxxx-1-2xxx'
仍然可以通过在输入字符之前键入Ctrl-来输入V 字符,从而允许它们重新绑定:
bind 'r: self-insert'
bind '2: self-insert'
对我来说,这是意料之外且令人吃惊的行为,我认为这是一个错误。但是,我对 Readline 不太熟悉,所以我想在这里问一下,看看这种行为是否有合理的解释。
答案1
Readline 的配置文件解析器有一些较差的错误检查。
set-enable-bracketed-paste
control-DEL
以ormeta-q
将被解析的方式进行解析。 Readline 采用最后的减号分隔部分并尝试将其理解为键名称,并采用其余部分并尝试将其理解为修饰符序列。
识别密钥的代码如果键名称表中没有名称匹配,则愉快地退回到仅查看第一个字符。所以paste
被用来表示p
密钥。
寻找修饰符的代码不关心字符串中是否还有其他非修饰符,并且不期望修饰符以负号结尾。因此set-enable-bracketed-
被简单地视为无修饰符。
这不会“解除p
密钥绑定”。它关于-将键绑定p
到名为“”的函数off
。 执行此操作的代码off
如果在函数表中找不到 名为“”的函数,则不会引发错误。默认功能表没有这样的功能。