如何告诉 `complete` 回退到默认值?

How to tell `complete` to fall-back to its default?

我正在使用 complete bash-builtinin 为我的 python 脚本启用任意自动完成。我设置为:

complete -C './script.py --compgen "$@"' ./script.py

这样,每当 bash 尝试自动完成时,它都会调用我的脚本,并带有一个标志 --compgen,告诉我的脚本进行自动完成。这很好用。

但是我希望能够在某些情况下从 script.py 回退到 bash 的默认行为。有没有办法告诉 complete 它应该在不调用我的脚本的情况下重新运行并改为执行默认操作?

基本上,我想避免在引用文件时重新实现文件名扩展。

在您的 Python 代码中试试这个:

import os
# if failed:
os.system("bash -c 'compgen -o default'")

事实证明,从 python 脚本输出 compgen 的回退具有未转义的缺点。因此,如果用户尝试完成像 a/b/c d.txt 这样的文件名,命令行将从:

./script.py a/b/c\ d.txt

./script.py a/b/c d.txt

点击标签后。其他扩展也会中断。 complete 内置函数确实提供了后备方案,但是:

complete -C './script.py --compgen "$@"' -o default ./script.py
#                                        ^^^^^^^^^^

这是告诉 complete 首先尝试 -C 部分,如果该部分 returns 零匹配,它会询问默认完成,然后进行文件名解析等

我发现甚至可以通过完全返回空字符串作为建议来强制完成不提供任何建议。这可以防止回退 运行,但它也不算作实际的完成建议,因此它不考虑空字符串。