Создание полноэкранного терминального приложения с помощью Go
Я пытаюсь построить полноэкранное приложение терминала. Я использую Go в качестве языка выбора. Я понял, как читать с os.Stdin
, но мне неясно, как очистить окно терминала и манипулировать положением курсора. Я также хочу захватить входной сигнал терминала без его распечатки (повторяется обратно).
Мои вопросы:
- Как эффективно очистить и распечатать на терминале координаты столбца / строки?
- Как остановить терминал от нажатия клавиш печати
Мое намерение:
Я хочу создать полноэкранное терминальное приложение, которое отображает свой собственный пользовательский интерфейс и обрабатывает ввод изнутри (горячие клавиши / навигация / и т. Д.).
Если есть какие-либо библиотеки, которые охватывают этот вид использования, пожалуйста, не стесняйтесь предлагать их.
1 ответ
Самый простой способ очистить терминал и установить позицию с помощью управляющих кодов ANSI. Тем не менее, это не может быть идеальным способом, так как изменения в терминалах могут вернуться, чтобы укусить вас.
fmt.Print("\033[2J") //Clear screen
fmt.Printf("\033[%d;%dH", line, col) // Set cursor position
Лучшей альтернативой будет использование библиотеки, такой как goncurses или termbox-go (кредит: секунда - из комментария Тима Купера).
С такой библиотекой вы можете делать такие вещи:
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()
}
Код выше скопирован из кода Розетты
По состоянию на декабрь 2019 года я бы рекомендовал использовать библиотеку rivo / tview.
(goncurses, упомянутые @vastlysuperiorman, не обновлялись с июня 2019 года, и termbox-go явно объявлен неподдерживаемым).
Вот приложение hello world, взятое из README проекта (переформатировано для удобства чтения):
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 предоставляет снимки экрана и примеры кода, а также стандартную справочную информацию о godoc.
Чтобы запретить терминалу печатать нажатые клавиши, вы можете использовать следующий код:
Импортировать ( "fmt" "системный вызов" "golang.org/x/crypto/ssh/terminal") func main () { fmt.Print ("Введите значение:") byteInput, _:= terminal.ReadPassword (int (syscall.Stdin)) ввод:= строка (byteInput) fmt.Println () // необходимо добавить новую строку после ввода пользователя fmt.Printf("Ваш ввод '%s'", ввод) }