最近我在使用 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 h
,Tab。线路扩展到cd hello
.
然后输入_, Tab。线路扩展到cd Hello_StackOverflow
按Tab,Tab。线路扩展到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
。
第一个选项卡将完成明确的前缀。第二个选项卡将列出所有剩余的不明确选项。输入您的字符,第三个选项卡将完成您的命令。