2017-04-11 193 views
1

我想創建一個程序,它將從某些數據源進行實時更新。而且我也想像普通終端一樣等待用戶輸入。現在,每當有更新,我將打印的內容,然後重新打印輸入提示消息,其創造的東西是這樣的:如何將終端輸入始終保持在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):但是,如果終端的默認行爲不符合您的期望,那麼也許一個不同的用戶界面(例如網頁,桌面)可能會做得更好?只是一個想法。 –

回答

3

隨着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- 即模擬硬件終端的軟件。