如果智能补全失败,则强制 Bash 正常 Tab 补全

如果智能补全失败,则强制 Bash 正常 Tab 补全

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

当 Bash 使用其智能完成来拒绝完成时,这会毁掉原本快乐的一天。

今天我想要:

tar xvf centos5.8_x86_1.ova

所以我输入:

tar xvf cent<TAB>

Bash 拒绝完成路径,因为 .ova-files 不是您通常在 tar 中使用的文件。

我知道我可以卸载 bash-completion 包来删除智能完成。但我能鱼与熊掌兼得吗?

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

答案1

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

compopt -o bashdefault tar vim emacs

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

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

在这种情况以及其他智能自动完成失败的情况下,您可以随时按Alt-/(或M-/在 bash 手册的符号中)来完成文件名几乎与禁用智能完成时 TAB 的工作方式相同(在M-/不完成类似模式的意义上几乎相同的方式*.txt)。看这里用于其他类型完成的按键序列,例如命令和用户名。

答案2

奥莱先生:-),

鱼与熊掌兼得:

<tab>将为您提供 bash 在完成时的最佳猜测。如您所知,有时这是错误的。

然而,当 bash 的补全不完美时, M-/( ALT+ SHIFT+ 7(在我们的丹麦语键盘上是左ALT,而不是右AltGr))将强制补全作为文件。因此,M-/当我知道我想强制完成作为文件时,我会使用它。

对我来说,这是两全其美的。

答案3

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。也许它对某些人仍然有用,让他们知道在哪里可以找到来源。

相关内容