【发布时间】:2013-07-29 01:31:40
【问题描述】:
我编写了一个控制台应用程序,它在运行时有自己的命令提示符。不幸的是,我不能简单地调用 std::cin 并等待输入,因为我需要解释 up/down 以获取命令历史记录。
相反,我不得不关闭回显并将控制台置于非规范模式,并使用“读取”命令逐个获取每个字符,如果它们是可打印字符则回显它们,或者尝试解析/解释它们如果它是转义码的开始。
我遇到的问题是很难以通用/通用方式阅读和解析各种转义代码。当我必须读取/解析对尺寸/位置查询的响应时,问题就更加严重了。
有没有更好的从终端读取的方法?是否有可以读取/解析特殊终端代码的特殊功能? ncurses 不是一个可行的选择(它会清除屏幕,甚至只使用 filter() 似乎有点过分),而其他应用程序一直这样做,而不必引入这些依赖项......我做错了什么?
这是我当前的“获取”功能的片段,它的读取功能非常有限(并且使用更高级的代码,已损坏)。
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。
【问题讨论】: