NCurses初始化而不清除屏幕

时间:2009-03-17 14:23:53

标签: c ncurses

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

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

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

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

好的,问题是:

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

提前致谢!

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

5 个答案:

答案 0 :(得分:9)

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

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

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

答案 1 :(得分:9)

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

答案 2 :(得分:5)

你可以在rlwrap内调用你的程序,并且没有痛苦的功能......

答案 3 :(得分:3)

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

  1. “'filter()'函数允许您将curses用作单行。”
  2. “你可以在C中写一些等价物,使用setupterm来获取 终端数据和tparm,用于格式化和输出的输出。“
  3. 当然还有第三个选项来获取ncurses源代码并对其进行修改,以便它不再清除屏幕。

答案 4 :(得分:0)

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