NCurses初始化而不清除屏幕

我正在编写一个类似于shell的程序。 启动后,会出现提示并输入一些特定于应用程序的命令。

到目前为止这个工作正常。 但是,我想在Bash中添加对命令历史记录的支持,因此用户可以点击向上或向下箭头并查看以前输入的命令。

我已经包含了ncurses库,我用getch()做了一个简单的hello world测试,以确保正确报告向上和向下箭头。

困扰我的是,似乎要求我调用initscr()来清除屏幕以便我使用getch()。

好的,问题是:

有没有人知道如何使用ncurses getch()函数而不先调用initscr()? 如果没有,我可以让它不清楚屏幕吗? 基本上,我希望getch()与getchar()的行为相同,如果这有意义的话。

提前致谢!

编辑:我认为最好的例子是Python如何在交互模式下运行。

Curses希望完全控制屏幕,并优化对屏幕的写入,尤其是在慢速串行线路上。 要做到这一点,它需要知道屏幕上的内容,并且对大多数终端执行此操作的唯一合理方法是从空屏幕开始并跟踪您写入终端的内容。

因此,我怀疑(n)curses是你的shell的错误工具。 您可能需要在抽象层上迈出一步,然后使用terminfo和来自终端的非阻塞读取(标准输入)。

(这不是很有帮助。抱歉。)

使用像readline()这样的接口可能更简单,而不是诉诸于成熟的ncurses。

你可以从whithin rlwrap调用你的程序,并且没有痛苦的function……

这是另一个关于此的讨论 。 提供的解决方案是:

  1. “’filter()’函数允许你将curses用作单行。”
  2. “你可以用C语言写一些东西,使用setupterm来获取终端数据,然后使用tparm,tput进行格式化和输出。”

当然还有第三个选项来获取ncurses源代码并对其进行修改,以便它不再清除屏幕。

您是否考虑过创建自定义terminfo或termcap条目的简单权宜之计,缺少序列来清除屏幕,然后在运行程序之前将终端设置切换到右侧? 你也可以在ncurses中使用newterm()和set_term()。 使用termcap比较容易,因为你可以包含另一个终端并覆盖它的一些function。