SwiftTerm 是一个 VT100/Xterm 终端模拟器库,适用于可以嵌入到 macOS、iOS 应用程序、基于文本的无头应用程序或其他自定义场景的 Swift 应用程序。它已被用于多个商业 SSH 客户端,包括 Secure Shellfish、La Terminal 和 CodeEdit
查看 API 文档
此仓库包含一个 UI 不可知论的终端模拟器引擎,以及使用 UIKit 的 iOS 前端和使用 AppKit 的 macOS 前端。一个基于 curses 的终端模拟器(用于在控制台应用程序中模拟 xterm)作为 TermKit 库的一部分提供。
示例代码 在 TerminalApp
目录中,有一些用于 Mac 和 iOS 的最小示例应用程序,展示了如何在库中使用它。
配套应用 SwiftTermApp 构建了一个实际的 iOS 应用程序,它使用了这个库,并且比此模块中的测试应用程序更完整,并提供了适当的配置 UI。
这是我最初的 XtermSharp 的移植版本,它本身基于 xterm.js。在这一点上,我认为 SwiftTerm 是比这两者更高级的终端模拟器(除了选择/辅助功能),因为它比它们更好地处理 UTF、Unicode 和字素簇,并且对终端仿真的覆盖更全面。XtermSharp 通常也在努力跟上。
SwiftTerm 库本身包含引擎和前端的源代码。前端根据目标平台有条件地编译。
引擎位于此目录中,而 macOS 的代码位于 Mac
下,iOS 的代码位于 iOS
下。鉴于这两者有很多共同特征,共享代码位于 Apple
下。
SwiftTerm 使用 Swift Package Manager 进行构建,您可以使用此项目或其 fork 的 URL 将库添加到您的项目中。
macOS AppKit NSView 实现 TerminalView
是一个可重用的 NSView 控件,可以通过实现 TerminalViewDelegate
连接到任何源。
我预计常见的情况是托管本地 Unix 命令,所以我包含了 LocalProcessTerminalView
,它是一个将 TerminalView
连接到 Unix 伪终端并在那里运行命令的实现。
有一个等效的 UIKit UIView 实现 TerminalView
,它像其 NSView 同伴一样,是一个可嵌入和可重用的视图,可以通过实现相同的 TerminalViewDelegate 连接到您的应用程序。与在 Mac 上运行的 NSView 情况不同,在 Mac 上运行本地命令是一种常见情况,鉴于 iOS 不提供对进程的访问,最常见的情况是将此终端连接到远程主机。连接到远程系统的最安全方法是使用 SSH。
iOS 和 UIKit 代码共享很多代码,这些代码位于 Apple 目录下。
核心库目前没有提供连接到 SSH 的便捷方法,纯粹是为了避免额外的依赖。但是这个 git 模块引用了一个模块,该模块拉取了一个预编译的 SSH 客户端(Frugghi's SwiftSH),以及 iOS 示例中的一个 UIKitSsshTerminalView
,它将 iOS 的 TerminalView
连接到 SSH 连接。
如果您正在使用 Xcode,则在 TerminalApp 目录中有两个顶级项目,一个用于 Mac,一个用于 iOS,一个名为 "iOSTerminal.xcodeproj",另一个名为 "MacTerminal.xcodeproj"。
这是必需的,因为如果您在项目中有一个 Mac 项目,Xcode 不会为 iOS 提供代码完成。所以我不得不将它们分开。这两个项目都引用了同一个 SwiftTerm 包。
当使用这些项目时,如果您选择终端应用程序,它将运行这个应用程序。要运行测试套件,请选择“SwiftTerm”目标,您可以使用“SwiftTermFuzz”来运行模糊测试器。
您可以使用 swift build
来构建包,并使用 swift test
来运行测试套件 - 但请注意,测试套件期望检出 esctest
目录才能运行。如果您想在本地执行此操作,可以在文件 .github/workflows/swift.yml
中查看我如何在 GitHub 操作上运行这些操作。
如果使用 Xcode,您可以选择“SwiftTerm”项目,然后使用 Command-U 来运行测试套件。
GitHub issues 页面有一个所需功能和增强功能的列表
从长远来看,我还想添加一个 tvOS UIView、一个用于 Linux 的 SwiftGtk 前端。
24 位颜色
Midnight Commander
支持现代应用程序发出的超链接
iOS 支持
Sixel 支持
其他有用的文档
测试套件