我正在尝试创建一个程序,该程序将从某些数据源进行实时更新。而且我也想像普通终端一样等待用户输入。现在,每当有更新时,我都会打印内容并打印提示信息以便再次输入,这样可以创建如下内容:
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 :(得分:3)
使用github.com/gizak/termui
,您将朝着正确的方向前进。
要理解为什么你不能得到那个
我希望在终端的主要部分更新实时更新,而“输入命令>”总是留在底部
部分整理出来,对计算历史的一点偏移即将到来。 ; - )
问题是,默认情况下,您的终端模拟器¹的工作模式已生效 计算机如何在早期的时代与运营商进行沟通 字母数字显示 - 他们会使用行式打印机打印他们的回复。现在想一想:行式打印机的工作原理如下:它可以在一张纸上打印发送给它的任何内容。什么是输出,输出。 新输出总是显示在旧版本之下。
当字母数字显示(屏幕)出现时
自然继续支持这种模式:
要输出的行文本呈现在屏幕底部
上面的文字向上滚动。
当您在仿真器窗口运行的shell(例如bash
)的命令行中工作时,您就会在典型的终端仿真器中看到这一点。
终端的默认工作模式称为“规范”或“熟”。
然后出现了更高级的显示器,可以更改 个人职位在屏幕上 - 由他们的专栏和 行号。 这改变了信息输出方式的范式:概念 一个所谓的“全屏应用程序”诞生了。 它们的典型例子是文本编辑器,如Vim和Emacs。
支持全屏文本输出,终端(和终端模拟器) 通过对其协议实施某些扩展来进行调整。
全屏应用程序首先请求终端切换到另一个终端 模式称为“原始”,其中终端发送大部分输入的内容 用户直接在终端上运行的程序。 程序处理此输入并命令终端在哪里和什么 画画。 你可以阅读this good summary 两种模式之间的区别。
正如你现在所怀疑的那样,能够保持一些障碍 在终端文本屏幕的某个固定位置的信息, 你希望你的程序是一个全屏程序,并使用终端的 原始模式及其特殊命令允许您直接修改 某些字符单元格的文字。
现在的问题是不同的终端(和终端仿真器)
有不同的命令来做到这一点,因此存在要隔离的库
来自这些血腥细节的程序。他们依靠特殊的“终端
信息数据库“以确定终端具有哪些功能
以及如何让它做程序要求的。
有关更多背景信息,请参阅man terminfo
。
最广为人知的此类库(用C语言编写)称为ncurses
,
并且存在Go的原生解决方案,据称最明显
一个是github.com/nsf/termbox-go
。
github.com/gizak/termui
使用termbox-go
,但可能对你有用
足以直接使用后者。
¹你不是坐在那里的机会非常高
一个real hardware terminal
连接到UNIX®机器,但正在GUI应用程序中工作
例如GNOME终端或xterm
或Termial.app等。
这些本身不是“终端”,而是相当的
terminal emulators -
也就是说,模拟硬件终端的软件。