【问题标题】:How to Implement Tab Completion如何实现 Tab 补全
【发布时间】: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


【解决方案1】:

我已经搜索了实现选项卡完成的方法,但没有找到 直截了当的回答

查看代码here。这应该会给你一个很好的起点。

关于让我的应用程序 支持tab补全

您应该熟悉 Trie 数据结构,因为这是用于实现制表符补全的常用数据结构。网上有很多教程解释的,查一下。

伪代码(给定字符串列表):

对于列表中的每个字符串,将其字符存储在 Trie 数据结构中。

当用户按 Tab 键时:

(GeeksForGeeks) 给定一个查询前缀,我们搜索所有具有该查询的单词。

  1. 使用标准 Trie 搜索算法搜索给定的查询。
  2. 如果查询前缀本身不存在,则返回 -1 表示相同。
  3. 如果查询存在并且在 Trie 中是单词的结尾,则打印查询。这可以通过查看最后一个匹配节点是否具有 isEndWord 标志来快速检查 放。我们在 Trie 中使用这个标志来标记单词节点的结尾,以便 搜索。
  4. 如果查询的最后一个匹配节点没有子节点,则返回。
  5. 否则递归打印最后一个匹配节点的子树下的所有节点。

【讨论】:

    【解决方案2】:

    问题已在 cmets 中得到解答。

    制表符补全是否是正在执行应用程序的特定 shell 的一项功能?

    是的

    关于让我的应用程序支持制表符补全(尤其是在 C++ 中),我需要了解哪些基础知识?

    基本了解bash-completion

    【讨论】:

      猜你喜欢
      • 2013-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-30
      • 2015-08-06
      • 2023-03-18
      相关资源
      最近更新 更多