1
1
mirror of https://github.com/wez/wezterm.git synced 2024-11-23 23:21:08 +03:00
wezterm/README.md

166 lines
5.3 KiB
Markdown
Raw Normal View History

# Wez's Terminal
A terminal emulator implemented in Rust, using OpenGL ES 2 for rendering.
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*
## Quickstart
2018-02-07 08:55:52 +03:00
* Install `rustup` to get the *nightly* `rust` compiler installed on your system.
https://www.rust-lang.org/en-US/install.html
* Build in release mode: `cargo build --release`
* Run it via either `cargo run --release` or `target/release/wezterm`
2018-02-21 00:50:45 +03:00
You will need a collection of support libraries; the example below shows which
deps are needed for ubuntu systems:
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
$ sudo ./get-deps
2018-02-21 00:17:23 +03:00
$ cargo build --release
2018-02-23 09:21:13 +03:00
$ 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
* 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.
These are in the done/doing soon category:
2018-02-20 09:15:11 +03:00
- [x] Runs on Linux with XCB and OpenGL ES 2
- [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-08 07:18:24 +03:00
- [x] Paste selection via Shift-Insert (bracketed paste is supported!)
- [x] SGR style mouse reporting (works in vim and tmux)
2018-02-10 02:47:41 +03:00
- [x] xterm style selection of text with mouse
2018-02-11 08:42:55 +03:00
- [x] Render 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
- [x] Command line argument parsing instead of launching user shell
There's a good number of terminal escape sequences that are not yet implemented
and that will get fleshed out as the applications I use uncover them.
Similarly for key mappings.
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
- [ ] Tabs
- [ ] Textual renderer. Think `tmux` or `screen`.
2018-02-20 09:15:11 +03:00
- [ ] Run on Linux with Wayland (use XWayland for now)
- [ ] Run on Windows
2018-02-10 02:47:41 +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).
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
[[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"
[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!
foreground = "tomato"
2018-02-08 07:18:24 +03:00
[[font_rules]]
intensity = "Half"
font = { fontconfig_pattern = "Operator Mono SSm Lig Light" }
```
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"
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
$ 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 |