Go библиотека для работы с VT100 escape-последовательностями, предоставляющая удобный интерфейс для управления цветом, стилями текста, курсором и очисткой экрана в терминальных приложениях.
Find a file
2026-01-03 19:14:23 +03:00
example Поправил работу с клавиатурой 2026-01-03 19:07:57 +03:00
key Поправил работу с клавиатурой 2026-01-03 19:07:57 +03:00
color_string.go init 2026-01-01 16:15:17 +03:00
colors.go Добавил готовых цветов 2026-01-01 16:36:40 +03:00
cursor.go Добавил события ввода с клавиатуры 2026-01-03 18:38:35 +03:00
erase.go init 2026-01-01 16:15:17 +03:00
events.go Поправил работу с клавиатурой 2026-01-03 19:07:57 +03:00
go.mod Добавил события ввода с клавиатуры 2026-01-03 18:38:35 +03:00
go.sum Добавил события ввода с клавиатуры 2026-01-03 18:38:35 +03:00
input.go Поправил работу с клавиатурой 2026-01-03 19:07:57 +03:00
LICENSE init 2026-01-01 16:15:17 +03:00
README.md Актуализировал README 2026-01-03 19:14:23 +03:00
sequence.go init 2026-01-01 16:15:17 +03:00
size.go Добавил события ввода с клавиатуры 2026-01-03 18:38:35 +03:00
styles.go init 2026-01-01 16:15:17 +03:00
vt100.go Добавил события ввода с клавиатуры 2026-01-03 18:38:35 +03:00

VT100

Go
Version License

Go библиотека для работы с VT100 escape-последовательностями, предоставляющая удобный интерфейс для управления цветом, стилями текста, курсором, обработкой ввода и событиями в терминальных приложениях.

Возможности

  • Управление цветом текста и фона:

    • Базовые 16 цветов (стандартные и яркие)
    • Поддержка 256 цветов
    • RGB цвета (16.7 миллионов цветов)
  • Стили текста:

    • Жирный, курсив, подчеркивание
    • Мерцание, инверсия, скрытый текст
    • Зачеркивание
  • Управление курсором:

    • Позиционирование курсора
    • Перемещение в 4 направлениях
    • Возврат в начало
    • Скрытие/показ курсора
  • Очистка экрана и строк:

    • Полная очистка экрана
    • Частичная очистка (от курсора, до курсора)
    • Очистка строк
  • Обработка ввода с клавиатуры:

    • Обработка обычных символов
    • Специальные клавиши (стрелки, F1-F12, Home, End и др.)
    • Модификаторы (Ctrl, Shift, Alt)
    • Поддержка escape-последовательностей
  • Работа с событиями:

    • Обработка изменения размера терминала
    • Контекстное управление событиями
  • Утилиты:

    • Получение размера терминала
    • Уведомления об изменении размера

Установка

go get go.neonxp.ru/vt100

Быстрый старт

package main

import (
    "context"
    "fmt"
    "os"
    "os/signal"

    "go.neonxp.ru/vt100"
    "go.neonxp.ru/vt100/key"
)

func main() {
    // Получение размера терминала
    cols, rows, err := vt100.GetTerminalSize()
    if err != nil {
        panic(err)
    }
    fmt.Printf("Размер терминала: %dx%d\n", cols, rows)
    
    // Жирный красный текст
    fmt.Print(vt100.Bold, vt100.FgRed)
    fmt.Println("Привет, мир!")
    fmt.Print(vt100.ResetAll) // Сброс всех стилей
    
    // Перемещение курсора
    vt100.Cursor(10, 5).Print()
    fmt.Print("Курсор в позиции 10,5")
    
    // Очистка экрана
    vt100.EraseDisplay.Print()
    
    // Обработка ввода
    ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt)
    defer cancel()
    
    keyEvents, err := vt100.HandleKeyboard(ctx)
    if err != nil {
        panic(err)
    }
    
    for event := range keyEvents {
        if event.Key == key.Escape {
            break
        }
        fmt.Printf("Клавиша: %+v\n", event)
    }
}

Примеры использования

Работа с цветами

// Базовые цвета (новые константы)
fmt.Print(vt100.FgBlue, "Синий текст", vt100.ResetAll())
fmt.Print(vt100.BgYellow, "Желтый фон", vt100.ResetAll())

// 256 цветов
fmt.Print(vt100.FgColor256(128), "256-цветный текст", vt100.ResetAll())

// RGB цвета
fmt.Print(vt100.BgColorRGB(255, 0, 128), "RGB фон", vt100.ResetAll())

Стили текста

styles := map[string][]vt100.Sequence{
    "Жирный":      {vt100.Bold, vt100.ResetBold},
    "Курсив":      {vt100.Italic, vt100.ResetItalic},
    "Подчеркнутый": {vt100.Underline, vt100.ResetUnderline},
    "Мерцающий":   {vt100.Blinking, vt100.ResetBlinking},
}

for name, seqs := range styles {
    fmt.Println(seqs[0], name, seqs[1])
}

Управление курсором

// Переместить курсор в позицию (строка, колонка)
vt100.Cursor(10, 20).Print()

// Перемещение относительно текущей позиции
vt100.CursorUp(5).Print()    // Вверх на 5 строк
vt100.CursorDown(3).Print()  // Вниз на 3 строки
vt100.CursorLeft(2).Print()  // Влево на 2 колонки
vt100.CursorRight(4).Print() // Вправо на 4 колонки

// Возврат в начало
vt100.CursorHome.Print()

// Скрытие/показ курсора
vt100.CursorHide.Print()
vt100.CursorShow.Print()

Очистка

// Полная очистка экрана
vt100.EraseDisplay.Print()

// Очистка от курсора до конца экрана
vt100.EraseFromCursorUntilEndOfScreen.Print()

// Очистка текущей строки
vt100.EraseInLine.Print()

// Очистка от курсора до конца строки
vt100.EraseFromCursorToEndOfLine.Print()

Обработка ввода с клавиатуры

ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt)
defer cancel()

keyEvents, err := vt100.HandleKeyboard(ctx)
if err != nil {
    panic(err)
}

for event := range keyEvents {
    switch {
    case event.Key == key.Escape:
        return
    case event.Key == key.Enter:
        fmt.Println("\nНажат Enter")
    case event.Key == key.ArrowUp:
        fmt.Println("\nСтрелка вверх")
    case event.Rune == 'c' && event.Modifiers == key.ModCtrl:
        fmt.Println("\nCtrl+C")
        return
    case event.Rune != 0:
        fmt.Printf("\nСимвол: %c\n", event.Rune)
    }
}

Обработка изменения размера терминала

ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt)
defer cancel()

resizeEvents, err := vt100.HandleResize(ctx)
if err != nil {
    panic(err)
}

for event := range resizeEvents {
    fmt.Printf("Новый размер терминала: %dx%d\n", event.Cols, event.Rows)
}

Доступные цвета

Базовые цвета

  • Black, Red, Green, Yellow
  • Blue, Magenta, Cyan, White
  • BrightBlack, BrightRed, BrightGreen, BrightYellow
  • BrightBlue, BrightMagenta, BrightCyan, BrightWhite

Готовые константы

  • Текст: FgBlack, FgRed, ..., FgBrightWhite
  • Фон: BgBlack, BgRed, ..., BgBrightWhite

Структура проекта

vt100/
├── vt100.go          # Основные константы и функции
├── sequence.go       # Тип Sequence и его методы
├── colors.go         # Работа с цветами
├── styles.go         # Стили текста
├── cursor.go         # Управление курсором
├── erase.go          # Функции очистки
├── events.go         # Обработка событий
├── input.go          # Обработка ввода с клавиатуры
├── size.go           # Работа с размером терминала
├── color_string.go   # Автогенерируемый файл для строкового представления цветов
├── key/
│   └── keys.go       # Константы клавиш и модификаторов
└── example/
    ├── all/
    │   └── main.go   # Пример всех возможностей
    ├── events/
    │   └── main.go   # Пример обработки событий
    └── flag/
        └── main.go   # Пример анимации флага

Запуск примеров

# Все возможности
cd example/all
go run main.go

# Обработка событий
cd example/events
go run main.go

# Анимация флага
cd example/flag
go run main.go

Поддерживаемые клавиши

  • Буквенно-цифровые клавиши
  • Специальные клавиши: Enter, Escape, Backspace, Tab, Space
  • Стрелки: ArrowUp, ArrowDown, ArrowLeft, ArrowRight
  • Функциональные клавиши: F1-F12
  • Навигационные клавиши: Home, End, PageUp, PageDown
  • Модификаторы: ModShift, ModCtrl, ModAlt, ModMeta

Лицензия

Этот проект распространяется под лицензией GNU GPL v3. Подробности см. в файле LICENSE.

Совместимость

Библиотека работает с любыми терминалами, поддерживающими ANSI/VT100 escape-последовательности, включая:

  • Linux терминалы
  • macOS Terminal
  • Windows Terminal
  • iTerm2
  • И многие другие