为什么 bash 禁用某些命令的自动完成功能,我该如何启用它?

Pet*_*etr 13 bash autocomplete

我经常遇到 bash 禁用某些命令的自动完成功能。这迫使我在命令名称中添加随机符号,使用自动完成功能,然后修复命令名称。这比较烦人。例如:

# I type:
openvpn s<tab>
# Nothing happens, so I add x
openvpnx s<tab>
# Now this expands to
openvpnx somepath

# Same with ./configure or many other commands...
Run Code Online (Sandbox Code Playgroud)

有没有办法禁用禁用以便自动完成始终有效?

Ant*_*gan 7

上市完成

你可以看到 Bash/Readline 使用什么来完成命令complete -p command,例如,如果我运行complete -p openvpn,我得到

bash: complete: openvpn: no completion specification
Run Code Online (Sandbox Code Playgroud)

这表明我的 shell 使用的 Readline 没有任何特定的openvpn命令补全,因此它默认为传统的补全形式,即文件名。

另一个示例(演示定义的完成):

$ complete -p dillo
complete -F _filedir_xspec dillo
Run Code Online (Sandbox Code Playgroud)

这表明一个名为的函数_filedir_xspec用于为dillo命令提供完成。

删除完成

要删除定义的完成,请使用-r带有complete内置选项的选项:

complete -r openvpn
Run Code Online (Sandbox Code Playgroud)


Gil*_*il' 6

Bash 具有可编程完成。自 1999 年以来,它已经能够适应命令参数的补全,而不仅仅是补全文件名。当未配置特定于命令的完成时,文件名是默认值(这就是将命令更改为 时获取文件名的原因openvpnx)。

可编程完成通常通过加载激活/etc/bash_completion。如果您根本不想要可编程补全,并且即使在文件名没有意义的上下文中也总是想补全文件名,请将其从.bashrc.

看来您对openvpn命令的参数有自定义完成,并且此完成代码不为第一个参数提供任何内容。我不知道为什么会这样,这可能是完成代码中的错误。有用的完成代码将完成选项及其参数。运行complete -p openvpn以查看调用了哪些代码来完成 的参数openvpn。您可以使用 禁用此自定义完成代码complete -r openvpn,但随后您将只返回文件名,这在命令行上openvpn仅在几个选项之后很有用。

无论完成设置如何,您始终可以通过调用complete-filename(默认绑定:)M-/而不是completeTAB)来完成文件名。