1
1
mirror of https://github.com/wez/wezterm.git synced 2024-09-20 11:17:15 +03:00
A GPU-accelerated cross-platform terminal emulator and multiplexer written by @wez and implemented in Rust
Go to file
Wez Furlong 4ce67c7f9a Use the palette crate for blending
I wasn't pleased with how text was rendering on a colored background,
and after some research I discovered that I was neglecting to convert
from sRGB to a linear RGB colorspace, and that this was causing the
blending to have inaccurate results.

This diff pulls in the palette crate to handle the heavy lifting.
It doesn't appear to have any especially fast optimizations for this
though, which is a shame because the blending code I was using
previously was largely integer math with few branches.  The colorspace
conversion has several floating point operations and branches that
are unavoidable :-/

We run a bit hotter on the CPU but the results are much more pleasing
to the eye.
2018-02-09 23:32:35 -08:00
src Use the palette crate for blending 2018-02-09 23:32:35 -08:00
term fixup alt-KEY to send escape rather than set bits 2018-02-09 16:03:09 -08:00
.gitignore Add fontconfig support to locate fonts 2018-01-15 17:32:31 -08:00
.rustfmt.toml avoid .bk files when rustfmt'ing 2018-01-27 14:20:15 -08:00
.travis.yml Meh, TravisCI Ubuntu is too old. 2018-02-06 22:24:36 -08:00
Cargo.toml Use the palette crate for blending 2018-02-09 23:32:35 -08:00
LICENSE.md flesh out some details prior to pushing to github 2018-02-06 21:32:40 -08:00
README.md Add double click to select a word 2018-02-09 15:47:41 -08:00

Wez's Terminal

A terminal emulator implemented in Rust.

Quickstart

  • 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

You will need a collection of support libraries; important to note is that your harfbuzz library must have support for hb_ft_font_create_referenced; older linux distributions don't have this!

$ sudo apt-get install -y libxcb-icccm4-dev libxcb-ewmh-dev \
    libxcb-image0-dev libxcb-keysyms1-dev libharfbuzz-dev \
    libfontconfig1-dev libfreetype6-dev

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

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.

Status / Features

These are in the done/doing soon category:

  • Runs on Linux with XCB
  • Scrollback (use mouse wheel and Shift Page{Up|Down})
  • True Color support
  • Color Emoji and font fallback
  • Paste selection via Shift-Insert (bracketed paste is supported!)
  • SGR style mouse reporting (works in vim and tmux)
  • xterm style selection of text with mouse
  • Configuration file to specify fonts and colors (in progress)
  • Render underline, italic, bold, strikethrough
  • Command line argument parsing instead of launching user shell
  • Hyperlinks see: https://gist.github.com/egmontkob/eb114294efbcd5adb1944c9f3cb5feda

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!)

  • Runs on macOS
  • Sixel / iTerm2 graphics protocol support
  • Tabs
  • Textual renderer. Think tmux or screen.
  • Runs on Linux with Wayland (use XWayland for now)
  • Runs on Windows

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 to change. The code for configuration can be found in src/config.rs.

I use the following in my ~/.wezterm.toml:

font_size = 10
font = { fontconfig_pattern = "Operator Mono SSm Lig Medium" }

[[font_rules]]
italic = true
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 = { fontconfig_pattern = "Operator Mono SSm:weight=bold" }

[[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.