25

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

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

我想为这个程序添加一个功能:一个单独的“窗口”用于输出。我考虑过为此使用ncurses。但是从ncurses FAQ看来,这两个库并不容易一起使用。

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

哦,对彩色文本的支持可能会获得奖励积分。我怀疑我可以用 Readline 做到这一点,所以也许这是一个单独的问题,但如果我的问题的解决方案也可以很容易地为输出添加一些颜色,那就更好了。

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

4

6 回答 6

15

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

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

截图如下:

ncurses和readline结合的程序截图

于 2015-02-25T02:14:22.417 回答
6

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

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

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

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

也许一种选择是使用rlwrap在您的 ncurses 程序“外部”运行 readline ?

于 2009-03-28T22:33:05.107 回答
5

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

如果您使用 ncurses 的内置SIGWINCH处理程序 with KEY_RESIZE,请注意 readline 默认设置LINESCOLUMNS环境变量。这些会覆盖ioctl() TIOCGWINSZncurses 否则会执行的任何动态大小计算(通常使用 ),这意味着即使在调整终端大小后您仍将继续获得初始终端大小。

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

更新:

以下是我从 readline 来源收集的一些附加信息:

readline 的SIGWINCH处理代码(如果rl_catch_sigwinch为 1 则使用)确实更新了LINESand COLUMNS,这似乎对于 ncurses 来说应该足够了。但是,当使用备用 readline 接口时(将 readline 与 ncurses 结合使用时最有意义),信号处理程序(包括一个 for SIGWINCH)将仅在每次rl_callback_read_char()调用期间安装,这意味着在两次调用之间的任何终端调整大小rl_callback_read_char()都不会被readline看到。

于 2015-02-17T21:15:51.343 回答
4

所以事实证明gdb同时使用了readline和ncurses。如果您对此感兴趣,我建议您查看他们的实现: http: //sourceware.org/git/ ?p=gdb.git;a=blob;f=gdb/tui/tui-io.c

于 2013-05-06T17:45:29.560 回答
3

我已经实现了您在我的程序中描述的内容:

http://dpc.ucore.info/lab:xmppconsole

以下是文件处理io:

http://github.com/dpc/xmppconsole/blob/master/src/io.c

于 2010-06-09T18:54:00.877 回答
2

我不确定您尝试了哪个版本。截至今天(2012.09.14) 非常简单,我们只需要将我们的自定义函数挂钩到以下函数指针。

rl_getch_function
rl_redisplay_function
rl_completion_display_matches_hook

我在这里做了一些合理的事情。

于 2012-09-14T05:34:58.873 回答