当前位置:  开发笔记 > 运维 > 正文

使用GNU Readline; 如何在同一个程序中添加ncurses?

如何解决《使用GNUReadline;如何在同一个程序中添加ncurses?》经验,为你挑选了3个好方法。

标题比我的实际目标更具体:

我有一个命令行程序,它使用GNU Readline,主要用于命令历史记录(即使用向上箭头检索以前的命令)和其他一些细节.现在,程序的输出中间散布着用户的输入,有时候输出是正常的,但输出是异步的(它是通过网络连接来响应输入命令),有时会变得烦人(例如,如果用户输出行时)正在输入新的输入).

我想为这个程序添加一个功能:输出的单独"窗口".我想过为此使用ncurses.但是从ncurses FAQ中可以看出,这两个库并不容易一起使用.

我可能会考虑使用Editline或tecla而不是Readline,但我不清楚其中任何一个是否能解决我的问题.我还考虑使用除ncurses之外的其他东西,包括提供两种功能的库(文本模式窗口和命令历史记录),但我不知道什么是最好的.

哦,对彩色文字的支持可能会得到奖励积分.我怀疑我可能能够做到这一点与Readline库,所以也许这是一个单独的问题,但如果我的问题的解决方案也可以轻松一点颜色添加到输出,那就更好了.

我正在使用Ubuntu Hardy(Linux 2.6).



1> Ulfalizer..:

我现在在GitHub上组建一个简单的示例程序:https://github.com/ulfalizer/readline-and-ncurses.

它支持无缝和高效的终端大小调整和多字节/组合/宽字符.该代码有用的评论.

截图如下:

结合ncurses和readline的程序截图



2> hlovdal..:

我做了一些搜索,看起来你运气不好.

对于ncurses替代品,有SLang,Newt和Turbo Vision.俚语不仅仅是屏幕处理,因此更复杂,但也许它可以用于您的目的?Newt使用屏幕处理并且更简单,但是我认为太简单和单线程模式.

Turbo vision是Borland的文本模式图形库,在80年代末/ 90年代初期被所有工具使用.当这种东西的市场减少时,Borland发布了源代码,现在有一个linux端口(旁注,这个项目似乎已经编写了自己的turbo vision实现).那个端口没有死(今年有一些cvs更新,编译得很好(旧版本没有)),但我找到的电视例子都没有更新,我之前只做了一些编译放弃其余的.这有点遗憾,因为电视是一个可爱的环境.TV是btw C++(我假设你使用C?).

对于readline的替代方法,有libkinput,它可能与ncurses一起工作(它说它可以使用ncurses的terminfo.但是我不确定这是否意味着它可以与ncurses一起使用共存)?

也许一个选项是使用rlwrap在你的ncurses程序中"外部"运行readline ?



3> Ulfalizer..:

这让我头疼了几个小时,所以只是为了拯救人们谷歌搜索一些痛苦:

如果你正在使用ncurses的内置SIGWINCH处理程序KEY_RESIZE,请注意readline 默认设置LINESCOLUMNS环境变量.这些覆盖ioctl() TIOCGWINSZ了ncurses否则会进行的任何动态大小计算(通常都是这样),这意味着即使在调整终端大小后你也会继续获得初始终端大小.

这可以通过在初始化readline之前设置rl_change_environment为来防止0.

更新:

以下是我从readline来源收集到的一些其他信息:

的readline的SIGWINCH处理代码(如果这是用来rl_catch_sigwinch做更新1)LINESCOLUMNS,这似乎应该是足够的ncurses的.但是,当使用备用readline接口(在将readline与ncurses组合时最有意义)时,信号处理程序(包括一个用于SIGWINCH)将仅在每次rl_callback_read_char()调用的持续时间内安装,这意味着任何终端在两次调用之间调整大小rl_callback_read_char()都不会通过readline看到.

推荐阅读
N个小灰流_701
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有