2013-07-29 98 views
0

我编写了一个控制台应用程序,它在运行时具有自己的命令提示符。不幸的是,我不能简单地调用std :: cin并等待输入,因为我需要为命令历史记录来解释向上/向下。从控制台读取数据

相反,我不得不关闭回声并将控制台置于非规范模式,并使用'read'命令逐个获取每个字符,如果它们是可打印字符,则回显它们,或尝试解析/解释它们如果它是一个转义码的开始。

我遇到的问题是很难以广义/通用的方式阅读和解析各种转义代码。当我必须读取/解析对大小/位置查询的响应时,它变得更加成问题。

有没有更好的方法从终端读取?是否有特殊的功能可以读取/解析特殊的终端代码? ncurses并不是一个可行的选项(它清除了屏幕,甚至只是使用filter()似乎矫枉过正),而其他应用程序一直都在这样做,而不必牵扯这些依赖关系......我做错了什么?

这里是我目前的'getch'函数的一个缩写,它的功能非常有限(并且具有更高级的代码,被破坏)。

int getch_ex() 
{ 
    int buf = 0; 
    size_t count = read(0, &buf, 1); 
    if ((count > 0) && (buf == ESCAPE_CODE)) 
    { 
     size_t count = read(0, &buf, 1); // [ 
     if ((count > 0) && (buf == '[')) 
     { 
      count = read(0, &buf, 2); 
     } 
    } 
    return (buf); 
} 

带提示的其他终端应用程序(grub,python等)如何实现这个功能?

我的主要目标是在Linux和OS X.

回答

0

看看readline库。这听起来像它正是你想要的。注意license如果这个商业代码虽然。

+0

这是一个开源的解决方案,可用于商业应用,所以许可证必须灵活。但我会研究它。 – latreides

+0

尽管readline似乎是一个可行的解决方案(代码方式),但不幸的是,它不在GPL(而不是LGPL)之下,这可能不是一个可接受的许可证。我的应用程序分为两个组件。一个库,其中所有的真实代码都可以运行,而可执行文件只不过是一个shell来调用库。如果我在shell中(而不是在库中)使用readline,只有shell需要GPL吗?在法律上如何区分两者? – latreides

0

如果不是做GUI或视窗系统,看看在ncurses库包。

+0

ncurses要求您清除屏幕,因此它不是一个可行的解决方案。我认为你可以使用filter()来使用某些ncurses函数而不用初始化屏幕,但是它对于这样一个小的需求来说是一个相当大的依赖关系(以及我检查出来的所有其他应用程序都实现了同样的任务,不需要拉入额外的依赖) – latreides