# crossterm-cj **Repository Path**: iJetLi/crossterm-cj ## Basic Information - **Project Name**: crossterm-cj - **Description**: rust crossterm的cangjie实现。 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-06-24 - **Last Updated**: 2026-06-29 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # crossterm 一个基于[仓颉](https://developer.huawei.com/consumer/cn/cangjie/) 1.1.3 语言的跨平台终端操作库,从 [crossterm](https://github.com/crossterm-rs/crossterm) 0.29.0 移植而来。 [English](README.md) ## 功能特性 - **光标** — 移动、显示、隐藏、保存/恢复光标位置、设置光标样式 - **样式** — 前景/背景颜色(ANSI、256色、RGB)、文本属性(粗体、斜体、下划线变体)、超链接 - **事件** — 键盘、鼠标、窗口大小变化、焦点、粘贴事件,支持 poll/read API - **终端** — 原始模式、终端大小、窗口大小、清屏、滚动、调整大小 - **TTY** — stdin/stdout/stderr 的 isatty 检测 - **剪贴板** — OSC 52 剪贴板支持 - **ANSI 支持** — 完整的 ANSI 转义序列生成,与 Rust crossterm 字节级兼容 ## 环境要求 - 仓颉 SDK 1.1.3+(cjpm 构建系统) - Windows 或 Unix 平台 ## 快速开始 在 `cjpm.toml` 中添加依赖: ```toml [dependencies] crossterm = { git = "https://gitee.com/iJetLi/crossterm-cj" } ``` ### 示例:轮询和读取事件 ```cangjie package my_app import crossterm.* main(): Int64 { enable_raw_mode() try { exec([EnableMouseCapture()]) var done = false while (!done) { if (poll(1000)) { match (read()) { case Some(Event.Key(ke)) => if (ke.code == KeyCode.Esc) { done = true } case _ => () } } else { println(".") } } exec([DisableMouseCapture()]) } finally { disable_raw_mode() } 0 } ``` ### 示例:样式化输出 ```cangjie import crossterm.* exec([ SetForegroundColor(Color.Red), SetAttribute(Attribute.Bold), ]) println("粗体红色文本") exec([ResetColor()]) ``` ## 示例程序 | 示例 | 说明 | |------|------| | `event_poll_read` | 带超时的轮询/读取键盘和鼠标事件 | | `event_read` | 阻塞式事件读取 | | `event_read_char_line` | 读取字符和行 | | `event_match_modifiers` | 匹配按键修饰符组合 | | `key_display` | 显示按键码 | | `is_tty` | 检查 stdin/stdout 是否为 TTY | | `copy_to_clipboard` | OSC 52 剪贴板复制 | | `stderr` | 向 stderr 写入样式化输出 | | `link` | 终端超链接 | | `interactive_demo` | 完整的交互式演示(光标、颜色、属性) | 运行示例: ```bash cd examples/event_poll_read cjpm run ``` ## 测试 ```bash cjpm test ``` 178 个单元测试,覆盖光标、样式、事件、终端、类型、宏、Unix ANSI 解析器和事件过滤器模块。 ## 项目结构 ``` src/ lib.cj # 库入口 macros.cj # CSI/OSC 辅助函数、Command 接口、queue/execute types.cj # Color、Attribute、ContentStyle、StyledContent cursor.cj # 光标命令 style.cj # 样式命令、颜色格式化 event.cj # 事件类型、poll/read API event_internal.cj # InternalEvent、Filter、EventSource、InternalEventReader event_timeout.cj # PollTimeout event_stream.cj # EventStream(异步) terminal.cj # 终端命令、原始模式、大小 utils.cj # is_tty、剪贴板、环境变量辅助 sys_windows.cj # Windows WinAPI FFI 绑定 sys_windows_parse.cj # Windows 键盘/鼠标事件解析 sys_unix_parse.cj # Unix ANSI 转义序列解析器 sys_unix_terminal.cj # Unix 终端操作(termios/ioctl) *_test.cj # 单元测试 ``` ## 与 Rust crossterm 的兼容性 这是 crossterm 0.29.0 的忠实移植。所有 ANSI 转义序列与原版 Rust 实现字节级兼容。由于仓颉语言限制,存在以下差异: - `foreign func` 替代 Rust 的 FFI;Unix 系统调用在 Windows 上使用 stub 实现 - 未使用 `@C struct` 处理 termios/winsize;改用原始 `CPointer` 字节操作 - 位取反 `~x` 替换为 `!x` - 枚举变体名与类名冲突时重命名(如 `KbdEnhFlags`) ## 许可证 MIT