Skip to content

VT100/Xterm Terminal emulator in Swift

License

Notifications You must be signed in to change notification settings

carabina/SwiftTerm

 
 

Repository files navigation

Swift

SwiftTerm

SwiftTerm is a VT100/Xterm terminal emulator for Swift applications that can be embedded into macOS or iOS applications.

This repository contains both the terminal emulator engine, as well as concrete implementation for iOS using UIKit, and macOS using AppKit.

Check the API Documentation

The macOS AppKit NSView implemention TerminalView is a reusable NSView control that can be connected to any source by implementing the TerminalViewDelegate.
I anticipate that a common scenario will be to host a local Unix command, so I have included LocalProcessTerminalView which is an implementation that connects the TerminalView to a Unix pseudo-terminal and runs a command there.

There is an equivalent UIKit UIVIew implementation for TerminalView which like its NSView companion is an embeddable and reusable view that can be connected to your application by implementing the same TerminalViewDelegate. Unlike the NSView case running on a Mac, where a common scenario will be to run local commands, given that iOS does not offer access to processes, the most common scenario will be to wire up this terminal to a remote host. And the safest way of connecting to a remote system is with SSH.

The core library currently does not provide a convenient way to connect to SSH, purely to avoid the additional dependency. But this git module references a module that pulls a precompiled SSH client (Frugghi's SwiftSH), along with a UIKitSsshTerminalView in the iOS sample that that connects the TerminalView for iOS to an SSH connection.

The iOS and UIKit code share a lot of the code, that code lives under the Apple directory.

Both of these rely on the terminal engine (implemented in class Terminal). The engine itself does not have a user interface, nor does it take input, nor does it know how to connect to an actual process, those are provided by higher levels.

In the longer term, I want to also add a tvOS UIView, a SwiftGtk front-end for Linux, as well as an implementation for my Swift console toolkit TermKit/

This is a port of my original XtermSharp, which was itself based on xterm.js. At this point, I consider SwiftTerm to be a more advanced terminal emulator that both of those (modulo Selection/Accessibility) as it handles UTF, Unicode and grapheme clusters better than those and has a more complete coverage of terminal emulation. XtermSharp is generally attempting to keep up.

Features

  • Pretty decent terminal emulation, on or better than XtermSharp and xterm.js (and more comprehensive in many ways)
  • Unicode rendering (including Emoji, and combining characters and emoji)
  • Reusable and pluggable engine allows multiple user interfaces to be built on top of it.
  • Selection engine (with macOS support in the view)
  • Supports colors (ANSI, 256, TrueColor)
  • Supports mouse events
  • Supports terminal resizing operations (controled by remote host, or locally)
  • Hyperlinks in terminal output
  • AppKit, UIKit front-ends
  • Local process and SSH connection support (some assembly required for the last one)
  • Proper CoreText rendering can munch through the harded Unicode test suites.
  • Seems pretty fast to me

Pending Work

GitHub issues has a list of desired features and enhancements

Resources

Additional and useful documents:

Test suites:

  • VTTest - old, but still good
  • EscTest - fantastic: George Nachman, the author of iTerm, created this test suite, and it became a FreeDesktop standard. Since then, Thomas E. Dickey, the xterm maintainer and maintainer of many text apps has contributed to this effort.

Screenshots

24 Bit Color

24 bit color

Midnight Commander

Screen Shot 2020-04-12 at 12 17 49 AM

Solid UTF-8 support, excellent rendering: Screen Shot 2020-04-22 at 11 25 30 PM

Screen Shot 2020-04-22 at 11 25 24 PM

Supports hyperlinks emitted by modern apps:

image

iOS support:

image

Screenshots

Authors

  • Thanks go to the xterm.js developers that originally wrote a terminal emulator that was licensed under a licenze that allowed for maximum reuse.
  • Marcin Krzyzanowski who masterfully improved and curated the rendering engine on AppKit/CoreText to be the glorious renderer that it is today - and for his contributions to the rendering engin
  • Greg Munn that did a lot of work in XtermSharp to support the needs of Visual Studio for Mac
  • Miguel de Icaza -me- who have been looking for an excuse to write some Swift code.

About

VT100/Xterm Terminal emulator in Swift

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Swift 99.8%
  • Makefile 0.2%