FMX-Terminal — это высокопроизводительный компонент эмулятора терминала (VT100/ANSI) для Delphi FireMonkey, использующий возможности библиотеки Skia для аппаратного ускорения рендеринга.
Компонент создан для тех, кому нужен быстрый, плавный и кросс-платформенный терминал внутри FMX приложений.
- Высокая производительность:
- Использует Skia для отрисовки (GPU-ускорение).
- Batch Rendering: Группировка символов для минимизации вызовов отрисовки.
- Dirty Lines: Перерисовываются только измененные строки.
- Hardware Scroll: Скроллинг реализован через сдвиг битмапа (Backbuffer), что обеспечивает плавность даже при большом потоке данных.
- Совместимость:
- Поддержка основных управляющих последовательностей VT100/Xterm/ANSI.
- Корректная работа с псевдографикой (Line Drawing) — рамки в mc, htop, ncdu отображаются правильно.
- Поддержка 256 цветов и TrueColor.
- Функциональность:
- Выделение текста мышью (как в Putty/VSCode).
- Буфер обмена (Ctrl+Shift+C / Ctrl+Shift+V).
- Поддержка мыши (клики, скролл) в консольных приложениях (SGR mouse mode).
- Поддержка тем оформления (загрузка из файлов .theme).
- Умный скроллбэк (история команд).
- Delphi 12 Athens (Рекомендуется) — Skia уже встроена, ничего дополнительно устанавливать не нужно.
- Или Delphi 11 Alexandria — требуется установка Skia4Delphi через GetIt.
- Скачайте этот репозиторий.
- Добавьте папку с исходным кодом в Library Path вашей IDE или положите файлы рядом с проектом.
- Включите Skia в вашем проекте:
- Для Delphi 12: В файле проекта .dpr или в коде инициализации убедитесь, что установлено GlobalUseSkia := True;.
- Для старых версий: Правый клик по проекту -> Enable Skia.
Компонент TnbTerminal (наследник TSkPaintBox) можно создавать динамически или использовать в Design-time (если зарегистрировать).
uses
Terminal.Control, Terminal.Theme;
procedure TFormMain.FormCreate(Sender: TObject);
begin
// Создаем терминал
Terminal := TnbTerminal.Create(Self);
Terminal.Parent := LayoutClient;
Terminal.Align := TAlignLayout.Client;
// Настраиваем шрифт (важно использовать моноширинный)
Terminal.FontFamily := 'Consolas';
Terminal.FontSize := 13;
// Подключаем обработчик данных (то, что вводит пользователь)
Terminal.OnData := DoTerminalData;
end;
// Отправка данных на сервер (например, через сокет)
procedure TFormMain.DoTerminalData(const S: string);
begin
MySocket.Send(S);
end;
// Получение данных от сервера
procedure TFormMain.OnSocketRead(const Data: string);
begin
Terminal.WriteText(Data);
end;
Вы можете загружать цветовые схемы из файлов:
Terminal.Theme.LoadThemeFromFile('Solarized-Dark.theme');
Приветствуются любые улучшения! Если вы нашли баг с парсингом ANSI-кодов или хотите добавить новую фичу:
- Форкните репозиторий.
- Создайте ветку (git checkout -b feature/NewFeature).
- Закоммитьте изменения.
- Сделайте Pull Request.