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

Ole*_*nge 11 bash autocomplete

自从选项卡完成成为 shell 的标准功能以来,我一直是它的一个非常高兴的用户。我什至喜欢 Bash 的智能补全(它只搜索 PDF 文件,如果我输入 evince foo<TAB>)——只要它猜对了。

当 Bash 使用其智能完成来拒绝完成时,它破坏了原本快乐的一天。

今天我想:

tar xvf centos5.8_x86_1.ova
Run Code Online (Sandbox Code Playgroud)

所以我输入:

tar xvf cent<TAB>
Run Code Online (Sandbox Code Playgroud)

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

我知道我可以卸载 bash-completion 包来删除智能完成。但是我可以吃蛋糕也吃吗?

我可以要求 bash 先使用智能完成,如果失败,然后使用非智能完成吗?

Mat*_*ieu 10

在程序 tar、vim 和 emacs 的所有“智能”完成失败后,以下内容应该打开正常的 bash 完成:

compopt -o bashdefault tar vim emacs
Run Code Online (Sandbox Code Playgroud)

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

警告:您将获得由手头命令的智能完成定义的完成类型(命令/文件名/用户名等)的正常行为,例如,service即使您调用complete -o bashdefault service.

在这个和其他,其中智能自动完成故障时,可以随时按个案Alt-/(或M-/在bash的手册的符号)到完整的文件名几乎相同的方式,TAB工作,如果智能完井被禁用(几乎相同的方式在一定意义M-/不完整的模式,如*.txt)。有关其他类型补全(例如命令和用户名)的键序列,请参见此处

  • 感谢 Alt-/ 提及,我不知道那里有 (2认同)

car*_*aug 0

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)))'
Run Code Online (Sandbox Code Playgroud)

所以它说

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

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

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

  • 修改 /usr 中由包管理器拥有的文件是在升级时引起严重冲击的好方法。更好:覆盖打包的配置。 (4认同)