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

时间:2017-04-11 09:04:03

标签: go terminal

我正在尝试创建一个程序,该程序将从某些数据源进行实时更新。而且我也想像普通终端一样等待用户输入。现在,每当有更新时,我都会打印内容并打印提示信息以便再次输入,这样可以创建如下内容:

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包来实现这一目标?谢谢。

1 个答案:

答案 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 - 也就是说,模拟硬件终端的软件。