2013-07-30 37 views
6

我想添加自动完成功能到我的命令行应用程序。到目前为止,所有的答案都是说它是shell的优先级,但在我的情况下它是不同的。我的程序在main()中进入循环(获取命令),所以我认为它与shell没有任何关系。我怎样才能达到这样的目标?自动完成与C + +(不与壳牌)

以下是我的程序。它在用户输入时开始解析(std::getline())。如何在不使用任何外部库的情况下在运行时获得用户输入?

while (input != "exit") { 

    std::cout << "\nCommand >> "; 
    std::getline(std::cin, input); 

    com.parse(input); 
} 
+0

你想从哪个数据库自动完成? –

+2

您将需要使用库。如果它适用于您的平台,请查看'readline'。 –

+0

@CodyGray可能是一个关键字向量。 – khajvah

回答

2

正如大卫罗德里格斯所说,使用readline GNU在Linux下完成这项工作(我不得不使用一个库)。

This是官方文档,它有一些C例子,但它们太混乱了,所以我用this来创建我自定义的自动完成。

1

您可以使用ReadConsoleInput找出用户正在按下哪些按键。 它可以在MSDN在这里找到: http://msdn.microsoft.com/en-us/library/windows/desktop/ms684961%28v=vs.85%29.aspx

然后你可以使用WriteConsole,其中写信给从当前光标现在的位置是控制台,试图自动完成用户正在打字。

然后使用SetConsoleCursorPosition回到您拨打WriteConsole之前指针所在的位置。这将允许用户继续打字。只需使用WriteConsol即可填充空格,以便在您猜错的情况下撤消自动填充。

我不认为getline()会赶上从WriteConsole字母,所以你可能要同时跟踪用户正在打字,而且你正在使用WriteConsole或添加什么只是跟踪哪些命令你以为他会写,然后在你提出命令后,如果他进入了这个命令,就打电话给他。

我最后的建议是使用SetConsoleAttributes将附加字符串的颜色更改为浅灰色以向用户显示这是一个建议,而不是他写的内容。

+0

由于OP表示他使用Linux,所以msdn不会帮助 – Bogolt

+0

是的......也许我应该先阅读注释..:P – Hjorthenify

+1

不客气!如果其他人对Windows有同样的问题,我会留下回复。 – Hjorthenify