如果智能完成失败,则强制执行Bash常规选项卡完成


10

自从制表符完成成为shell的标准功能以来,我一直非常乐于使用它。我什至喜欢Bash的智能补全功能(只要我正确输入evince foo <TAB>,它只会搜索PDF文件)。

当Bash使用其智能完成功能拒绝完成时,它毁了原本幸福的一天。

今天我想:

tar xvf centos5.8_x86_1.ova

所以我输入:

tar xvf cent<TAB>

Bash拒绝完成该路径,因为.ova文件不是您通常与tar一起使用的文件。

我知道我可以卸载bash-completion软件包以删除智能补全。但我也可以吃蛋糕吗?

我可以先让bash使用智能完成功能,如果失败了,然后使用非智能完成功能?


1
<spam> Zsh可以做到。</ spam>
吉尔斯(Gilles)'SO-不再是邪恶的'

Answers:


9

在程序tar,vim和emacs的所有“智能”完成均失败之后,以下命令应打开正常的bash完成:

compopt -o bashdefault tar vim emacs

另请参见在线bash手册中的相关页面

注意:对于由命令的智能补全定义的补全类型(命令/文件名/用户名等),您将获得正常的行为,例如,service即使调用,补全也不会完成文件名complete -o bashdefault service

在这种情况和其他情况下,智能自动补全失败,您始终可以按Alt-/(或按M-/bash手册中的注释)完成文件名,其方式与禁用智能补全功能时TAB的工作方式几乎相同(在M-/没有自动完成的意义上几乎相同)完整的模式,如*.txt)。有关其他类型的补全(例如命令和用户名)的信息,请参见此处


2
感谢您的Alt- /提及,我不知道该在那儿
Michael Speer 2015年

1

bash完成是bash标准完成的扩展,它本身就是bash程序。因此,如果您想更改程序的行为,只需对其进行更改。这是免费软件,您可以自由使用。对于tar命令的特定情况,文件为/usr/share/bash-completion/completions/tar。对于tar自动完成与扩展名的文件ova,只需将其添加到行

local tars='@(@(tar|gem|spkg)?(.@(Z|[gx]z|bz?(2)|lzma))|t@([glx]z|bz?(2)))'

所以说

local tars='@(@(tar|gem|spkg|ova)?(.@(Z|[gx]z|bz?(2)|lzma))|t@([glx]z|bz?(2)))'

请注意,这是Debian Wheezy(当前稳定版本)的路径和代码。不同的发行版或版本可能具有不同的代码,但是想法是相同的。打开代码并对其进行调整以执行您想要的操作。

编辑:我只是注意到问题是关于每次找不到匹配项的问题,而不仅仅是添加ova到的特定情况tar。也许对某人来说仍然有用,知道他们在哪里可以找到源。


4
修改包管理器所拥有的/ usr中的文件是一种引起升级麻烦的好方法。更好:覆盖打包的配置。
克里斯·唐纳

1
@ChrisDown,您将如何做?我仍在寻找干净的.bashrc解决方案。
克莱顿·斯坦利
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.