【发布时间】:2011-07-12 10:33:25
【问题描述】:
我试图弄清楚如何在 C++ 应用程序中为子命令实现制表符补全。我希望它的功能很像 Git 的制表符补全。我正在浏览 Git 的源代码,但它并没有跳出来。
我已经搜索了实现制表符补全的方法,但没有找到一个直截了当的答案,所以我猜测它可能不一定是每个单独的应用程序必须实现的功能。选项卡补全是否是正在执行应用程序的特定 shell 的功能?关于让我的应用程序支持制表符补全(尤其是在 C++ 中),我需要了解哪些基础知识?
【问题讨论】:
-
Tab 补全确实通常是 shell 的一个特性:你在 shell 中按 tab 键同时进入命令行,它有一些方法可以生成可能的补全列表,然后显示列表或遍历它们或其他东西。我使用 zsh,它非常灵活并且有一个复杂的符号来配置 shell 完成:你甚至可以运行单独的 shell 脚本来返回有效的完成,或者尝试解析
--help结果来找出有效的选项。不过,有些程序确实具有交互模式,它们实现了自己的选项卡完成。 -
您确实需要弄清楚您所处的情况(并告诉我们)。如果是 shell 情况,那么更改 C++ 程序以帮助完成制表符是不正常的,尽管可以使用特定 shell 可能具有的任何命令行“发现”功能(例如 --help 解析) ,并且您可以有一个命令行开关来写出命令来为特定的 shell 配置良好的完成(就像
tset返回终端设置一样),但它非常不寻常且价值可疑。 -
如果你想在你的程序中完成,你通常必须找到以特定字符串开头的匹配项。这可以通过在 std::map 中填充所有可能的值,然后使用 lower_bound 和/或 upper_bound 来查找当前匹配的完成来完成。
-
git-completion.bash 只是扩展了 Bash 自己的制表符补全。如果你想知道 Bash 如何实现 tab 补全,请阅读readline。
-
@E-rich:通常,它根本没有使用该程序……它只是事先被告知程序的命令行参数。例如,我的 zsh 安装有一个 4373 行脚本只是为了提供对 git 的支持。可悲的是,这是关于 shell 而不是你的程序......你根本无法为不支持它的 shell 提供 tab 补全。
标签: c++ tab-completion