标题比我的实际目标更具体:
我有一个命令行程序,它使用GNU Readline,主要用于命令历史记录(即使用向上箭头检索以前的命令)和其他一些细节.现在,程序的输出中间散布着用户的输入,有时候输出是正常的,但输出是异步的(它是通过网络连接来响应输入命令),有时会变得烦人(例如,如果用户输出行时)正在输入新的输入).
我想为这个程序添加一个功能:输出的单独"窗口".我想过为此使用ncurses.但是从ncurses FAQ中可以看出,这两个库并不容易一起使用.
我可能会考虑使用Editline或tecla而不是Readline,但我不清楚其中任何一个是否能解决我的问题.我还考虑使用除ncurses之外的其他东西,包括提供两种功能的库(文本模式窗口和命令历史记录),但我不知道什么是最好的.
哦,对彩色文字的支持可能会得到奖励积分.我怀疑我可能能够做到这一点与Readline库,所以也许这是一个单独的问题,但如果我的问题的解决方案也可以轻松一点颜色添加到输出,那就更好了.
我正在使用Ubuntu Hardy(Linux 2.6).
我现在在GitHub上组建一个简单的示例程序:https://github.com/ulfalizer/readline-and-ncurses.
它支持无缝和高效的终端大小调整和多字节/组合/宽字符.该代码有用的评论.
截图如下:
我做了一些搜索,看起来你运气不好.
对于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 ?
这让我头疼了几个小时,所以只是为了拯救人们谷歌搜索一些痛苦:
如果你正在使用ncurses的内置SIGWINCH
处理程序KEY_RESIZE
,请注意readline 默认设置LINES
和COLUMNS
环境变量.这些覆盖ioctl()
TIOCGWINSZ
了ncurses否则会进行的任何动态大小计算(通常都是这样),这意味着即使在调整终端大小后你也会继续获得初始终端大小.
这可以通过在初始化readline之前设置rl_change_environment
为来防止0
.
更新:
以下是我从readline来源收集到的一些其他信息:
的readline的SIGWINCH
处理代码(如果这是用来rl_catch_sigwinch
做更新1)LINES
和COLUMNS
,这似乎应该是足够的ncurses的.但是,当使用备用readline接口(在将readline与ncurses组合时最有意义)时,信号处理程序(包括一个用于SIGWINCH
)将仅在每次rl_callback_read_char()
调用的持续时间内安装,这意味着任何终端在两次调用之间调整大小rl_callback_read_char()
都不会通过readline看到.