ANSITerminal

ANSITerminal 是一个开源的 Swift 库,用于访问 ANSI 终端及其(几乎)所有功能。它包括文本着色、文本样式、光标和屏幕处理以及直接键盘输入。 ANSITerminal 基于标准的 ANSI 功能,这些功能通常在 Unix 终端上受支持,尤其是像 xterm 和 VT-100 兼容的终端。 这个库目前仅支持 Linux 和 macOS,这仅仅是因为 Swift 尚未正式在 Windows 上可用。

更新:
最新版本是 v.0.0.3,发布于 2019 年 5 月 26 日。这里有一个简单的演示,以及一个使用此库制作的简单游戏。祝您玩得开心!:)

用法

使用 ANSITerminal 库非常简单,只需在您的 Swift 程序中放入 import ANSITerminal,您就可以使用此库提供的任何函数或扩展。 使用此库而不是像 ncurses 这样的东西的主要优势在于它不会接管整个屏幕。 您可以使用此库来补充您的通用控制台程序。

使用 Swift Package Manager

ANSITerminal 仅支持通过 Swift Package Manager 进行库分发。 要使用 ANSITerminal,只需在您的项目的 package.swift 文件中添加一个依赖项。 这是来自 ansiDemo 项目的 package.swift 示例。

// swift-tools-version:5.0

import PackageDescription

let package = Package(
    name: "ansiDemo",
    dependencies: [
        .package(url: "https://github.com/pakLebah/ANSITerminal", from: "0.0.3"),
    ],
    targets: [
        .target(
            name: "ansiDemo",
            dependencies: ["ANSITerminal"],
            path: "Sources"),
    ]
)

您只需要添加一个指向 ANSITerminal 的 GitHub 仓库 的包依赖项,并将 "ANSITerminal" 项添加到目标依赖项中。 之后您应该能够在您的 Swift 程序中放入 import ANSITerminal 并享受 ANSI 终端功能。 就这样。

如果您发现缺少您需要的 ANSI 功能,您可以简单地调用 swift package edit ANSITerminal。 SPM 将为您创建一个 ANSITerminal 的本地副本,因此您可以自行添加任何缺失的功能。 每次您构建项目时,Swift 都会引用本地副本而不是原始源。 完成后,别忘了向我发送拉取请求。 我很乐意接受任何人对 ANSITerminal 的任何有用的贡献。

功能

文本着色

ANSI 颜色作为属性通过扩展可用于 String 类型。 要为文本着色,只需在文本后跟颜色名称。 例如,'text'.blue 将在屏幕上产生 text (蓝色文本)*。 要设置文本背景颜色,只需在文本后跟颜色名称,但在前面加上 on 前缀。 例如,'text'.onCyan 将在屏幕上产生 text (青色背景上的黑色文本)。 由于着色作为属性可用于 String,您可以将它们组合起来。 例如,'text'.blue.onCyan 将在屏幕上产生 text (青色背景上的蓝色文本)。 如果您喜欢更具表达力的属性名称,您可能想要为文本颜色使用 as 前缀。 因此,您可以使用 'text'.asBlue 而不是 'text'.blue。 这非常容易!

但是颜色名称属性仅适用于 16 种系统颜色。 大多数 ANSI 终端也支持 256 种颜色。 要使用 256 色调色板,请使用 foreColor(_:) 类型扩展方法来设置文本颜色,并使用 backColor(_:) 来设置文本背景颜色。 您可能还想使用 colors(_: _:),它分别结合了文本颜色和背景颜色。 这些类型方法的工作方式与之前提到的类型属性类似。 由于 256 种颜色太多,无法为每种颜色定义正确且一致的名称,因此您必须使用 256 色调色板的颜色索引。 例如,'text'.foreColor(196) 将在屏幕上产生 text (红色文本)。 与 16 种颜色属性一样,256 种颜色方法也有更具表达力的方法名称,使用 with 前缀。 因此,您也可以使用 'text'.withForeColor(196) 而不是 'text'.foreColor(196)

String 扩展机制仅为文本设置颜色。 文本之后,文本颜色和背景颜色都将设置回默认值。 如果您想要更多地控制该机制,您可以对 16 种颜色系统使用 setColor(fore: back:) 函数,对 256 色调色板使用 setColors(_: _:) 函数。 这些函数不会将颜色恢复为默认值,因此您一定不要忘记调用 setDefault(color: style:) 将 ANSI 属性(颜色或样式)恢复为默认值。 否则,您的终端颜色将保持上次的颜色和样式设置。

以下是 ANSI 终端的默认调色板。 如果您想获取 256 色调色板的颜色编号,您可能需要查找它。

ANSI 调色板

16 色(系统)

216 色(按块)


灰度颜色

文本样式

与文本着色类似,文本样式也作为属性可用于 String 类型。 要设置文本样式,只需在文本后跟样式名称。 例如,'text'.bold 将在屏幕上产生 text'text'.italic 将在屏幕上产生 text,等等。 ANSI 终端上有 10 种样式可用,但并非所有类型的 ANSI 终端都支持所有样式。 幸运的是,normalbolditalicinverse 大多受支持。 因此,如果您想使用其他样式,请确保用户的终端支持它们。

由于颜色和样式都是 ANSI 属性,您也可以在文本中将它们组合起来。 例如,'text'.blue.bold 将在屏幕上产生 text (粗体蓝色文本)。 同样类似于文本着色,还有一个 setStyle(_:) 函数可以固定文本样式,直到您调用 setDefault(color: style:) 函数将 ANSI 属性(颜色和样式)恢复为默认值。

以下是 ANSI 终端上可用的文本样式

光标和屏幕处理

光标相关函数

  1. storeCursorPosition() 用于存储当前光标位置。
  2. restoreCursorPosition() 用于恢复上次保存的光标位置。 请注意,此函数有时会产生副作用,也会将某些终端上的颜色和样式重置为默认值。
  3. cursorOn() 用于使光标可见。
  4. cursorOff() 用于使光标不可见(隐藏)。
  5. moveTo(_: _:) 用于将光标分别定位到给定的 rowcol[umn]
  6. readCursorPosition() → (row: col:) 用于获取当前光标位置。

屏幕相关函数

  1. clearScreen() 用于清除整个屏幕并将光标置于起始位置。
  2. clearLine() 用于清除当前光标位置的整行。
  3. clearToEndOfLine() 用于清除当前光标位置的行到行尾。
  4. scrollRegion(top: bottom:) 用于设置屏幕的滚动区域。
  5. readScreenSize() → (row: col:) 用于获取当前屏幕大小,单位为 rowcol[umn]。 请注意,此函数在模拟终端(例如 VS Code 的集成终端或 repl.it 的 Web 终端)上不受支持。**

键盘输入处理

  1. keyPressed() → Bool 用于检查键盘上是否按下了任何键。
  2. readCode() → Int 用于直接从标准输入中逐个读取键盘输入作为 ASCII 代码。
  3. readChar() → Character 用于直接从标准输入中逐个读取键盘输入作为 Character
  4. readKey() → (code: meta: []) 用于以高级方式读取键盘输入,返回 ASCII 代码和元键(shiftcontrolalt)(如果可用)。 此函数对于复杂的键盘输入(例如箭头键、功能键 (F1..F12) 以及任何其他可能的组合,这些在游戏中很常见)非常重要。

杂项函数

  1. delay(_:) 用于暂停程序执行,单位为毫秒。
  2. clearBuffer(isOut: isIn:) 用于清除标准输入/输出缓冲区。
  3. write(_:... suspend:) 用于将(一堆)文本直接写入标准输出,并带有可选的 suspend 延迟,如果您需要在(一堆)文本后添加 newline,它还具有 writeln(_:... suspend:)
  4. stripAttributes(from:) → String 用于从文本中剥离所有颜色和样式以获取实际文本,这对于在添加颜色/样式获取实际文本的长度可能很有用。
  5. ask(_:) → String 是向用户提问的快捷方式。

我认为这些是通用控制台应用程序中最有用和最常用的函数。 您应该查看源代码文件以查看其余可用的函数。 我将更新文档以使其更完整。 一个简单的演示程序在这里。 我还使用这个库制作了一个简单的控制台游戏,这是一个滑块游戏

如果您在使用此库时遇到任何问题,请随时提交问题。 谢谢您。

________
* GitHub 的 Markdown 不支持通过 CSS 自定义文本颜色。
** XCode 的集成控制台根本不支持 ANSI。