Go библиотека для работы с VT100 escape-последовательностями, предоставляющая удобный интерфейс для управления цветом, стилями текста, курсором и очисткой экрана в терминальных приложениях.
| example | ||
| key | ||
| color_string.go | ||
| colors.go | ||
| cursor.go | ||
| erase.go | ||
| events.go | ||
| go.mod | ||
| go.sum | ||
| input.go | ||
| LICENSE | ||
| README.md | ||
| sequence.go | ||
| size.go | ||
| styles.go | ||
| vt100.go | ||
VT100
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,YellowBlue,Magenta,Cyan,WhiteBrightBlack,BrightRed,BrightGreen,BrightYellowBrightBlue,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
- И многие другие