bash - 忽略大小写,但如果不明确则不允许自动完成

bash - 忽略大小写,但如果不明确则不允许自动完成

最近我在使用 bash 自动完成并忽略大小写时遇到不方便。

假设我有这个目录:

[xiaobai@xiaobai test]$ l
total 20K
3407873 drwx------. 60 xiaobai xiaobai 4.0K May 25 17:17 ../
3409017 drwxrwxr-x.  2 xiaobai xiaobai 4.0K May 25 17:35 hello/
3681826 drwxrwxr-x.  2 xiaobai xiaobai 4.0K May 25 17:55 Hello_STACKOVERFLOW/
3681837 drwxrwxr-x.  2 xiaobai xiaobai 4.0K May 25 17:55 Hello_StackOverflow/
3412549 drwxrwxr-x.  5 xiaobai xiaobai 4.0K May 25 17:56 ./
[xiaobai@xiaobai test]$

然后 cd h[Tab]:

[xiaobai@xiaobai test]$ cd h #and press [Tab]
hello/               Hello_StackOverflow/ Hello_STACKOVERFLOW/ 
[xiaobai@xiaobai test]$ cd hello #auto generate

您会注意到新的命令提示符带有自动完成“hello”,而存在替代“Hello”。但在这里我没有问题,因为我可以插入 / 或按 [Enter] 进入 hello/ 。或者我可以插入下划线 _ 并按 [Tab] 进一步 Hello_*:

[xiaobai@xiaobai test]$ cd hello_ #and press [Tab]
Hello_StackOverflow/ Hello_STACKOVERFLOW/ 
[xiaobai@xiaobai test]$ cd Hello_StackOverflow #auto generate

现在问题变得明显了,如果我的目标是 'Hello_STACKOVERFLOW/' 该怎么办?我必须按 Back Space 键才能删除“tackOverflow”然后插入 T+[Tab] 即可达到我的目标。

我想要的是:

[xiaobai@xiaobai test]$ cd hello_ #and press [Tab]
Hello_StackOverflow/ Hello_STACKOVERFLOW/ 
[xiaobai@xiaobai test]$ cd Hello_S #without 'tackOverflow', so i just have to type T+[Tab] without redundant erase step.

当然就不会有这样的问题了完成-忽略-大小写关闭在我的输入RC文件。但我喜欢忽略大小写,但在出现歧义时避免自动完成。可以这样做吗?

答案1

您的问题有一个解决方法。

尝试:

bind 'set completion-ignore-case on'
bind 'TAB:menu-complete'
bind 'set menu-complete-display-prefix on'
bind 'set show-all-if-ambiguous on'

类型cd hTab。线路扩展到cd hello.

然后输入_, Tab。线路扩展到cd Hello_StackOverflow

TabTab。线路扩展到cd Hello_STACKOVERFLOW/

解释:

menu-complete与完整类似,但将要完成的单词替换为可能完成列表中的单个匹配项。通过可能的完成列表重复执行菜单完成步骤,依次插入每个匹配项。完成列表末尾,铃声响起(以铃声样式设置为准),恢复原文。该命令旨在与 TAB 绑定,但默认情况下未绑定。

可用时间自bash-2.02-alpha1

menu-complete-display-prefix如果设置为开,菜单完成会在循环浏览列表之前显示可能完成列表的公共前缀(可能为空)。

可用时间自bash-4.2-alpha

show-all-if-ambiguous这会改变完成函数的默认行为。如果设置为“开”,则具有多个可能完成的单词会导致立即列出匹配项,而不是敲响铃声。

menu-complete-display-prefix自从一起工作以来bash-4.3-alpha

答案2

我发现对我来说最好的选择就是简单地添加

bind 'set menu-complete-display-prefix on'

.inputrc

第一个选项卡将完成明确的前缀。第二个选项卡将列出所有剩余的不明确选项。输入您的字符,第三个选项卡将完成您的命令。

相关内容