自从制表符补全成为 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
。也许它对某些人仍然有用,让他们知道在哪里可以找到来源。