php-tui/term

综合的低级终端控制

0.3.4 2023-12-04 18:42 UTC

This package is auto-updated.

Last update: 2024-09-19 13:50:07 UTC


README

CI

Term Logo

低级终端控制库,深受crossterm 的启发。

目录

安装

$ composer require php-tui/term

要求

我只在 Linux 上测试了这个库。它目前需要 stty 来启用原始模式并检测当前窗口大小。它应该在 MacOS 和 WSL 上工作。

由于我无法在 Windows 上测试,目前不支持原生 Windows。然而,该架构应该支持 Windows,所以如果您想开始,请查看 crossterm 以获取灵感并开始一个 PR。

使用

操作

您可以使用 操作 将数据发送到终端。

<?php

$terminal = Terminal::new();

// queue an action
$terminal->queue(Actions::printString('Hello World'));

// flush the queue to the terminal
$terminal->flush();

// or you can execute it directly
$terminal->execute(Actions::printString('Hello World'));

所有操作都通过 操作 工厂提供。

事件

Term 提供用户事件

while (true) {
    while ($event = $terminal->events()->next()) {
        if ($event instanceof CodedKeyEvent) {
            if ($event->code === KeyCode::Esc) {
                // escape pressed
            }
        }
        if ($event instanceof CharKeyEvent) {
            if ($event->char === 'c' && $event->modifiers === KeyModifiers::CONTROL) {
                // ctrl-c pressed
            }
        }
    }
    usleep(10000);
}

事件如下

  • PhpTui\Term\Event\CharKeyEvent:标准字符键
  • PhpTui\Term\Event\CodedKeyEvent:特殊键,例如 escape、control、page up、arrow down 等
  • PhpTui\Term\Event\CursorPositionEvent:作为对 Actions::requestCursorPosition 的响应。
  • PhpTui\Term\Event\FocusEvent:当获得或失去焦点时
  • PhpTui\Term\Event\FunctionKeyEvent:当按下功能键时
  • PhpTui\Term\Event\MouseEvent:当调用 Actions::enableMouseCapture 时,提供鼠标事件信息。
  • PhpTui\Term\Event\TerminalResizedEvent:终端已调整大小。

终端大小

您可以请求终端大小

<?php

$terminal = Terminal::new();

$size = $terminal->info(Size::class);
if (null !== $size) {
    echo $size->__toString() . "\n";
} else {
    echo 'Could not determine terminal size'."\n";
}

原始模式

原始模式禁用所有默认终端行为,当您希望启用一个完全交互式终端时通常想要启用它。

<?php

$terminal = Terminal::new();
$terminal->enableRawMode();
$terminal->disableRawMode();

务必确保禁用原始模式,否则它将使终端处于几乎无法使用的状态!

解析

此外,Term 提供了一个解析器,可以解析操作发出的任何转义码。

如果您想捕获终端应用程序的输出并将其转换为可以重新绘制在另一种媒体(例如纯文本或 HTML)中的一组操作,这将非常有用。

use PhpTui\Term\AnsiParser;
$actions = AnsiParser::parseString($rawAnsiOutput, true);

测试

Terminal 的所有依赖项都有可测试版本。

<?php

$painter = ArrayPainter::new();
$eventProvider = ArrayEventProvider::fromEvents(
    CharKeyEvent::new('c')
);
$infoProvider = ClosureInformationProvider::new(
    function (string $classFqn): TerminalInformation {
        return new class implements TerminalInformation {};
    }
);
$rawMode = new TestRawMode();

$term = Terminal::new(
    painter: $painter,
    infoProvider: $infoProvider,
    eventProvider: $eventProvider,
    rawMode: $rawMode
);
$term->execute(
    Actions::printString('Hello World'),
    Actions::setTitle('Terminal Title'),
);

echo implode("\n", array_map(
    fn (Action $action) => $action->__toString(),
    $painter->actions()
)). "\n";

请参阅 examples/ 中的示例 testable.php

贡献

针对缺失功能和改进的 PRs 是受欢迎的。