gdamore/tcell
GitHub: gdamore/tcell
Tcell 是一个纯 Go 实现的终端 UI 库,为文本终端应用提供基于单元格的视图渲染和丰富的输入处理能力。
Stars: 5203 | Forks: 364
# Tcell
_Tcell_ 是一个 _Go_ 包,为文本终端(如 _XTerm_)提供基于单元格的视图。
它的灵感来源于 _termbox_,但包含了许多额外的改进。
## 教程
这里提供了一份简短但仍有些粗糙的[教程](TUTORIAL.md)。
## 示例
我们的[画廊](https://github.com/gdamore/tcell/wikis/Gallery/)中展示了许多示例。
那是一个 wiki,如果您有想要展示的内容,请务必提交更新。
在 `./demos` 目录以及 `./_demos` 中也有一些演示程序。
## 更高的可移植性
_Tcell_ 可移植到各种不同的系统,并且是纯 Go 实现的,完全不需要 CGO。
_Tcell_ 支持由 golang 官方支持的主流系统。
遵循 Go 的支持政策,_Tcell_ 官方仅支持当前(“stable”)版本的 Go,以及紧接其前的(“oldstable”)版本。这项政策是必要的,以确保我们能够更新依赖项以获取安全修复和新功能,同时允许我们采用仅在较新版本的 Go 中支持的更改(例如库和语言特性)。
## 丰富的 Unicode 与非 Unicode 支持
如果您的终端支持,_Tcell_ 提供对 Unicode 的增强支持,包括宽字符和字素簇。
它还可以在 Unicode locale 之间进行转换,以便程序在内部使用 UTF-8 进行处理,并在其他 locale 下获得合理的输出。
_Tcell_ 在输入和输出时都会尽力转换为本地原生字符。
在输出时,_Tcell_ 甚至会利用备用字符集来辅助绘制某些特定字符。
## 更好的键盘支持
_Tcell_ 还更全面地支持某些终端可以发送的大量特殊键。在现代终端模拟器上,我们还可以支持丰富的修饰键组合,并且能够区分 CTRL-I 和 TAB 等按键。(这确实需要终端模拟器支持现代键盘协议之一。)
## 更好的鼠标支持
_Tcell_ 支持增强的鼠标跟踪模式,因此如果您的终端支持,您的应用程序可以接收常规的鼠标移动事件、点击拖拽以及滚轮事件。
## 处理 Unicode
和 Go 一样,_Tcell_ 内部使用 UTF-8。
但是,_Tcell_ 了解如何利用 `golang.org/x/text/encoding` 包的功能,在其他字符集之间进行转换。
您的应用程序必须自行提供它们,因为包含最常见字符集的完整集合会使程序膨胀约 2 MB。
如果您不想麻烦,并且想要包含所有字符集,请参阅 `encoding` 子目录。
## 宽字符与组合字符
`Put()` API 接受一个合法的 UTF-8 字符串,并显示其中的第一个字素簇(可能由多个 rune 组成)。
它返回实际显示的宽度,可用于推进下一个显示字素的列位置。或者,您可以使用 `PutStr()` 或 `PutStrStyled()` 来显示单行文本(将在屏幕边缘被裁剪)。
如果在紧邻宽字符的单元格中直接显示第二个字符(偏移量为 1 而不是 2),则结果是未定义的。
## 颜色
_Tcell_ 采用 ANSI/XTerm 调色板以支持多达 256 种颜色,尽管诸如旧版 ANSI 终端等可能仅支持 8 种颜色。
## 24 位色
_Tcell_ _支持 24 位色!_(当然,前提是您的终端支持。)
有几种方法可以启用(或禁用)24 位色。
- 您可以通过将 `COLORTERM` 环境变量设置为 `truecolor` 来强制启用。支持 24 位色的终端模拟器通常会设置此环境变量。
- 在 Windows 上,默认假定支持 24 位色。(所有现代 Windows 终端模拟器均支持此功能。)
- 如果您将 `TERM` 环境变量设置为带有 `-truecolor` 或 `-direct` 后缀的值,则会假定采用与 XTerm 和 ECMA-48 兼容的 24 位色。
- 您可以通过在环境中设置 `TCELL_TRUECOLOR=disable` 来禁用 24 位色。
使用 24 位色时,程序将显示程序员预期的颜色,从而覆盖用户可能在其终端模拟器中设置的任何“`themes`”。(在某些情况下,精确的色彩保真度比遵循主题更重要。而在其他情况下,例如仅使用少数颜色的典型文本应用程序,遵循用户设置的主题则更为理想。)
## 终端覆盖设置
_Tcell_ 通常会自动协商终端功能,但某些终端模拟器对这些查询的响应不正确。当自动检测路径不可靠时,这些环境变量为用户提供了手动干预的手段:
- `TCELL_KEYBOARD_PROTOCOL=auto|legacy|kitty|win32|xterm` 强制指定键盘报告协议。
- `TCELL_NEGOTIATE=auto|disable` 在终端响应本身存在问题时,禁用启动时的功能协商。
- `TCELL_MOUSE=auto|disable` 阻止应用程序启用终端鼠标报告。
应用程序也可以选择使用 `OptKeyboardProtocol` 指定键盘协议,或使用 `OptNegotiation` 禁用启动协商。环境变量具有优先权,因此用户可以在不修改应用程序的情况下摆脱终端行为异常的困扰。
## 性能
我们已经进行了合理的尝试,以尽量减少向终端发送的数据量,避免重复的序列或在刷新更新时重复绘制同一个单元格。
## 鼠标支持
在大多数终端模拟器以及 Windows 上,均支持鼠标跟踪、鼠标按键,甚至是滚轮鼠标。
## 括号粘贴
支持此功能的终端可以使用括号粘贴。
详情请参阅 `EnablePaste()`。
## v3 版本中的破坏性变更
_Tcell_ 版本 3 中有许多更改,这些更改破坏了与版本 2 和版本 1 的兼容性。
您的应用程序几乎肯定需要进行一些微小的更新才能在版本 3 上运行。
请查阅 [CHANGESv3](CHANGESv3.md) 文档以获取列表。
## 平台
### POSIX (Linux, FreeBSD, macOS, Solaris 等)
在主流平台上,所有功能均使用纯 Go 实现。
对于冷门平台(例如 zOS 或 AIX),我们仅在力所能及的范围内提供支持。欢迎提交 Pull Request 来修复发现的任何问题!
### Windows
支持现代 Windows 系统。请参阅 [README-windows](README-windows.md) 文档以获取更详细的信息。
### WASM
支持 WASM,但需要进行 [README-wasm](README-wasm.md) 中详述的额外设置。
### Plan 9
我们对 Plan 9 提供力所能及的支持。请参阅 [README-plan9](README-plan9.md) 文档以获取更多信息。
### 商业支持
_Tcell_ 是完全免费的,但如果您想获得商业、专业的支持,有以下几种选择:
- [TideLift](https://tidelift.com/) 订阅包含对 _Tcell_ 以及许多其他开源包的支持。
- [Staysail Systems Inc.](mailto:info@staysail.tech) 按小时提供直接支持以及围绕 _Tcell_ 的定制开发。标签:EVTX分析, Go, Ruby工具, TUI, 开发库, 日志审计, 终端UI