我正在尝试构建一个全屏终端应用程序。我使用Go作为我的首选语言。我已经弄清楚如何从os.Stdin
读取,但我不清楚如何清除终端窗口并操纵光标位置。我还希望捕获终端输入而不打印(回显)。
我的问题是:
我的意图:
我想创建一个全屏终端应用程序,它可以呈现自己的UI并在内部处理输入(热键/导航等等)。
如果有任何图书馆涵盖此类用例,请随时提出建议。
答案 0 :(得分:2)
清除终端和设置位置的最简单方法是通过ansi转义码。然而,这可能不是理想的方式,因为终端的变化可能会让你感到厌烦。
fmt.Print("\033[2J") //Clear screen
fmt.Printf("\033[%d;%dH", line, col) // Set cursor position
更好的选择是使用像goncurses或termbox-go这样的库(信用:第二个来自Tim Cooper的评论)。
使用这样的库你可以做这样的事情:
import (
gc "code.google.com/p/goncurses"
)
func main() {
s, err := gc.Init()
if err != nil {
panic(err)
}
defer gc.End()
s.Move(5, 2)
s.Println("Hello")
s.GetChar()
}
复制的上述代码
答案 1 :(得分:0)
要停止终端打印按键,您可以使用以下代码:
import ( "fmt" "syscall" "golang.org/x/crypto/ssh/terminal" ) func main(){ fmt.Print("Enter Value: ") byteInput, _ := terminal.ReadPassword(int(syscall.Stdin)) input:= string(byteInput) fmt.Println() // it's necessary to add a new line after user's input fmt.Printf("Your input is '%s'", input) }
答案 2 :(得分:0)
从2019年12月开始,我建议使用rivo/tview库。
(@ vastlysuperiorman提到的goncurses自2019年6月以来没有更新过,termbox-go被明确声明为未维护)。
这里是“ hello world”应用程序,该应用程序来自项目的自述文件(经过重新格式化以提高可读性):
package main
import (
"github.com/rivo/tview"
)
func main() {
box := tview.NewBox().
SetBorder(true).
SetTitle("Hello, world!")
if err := tview.NewApplication().SetRoot(box, true).Run(); err != nil {
panic(err)
}
}
tview提供了screenshots and example code和标准的godoc reference。