如何将终端输入始终保持在Golang的底部?

问题描述:

我想创建一个程序,它将从某些数据源进行实时更新。而且我也想像普通终端一样等待用户输入。现在,每当有更新,我将打印的内容,然后重新打印输入提示消息,其创造的东西是这样的:如何将终端输入始终保持在Golang的底部?

Enter command > 
This is a live update message 

Enter command > 
This is a multi-line li...... 
......ve update message 

Enter command > quit 
Bye bye! 

的问题是,我收到的每一个现场的消息,我会打印出来,并“输入命令>”将再次显示,这不是所期望的。我希望实时更新在终端的主要部分进行更新,而“输入命令>”始终停留在底部

我在Github上找到的最接近的包是https://github.com/gizak/termui,但其中大部分示例都尝试显示文字,量表和图表。所以我不太清楚如何开始。

是否有任何包装或termui包的例子来实现?谢谢。

+0

看看[this](http://tldp.org/HOWTO/Bash-Prompt-HOWTO/x361.html):但是,如果终端的默认行为不符合您的期望,那么也许一个不同的用户界面(例如网页,桌面)可能会做得更好?只是一个想法。 –

随着github.com/gizak/termui你正在朝着正确的方向前进。

要理解为什么你不能说

我想实时更新是在终端的主要部分更新,而“中输入命令>”永远留在底部

部分整理出来了,对计算历史的一点点游览是应该的。 ;-)

的事情是,你的端子短emulator¹作品默认起源 模式电脑将如何沟通的时代运营商,其早 字母数字显示器 - 他们将打印使用行式打印机的响应。现在想一想:一台行式打印机的工作原理是这样的:它打印任何发送给它的纸张。输出的是什么,输出。 新的输出始终显示在旧的下方。

当字母数字显示器(屏幕)进入了存在它们 自然继续支持此模式: 线路文本被输出在屏幕 的与文本底部呈现它上面向上滚动。 这就是您在使用仿真器窗口运行的shell命令行(例如bash)时始终在典型的终端仿真器中看到的内容。 这个默认的终端工作模式被称为“规范”或“熟化”。

然后是更先进的显示器,它是可以改变 个人位置在屏幕上 - 通过其列, 行号标识。这改变了信息如何输出的范例:所谓“全屏应用程序”的概念 诞生了。 典型的例子是Vim和Emacs等文本编辑器。

为了支持全屏幕文本输出,终端(和终端仿真器) 通过对其协议实施某些扩展来进行修改。

一个全屏幕应用程序首先请求切换到另一模式 称为“原始”,其中,所述终端发送的大部分是什么由 用户直接输入到终端上运行的程序的终端。 该程序处理这个输入并命令终端在何处以及如何绘制什么 。 您可以阅读this good summary 两种模式之间的区别。

正如你理应由现在怀疑,才能够保持一些信息块 在某个固定的地方终端的文本屏幕, 你希望你的程序是全屏程序和使用终端的 原始模式及其特殊命令允许您在某些字符单元处直接修改 文本。

现在的问题是,不同的终端(和终端仿真器) 有不同的命令来做到这一点,所以有存在库来隔离这些细节的程序 。他们依靠特殊的“终端 信息数据库”来确定终端具有哪些功能,以及如何使其执行程序所要求的功能。 有关更多背景信息,请参见man terminfo

最广为人知的这样的库(C语言编写)被称为ncurses, 且存在原生解决方案的围棋与所谓最明显的 一个是github.com/nsf/termbox-go

github.com/gizak/termui利用termbox-go,但对你而言,它可能是 足以直接使用后者。


¹机会是非常高的你不坐在 一个real hardware terminal 连接到UNIX®机器,但在一个GUI应用程序 是相当的工作,如GNOME终端或xterm或Termial.app等 这些不是“终端”本身,而是相当于 terminal emulators- 即模拟硬件终端的软件。