9

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

到目前为止,这工作得很好。但是,我想像在 Bash 中一样添加对命令历史记录的支持,以便用户可以点击向上或向下箭头并查看以前输入的命令。

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

困扰我的事情是,我调用 initscr() 似乎是一个要求,这将清除屏幕以便我使用 getch()。

好的,所以问题是:

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

提前致谢!

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

4

5 回答 5

13

Curses 想要完全控制屏幕,并优化对屏幕的写入,尤其是在慢速串行线路上。为此,它需要知道屏幕上的内容,而对于大多数终端来说,唯一合理的方法是从空屏幕开始并跟踪您向终端写入的内容。

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

(这不是很有帮助。对不起。)

于 2009-03-17T14:30:59.393 回答
10

使用像readline()这样的接口可能比使用成熟的 ncurses 更简单。

于 2009-03-18T21:19:07.587 回答
6

您可以从rlwrap中调用您的程序,并拥有没有痛苦的功能......

于 2009-03-17T14:31:13.870 回答
4

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

  1. “'filter()' 函数让你可以将诅咒用作单行。”
  2. “您可以在 C 中编写等效的东西,使用 setupterm 获取终端数据,使用 tparm、tputs 进行格式化和输出。”

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

于 2009-03-17T14:31:29.547 回答
-1

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

于 2009-03-18T04:14:43.120 回答