Создание полноэкранного терминального приложения с помощью Go

Я пытаюсь построить полноэкранное приложение терминала. Я использую Go в качестве языка выбора. Я понял, как читать с os.Stdin, но мне неясно, как очистить окно терминала и манипулировать положением курсора. Я также хочу захватить входной сигнал терминала без его распечатки (повторяется обратно).

Мои вопросы:

  1. Как эффективно очистить и распечатать на терминале координаты столбца / строки?
  2. Как остановить терминал от нажатия клавиш печати

Мое намерение:

Я хочу создать полноэкранное терминальное приложение, которое отображает свой собственный пользовательский интерфейс и обрабатывает ввод изнутри (горячие клавиши / навигация / и т. Д.).

Если есть какие-либо библиотеки, которые охватывают этот вид использования, пожалуйста, не стесняйтесь предлагать их.

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'", ввод)
    }
Другие вопросы по тегам