NCurses初始化而不清除屏幕

NCurses初始化而不清除屏幕,c,ncurses,C,Ncurses,我正在写一个类似于shell的程序。启动后,会出现一个提示,您可以输入一些特定于应用程序的命令 到目前为止,这一切都很好。但是,我想添加对Bash中的命令历史记录的支持,这样用户就可以点击向上或向下箭头查看以前输入的命令 我已经包括了ncurses库,并且用getch()做了一个简单的hello world测试,以确保正确报告了向上和向下箭头 困扰我的是,我似乎需要调用initscr(),它将清除屏幕以便使用getch() 好的,问题是: 有人知道一种不用先调用initscr()就可以使用ncu

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

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

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

困扰我的是,我似乎需要调用initscr(),它将清除屏幕以便使用getch()

好的,问题是:

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

提前谢谢


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

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

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


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

您可以从whithin调用您的程序,并在没有痛苦的情况下获得功能…

这里是另一个关于这一点的例子。提供的解决方案包括:

  • “使用‘filter()’函数可以将诅咒作为一行使用。”
  • “您可以用C编写一些等价的东西,使用setupterm获得 终端数据,以及用于格式化和输出的tparm、tputs。“

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

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

    使用像这样的接口可能比使用成熟的网络课程更简单。

    这是一个非常丑陋的黑客行为,不会产生一个在最终用户系统上可用的应用程序。这是胡说八道。您可以在进程的环境中设置TERMINFO,并在安装时使用少量条目在备用路径下安装自定义TERMINFO数据库。然后将术语变量设置为适当的条目。理论上,甚至可以在运行时使用terminfo实用程序自动编译备用terminfo条目,该条目存储在terminfo指向的非标准位置。如果您在运行时执行此操作,您甚至可以基于当前终端创建配制的条目。它并不漂亮,但也不像你说的那么糟糕。这个链接给出了一个404未找到的地址-(已编辑。遗憾的是,Wayback Machine只有一个版本已经包含404。不过,感谢您报告了死链接。只需在谷歌上搜索讨论的主题行,即可发现该讨论存档在一个更稳定的URL上,经过编辑以重新介绍该链接。ncurses和readline具有不同的许可证。请务必先检查!