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)
有没有办法禁用禁用以便自动完成始终有效?
你可以看到 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)
Bash 具有可编程完成。自 1999 年以来,它已经能够适应命令参数的补全,而不仅仅是补全文件名。当未配置特定于命令的完成时,文件名是默认值(这就是将命令更改为 时获取文件名的原因openvpnx
)。
可编程完成通常通过加载激活/etc/bash_completion
。如果您根本不想要可编程补全,并且即使在文件名没有意义的上下文中也总是想补全文件名,请将其从.bashrc
.
看来您对openvpn
命令的参数有自定义完成,并且此完成代码不为第一个参数提供任何内容。我不知道为什么会这样,这可能是完成代码中的错误。有用的完成代码将完成选项及其参数。运行complete -p openvpn
以查看调用了哪些代码来完成 的参数openvpn
。您可以使用 禁用此自定义完成代码complete -r openvpn
,但随后您将只返回文件名,这在命令行上openvpn
仅在几个选项之后很有用。
无论完成设置如何,您始终可以通过调用complete-filename
(默认绑定:)M-/
而不是complete
(TAB
)来完成文件名。