2018-02-07 08:32:40 +03:00
|
|
|
# Wez's Terminal
|
|
|
|
|
2018-02-19 04:23:05 +03:00
|
|
|
A terminal emulator implemented in Rust, using OpenGL ES 2 for rendering.
|
2018-02-07 08:32:40 +03:00
|
|
|
|
2018-02-21 00:50:45 +03:00
|
|
|
[![Build Status](https://travis-ci.org/wez/wezterm.svg?branch=master)](https://travis-ci.org/wez/wezterm)
|
|
|
|
[![codecov](https://codecov.io/gh/wez/wezterm/branch/master/graph/badge.svg)](https://codecov.io/gh/wez/wezterm)
|
|
|
|
|
|
|
|
|
2018-02-20 09:10:59 +03:00
|
|
|
![Screenshot](screenshots/one.png)
|
|
|
|
|
2018-02-20 09:15:11 +03:00
|
|
|
*Screenshot of wezterm on X11, running vim*
|
|
|
|
|
2018-02-07 08:32:40 +03:00
|
|
|
## Quickstart
|
|
|
|
|
2018-02-07 08:55:52 +03:00
|
|
|
* Install `rustup` to get the *nightly* `rust` compiler installed on your system.
|
2018-02-07 08:32:40 +03:00
|
|
|
https://www.rust-lang.org/en-US/install.html
|
2018-02-26 08:09:21 +03:00
|
|
|
* Build in release mode: `rustup run nightly cargo build --release`
|
|
|
|
* Run it via either `rustup run nightly cargo run --release` or `target/release/wezterm`
|
2018-02-07 08:32:40 +03:00
|
|
|
|
2018-02-26 08:09:21 +03:00
|
|
|
You will need a collection of support libraries; the [`get-deps`](get-deps) script will
|
|
|
|
attempt to install them for you. If it doesn't know about your system,
|
|
|
|
[please contribute instructions!](CONTRIBUTING.md)
|
2018-02-07 09:24:36 +03:00
|
|
|
|
|
|
|
```
|
2018-02-23 09:21:13 +03:00
|
|
|
$ curl https://sh.rustup.rs -sSf | sh -s -- --default-toolchain nightly
|
2018-02-21 00:17:23 +03:00
|
|
|
$ git clone --depth=1 --branch=master https://github.com/wez/wezterm.git
|
|
|
|
$ cd wezterm
|
2018-02-25 20:29:43 +03:00
|
|
|
$ sudo ./get-deps
|
2018-02-26 08:09:21 +03:00
|
|
|
$ rustup run nightly cargo build --release
|
|
|
|
$ rustup run nightly cargo run --release
|
2018-02-07 09:24:36 +03:00
|
|
|
```
|
2017-12-07 19:20:29 +03:00
|
|
|
|
|
|
|
## What?
|
|
|
|
|
|
|
|
Here's what I'm shooting for:
|
|
|
|
|
|
|
|
* A terminal escape sequence parser
|
2018-02-07 08:32:40 +03:00
|
|
|
* A model of a terminal screen + scrollback that is OS independent
|
|
|
|
* Textual and GUI rendering of the model
|
|
|
|
* A differential protocol for the model
|
2017-12-07 19:20:29 +03:00
|
|
|
|
|
|
|
This would manifest as a common core that could run as both a textual
|
|
|
|
terminal multiplexer and a gui terminal emulator, where the GUI part
|
|
|
|
could automatically provide a native UI around the remotely multiplexed
|
|
|
|
terminal session.
|
|
|
|
|
2018-02-25 20:36:27 +03:00
|
|
|
## Status / Features - Alpha Quality
|
|
|
|
|
|
|
|
*There may be bugs that cause the terminal to panic. I'd recommend using
|
|
|
|
`tmux` or `screen` to keep your session alive if you are working on something important!*
|
|
|
|
|
|
|
|
Despite the warning above, I've been using `wezterm` as my daily driver since
|
|
|
|
the middle of Feb 2018.
|
2018-02-07 08:32:40 +03:00
|
|
|
|
2018-02-26 08:09:21 +03:00
|
|
|
- [x] Runs on Linux under X (requires OpenGL ES 2)
|
2018-02-07 08:32:40 +03:00
|
|
|
- [x] Scrollback (use mouse wheel and Shift Page{Up|Down})
|
|
|
|
- [x] True Color support
|
2018-02-20 09:15:11 +03:00
|
|
|
- [x] Ligatures, Color Emoji and font fallback
|
2018-02-26 08:09:21 +03:00
|
|
|
- [x] xterm style selection of text with mouse; paste selection via Shift-Insert (bracketed paste is supported!)
|
2018-02-08 07:18:24 +03:00
|
|
|
- [x] SGR style mouse reporting (works in vim and tmux)
|
2018-02-26 08:09:21 +03:00
|
|
|
- [x] Render underline, double-underline, italic, bold, strikethrough
|
2018-02-20 09:15:11 +03:00
|
|
|
- [x] Configuration file to specify fonts and colors
|
|
|
|
- [x] Hyperlinks per: https://gist.github.com/egmontkob/eb114294efbcd5adb1944c9f3cb5feda
|
2018-02-07 08:32:40 +03:00
|
|
|
|
|
|
|
There's a good number of terminal escape sequences that are not yet implemented
|
2018-02-26 08:09:21 +03:00
|
|
|
and that will get fleshed out as the applications I use uncover them, or as folks
|
|
|
|
report them here and raise the priority. Similarly for key mappings.
|
2018-02-07 08:32:40 +03:00
|
|
|
|
|
|
|
Things that I'd like to see happen and that have no immediate priority
|
|
|
|
(contributions to get closer to these are welcomed!)
|
|
|
|
|
2018-02-20 09:15:11 +03:00
|
|
|
- [ ] Run on macOS
|
2018-02-10 02:47:41 +03:00
|
|
|
- [ ] Sixel / iTerm2 graphics protocol support
|
2018-02-07 08:32:40 +03:00
|
|
|
- [ ] Tabs
|
|
|
|
- [ ] Textual renderer. Think `tmux` or `screen`.
|
2018-02-26 08:09:21 +03:00
|
|
|
- [ ] Run on Linux with Wayland (use XWayland for now; See https://github.com/tomaka/winit/issues/306 for upstream blockers)
|
2018-02-20 09:15:11 +03:00
|
|
|
- [ ] Run on Windows
|
2018-02-07 18:51:04 +03:00
|
|
|
|
2018-02-10 02:47:41 +03:00
|
|
|
|
2018-02-07 18:51:04 +03:00
|
|
|
## Configuration
|
|
|
|
|
|
|
|
`wezterm` will look for a TOML configuration file in `$HOME/.config/wezterm/wezterm.toml`,
|
|
|
|
and then in `$HOME/.wezterm.toml`.
|
|
|
|
|
|
|
|
Configuration is currently very simple and the format is considered unstable and subject
|
2018-02-10 19:43:36 +03:00
|
|
|
to change. The code for configuration can be found in [`src/config.rs`](src/config.rs).
|
2018-02-07 18:51:04 +03:00
|
|
|
|
|
|
|
I use the following in my `~/.wezterm.toml`:
|
|
|
|
|
|
|
|
```
|
|
|
|
font_size = 10
|
2018-02-08 07:18:24 +03:00
|
|
|
font = { fontconfig_pattern = "Operator Mono SSm Lig Medium" }
|
2018-02-10 20:43:54 +03:00
|
|
|
# How many lines of scrollback to retain
|
|
|
|
scrollback_lines = 3500
|
2018-02-07 20:23:24 +03:00
|
|
|
|
|
|
|
[[font_rules]]
|
|
|
|
italic = true
|
2018-02-08 07:18:24 +03:00
|
|
|
font = { fontconfig_pattern = "Operator Mono SSm Lig Medium:style=Italic" }
|
|
|
|
|
|
|
|
[[font_rules]]
|
|
|
|
italic = true
|
|
|
|
intensity = "Bold"
|
|
|
|
font = { fontconfig_pattern = "Operator Mono SSm Lig:style=Italic:weight=bold" }
|
|
|
|
|
|
|
|
[[font_rules]]
|
|
|
|
intensity = "Bold"
|
2018-02-10 19:36:34 +03:00
|
|
|
[font_rules.font]
|
|
|
|
fontconfig_pattern= "Operator Mono SSm:weight=bold"
|
2018-02-10 19:37:40 +03:00
|
|
|
# if you liked xterm's `boldColor` setting, this is how you do it in wezterm,
|
|
|
|
# but you can apply it to any set of matching attributes!
|
2018-02-10 19:36:34 +03:00
|
|
|
foreground = "tomato"
|
2018-02-08 07:18:24 +03:00
|
|
|
|
|
|
|
[[font_rules]]
|
|
|
|
intensity = "Half"
|
|
|
|
font = { fontconfig_pattern = "Operator Mono SSm Lig Light" }
|
2018-02-07 18:51:04 +03:00
|
|
|
```
|
|
|
|
|
|
|
|
The default configuration will attempt to use whichever font is returned from
|
|
|
|
fontconfig when `monospace` is requested.
|
2018-02-10 19:16:20 +03:00
|
|
|
|
|
|
|
### Colors
|
|
|
|
|
|
|
|
You can configure colors with a section like this. In addition to specifying
|
|
|
|
SVG/CSS3 color names, you can use `#RRGGBB` to specify a color code using the
|
2018-02-10 19:42:10 +03:00
|
|
|
usual hex notation; eg: `#000000` is equivalent to `black`:
|
2018-02-10 19:16:20 +03:00
|
|
|
|
|
|
|
```
|
|
|
|
[colors]
|
|
|
|
foreground = "silver"
|
|
|
|
background = "black"
|
2018-02-23 18:52:14 +03:00
|
|
|
cursor_bg = "springgreen"
|
2018-02-10 19:16:20 +03:00
|
|
|
ansi = ["black", "maroon", "green", "olive", "navy", "purple", "teal", "silver"]
|
|
|
|
brights = ["grey", "red", "lime", "yellow", "blue", "fuchsia", "aqua", "white"]
|
|
|
|
```
|
2018-02-19 19:41:54 +03:00
|
|
|
|
|
|
|
## Performance
|
|
|
|
|
|
|
|
While ultimate speed is not the main goal, performance is important!
|
|
|
|
Using the GPU to render the terminal contents helps keep CPU usage down
|
|
|
|
and the output feeling snappy.
|
|
|
|
|
|
|
|
Here's a very basic benchmark:
|
|
|
|
|
|
|
|
```
|
|
|
|
$ find /usr > /tmp/usr-files.txt
|
2018-02-19 21:59:09 +03:00
|
|
|
$ wc -l /tmp/usr-files.txt
|
|
|
|
364885 /tmp/usr-files.txt
|
|
|
|
$ time cat /tmp/usr-files.txt
|
2018-02-19 19:41:54 +03:00
|
|
|
```
|
|
|
|
|
|
|
|
And a comparison between some terminal emulators on my system; they were each
|
|
|
|
set to 80x24 with 3500 lines of scrollback. `alacritty` has no scrollback.
|
|
|
|
|
2018-02-19 21:34:05 +03:00
|
|
|
| Terminal | Time (seconds) |
|
|
|
|
|-----------------|-------|
|
|
|
|
| xterm | 9.863 |
|
|
|
|
| Gnome Terminal | 2.391 |
|
2018-02-19 19:41:54 +03:00
|
|
|
| Terminator 1.91 | 2.319 |
|
2018-02-19 22:00:49 +03:00
|
|
|
| **wezterm** | 0.940 |
|
2018-02-19 21:34:05 +03:00
|
|
|
| kitty | 0.899 |
|
|
|
|
| urxvt | 0.615 |
|
|
|
|
| alacritty | 0.421 |
|