hide:

  • toc

WezTerm is a powerful cross-platform terminal emulator and multiplexer written by @wez and implemented in Rust

Screenshot

Features

Looking for a configuration reference?

These docs are searchable: press S or click on the magnifying glass icon to activate the search function!

Screenshot

Screenshot of wezterm on macOS, running vim

hide:

  • toc

Available Features

WezTerm provides a searchable scrollback buffer with a configurable maximum size limit that allows you to review information that doesn't fit in the physical window size. As content is printed to the display the display may be scrolled up to accommodate newly added lines. The scrolled lines are moved into the scrollback buffer and can be reviewed by scrolling the window up or down.

This section describes working with the scrollback and discusses some configuration options; be sure to read the configuration docs to learn how to change your settings!

Controlling the scrollback size

This value serves as an upper bound on the number of lines. The larger this value, the more memory is required to manage the tab. If you have a lot of long lived tabs then making this value very large may put some pressure on your system depending on the amount of RAM you have available.

-- How many lines of scrollback you want to retain per tab
config.scrollback_lines = 3500

Clearing the scrollback buffer

By default, CTRL-SHIFT-K and CMD-K will trigger the ClearScrollback action and discard the contents of the scrollback buffer. There is no way to undo discarding the scrollback.

See the ClearScrollback docs for information on rebinding this key.

Enable/Disable scrollbar

You can control whether WezTerm displays a scrollbar via your configuration file:

-- Enable the scrollbar.
-- It will occupy the right window padding space.
-- If right padding is set to 0 then it will be increased
-- to a single cell width
config.enable_scroll_bar = true

You may change the color of the scrollbar if you wish!

Scrolling without a scrollbar

By default, SHIFT-PageUp and SHIFT-PageDown will adjust the viewport scrollback position by one full screen for each press.

See the ScrollByPage docs for more information on this key binding assignment.

Searching the scrollback

By default, CTRL-SHIFT-F and CMD-F (F for Find) will activate the search overlay in the current tab.

When the search overlay is active the behavior of wezterm changes:

  • Typing (or pasting) text will populate the search pattern in the bar at the bottom of the screen.
  • Text from the scrollback that matches the search pattern will be highlighted and the number of matches shown in the search bar.
  • The bottom-most match will be selected and the viewport scrolled to show the selected text.
  • Enter, UpArrow and CTRL-P will cause the selection to move to any prior matching text.
  • PageUp will traverse to previous matches one page at a time.
  • CTRL-N and DownArrow will cause the selection to move to any next matching text.
  • PageDown will traverse to the next match one page at a time.
  • CTRL-R will cycle through the pattern matching mode; the initial mode is case-sensitive text matching, the next will match ignoring case and the last will match using the regular expression syntax described here. The matching mode is indicated in the search bar.
  • CTRL-U will clear the search pattern so you can start over.
  • CTRL-SHIFT-C will copy the selected text to the clipboard.
  • Escape will cancel the search overlay, leaving the currently selected text selected with the viewport scrolled to that location.

Configurable search mode key assignments

{{since('20220624-141144-bd1b7c5d')}}

The key assignments for search mode are specified by the search_mode Key Table.

You may use wezterm.gui.default_key_tables to obtain the defaults and extend them. In earlier versions of wezterm there wasn't a way to override portions of the key table, only to replace the entire table.

The default configuration at the time that these docs were built (which may be more recent than your version of wezterm) is shown below.

You can see the configuration in your version of wezterm by running wezterm show-keys --lua --key-table search_mode.

{% include "examples/default-search-mode-key-table.markdown" %}

(Those assignments reference CopyMode because search mode is a facet of Copy Mode).

Configuring Saved Searches

{{since('20200607-144723-74889cd4')}}

If you find that you're often searching for the same things then you may wish to assign a keybinding to trigger that search.

For example, if you find that you're frequently running git log and then reaching for your mouse to copy and paste a relevant git commit hash then you might like this:

config.keys = {
  -- search for things that look like git hashes
  {
    key = 'H',
    mods = 'SHIFT|CTRL',
    action = wezterm.action.Search { Regex = '[a-f0-9]{6,}' },
  },
}

With that in your config you can now:

  • CTRL-SHIFT-H to highlight all the git hashes and select the closest one to the bottom of the screen.
  • Use ENTER/CTRL-N/CTRL-P to cycle through the git hashes
  • CTRL-SHIFT-C to copy
  • Escape
  • CTRL-SHIFT-V (or SHIFT-Insert) to Paste

without needing to reach for your mouse.

See the Search action docs for more information on using the Search action.

{{since('20210502-154244-3f7122cb')}}

Quick Select mode allows you to quickly highlight text that matches commonly copied patterns, select a match by typing a one-or-two character prefix and copy it to the clipboard.

The QuickSelect key assignment is used to enter quick select mode; it is bound to CTRL-SHIFT-SPACE by default.

When quick select mode is activated, the terminal is searched for items that match the patterns defined by the quick_select_patterns configuration combined with a default set of patterns that match things such as URL and path fragments, git hashes, ip addresses and numbers.

Matches are highlighted and shown with a one or two character prefix derived from the quick_select_alphabet configuration. The colors of the highlighted text can be configured.

The bottom of the screen shows your input text along with a hint as to what to do next; typing in a highlighted prefix will cause that text to be selected and copied to the clipboard, and quick select mode will be cancelled.

Typing in the uppercase form of the prefix will copy AND paste the highlighted text, and cancel quick select mode.

Pressing ESCAPE will cancel quick select mode.

Screenshot demonstrating the quickselect text highlights

{{since('20200607-144723-74889cd4')}}

Copy mode allows you to make selections using the keyboard; no need to reach for your mouse or trackpad. Copy mode is similar to quick select mode but is geared up for describing selections based on keyboard control, whereas quick select mode is used to quickly select and copy commonly used patterns. The colors of the highlighted/selected text can be configured.

The ActivateCopyMode key assignment is used to enter copy mode; it is bound to CTRL-SHIFT-X by default.

When copy mode is activated, the title is prefixed with "Copy Mode" and the behavior of the tab is changed; keyboard input now controls the cursor and allows moving it through the scrollback, scrolling the viewport as needed, in a style similar to that of the Vim editor.

Move the cursor to the start of the region you wish to select and press v to toggle selection mode (it is off by default), then move the cursor to the end of that region. You can then use Copy (by default: CTRL-SHIFT-C) to copy that region to the clipboard.

Key Assignments

The default key assignments in copy mode are as follows:

ActionKey Assignment
Activate copy modeCtrl + Shift + X
Copy and exit copy modey
Exit copy modeEsc
Ctrl + C
Ctrl + G
q
Cell selectionv
Line selectionShift + V
Rectangular selectionCtrl + V {{since('20220624-141144-bd1b7c5d', inline=True)}}
Move LeftLeftArrow
h
Move DownDownArrow
j
Move UpUpArrow
k
Move RightRightArrow
l
Move forward one wordAlt + RightArrow
Alt + F
Tab
w
Move backward one wordAlt + LeftArrow
Alt + B
Shift + Tab
b
Move forward one word ende {{since('20230320-124340-559cb7b0', inline=True)}}
Move to start of this line0
Home
Move to start of next lineEnter
Move to end of this line$
End
Move to start of indented lineAlt + M
^
Move to bottom of scrollbackShift + G
Move to top of scrollbackg
Move to top of viewportShift + H
Move to middle of viewportShift + M
Move to bottom of viewportShift + L
Move up one screenPageUp
Ctrl + B
Move up half a screenCtrl + U {{since('20230320-124340-559cb7b0', inline=True)}}
Move down one screenPageDown
Ctrl + F
Move down half a screenCtrl + D {{since('20230320-124340-559cb7b0', inline=True)}}
Move to other end of the selectiono
Move to other end of the selection horizontallyShift + O (useful in Rectangular mode)

Configurable Key Assignments

{{since('20220624-141144-bd1b7c5d')}}

The key assignments for copy mode are specified by the copy_mode Key Table.

You may provide your own definition of this key table if you wish to customize it.

You may use wezterm.gui.default_key_tables to obtain the defaults and extend them. In earlier versions of wezterm there wasn't a way to override portions of the key table, only to replace the entire table.

The default configuration at the time that these docs were built (which may be more recent than your version of wezterm) is shown below.

You can see the configuration in your version of wezterm by running wezterm show-keys --lua --key-table copy_mode.

{% include "examples/default-copy-mode-key-table.markdown" %}

wezterm has support for both implicit and explicit hyperlinks.

Implicit hyperlinks are produced by running a series of rules over the output displayed in the terminal to produce a hyperlink. There is a default rule to match URLs and make them clickable, but you can also specify your own rules to make your own links.

As an example, at my place of work many of our internal tools use T123 to indicate task number 123 in our internal task tracking system. It is desirable to make this clickable, and that can be done with the following configuration in your ~/.wezterm.lua:

local wezterm = require 'wezterm'
local config = {}

-- Use the defaults as a base
config.hyperlink_rules = wezterm.default_hyperlink_rules()

-- make task numbers clickable
-- the first matched regex group is captured in $1.
table.insert(config.hyperlink_rules, {
  regex = [[\b[tt](\d+)\b]],
  format = 'https://example.com/tasks/?t=$1',
})

-- make username/project paths clickable. this implies paths like the following are for github.
-- ( "nvim-treesitter/nvim-treesitter" | wbthomason/packer.nvim | wezterm/wezterm | "wezterm/wezterm.git" )
-- as long as a full url hyperlink regex exists above this it should not match a full url to
-- github or gitlab / bitbucket (i.e. https://gitlab.com/user/project.git is still a whole clickable url)
table.insert(config.hyperlink_rules, {
  regex = [[["]?([\w\d]{1}[-\w\d]+)(/){1}([-\w\d\.]+)["]?]],
  format = 'https://www.github.com/$1/$3',
})

return config

See also hyperlink_rules and default_hyperlink_rules.

wezterm supports the relatively new Hyperlinks in Terminal Emulators specification that allows emitting text that can be clicked and resolve to a specific URL, without the URL being part of the display text. This allows for a cleaner presentation.

The gist of it is that running the following bash one-liner:

printf '\e]8;;http://example.com\e\\This is a link\e]8;;\e\\\n'

will output the text This is a link that when clicked will open http://example.com in your browser.

wezterm supports integrating with the shell through the following means:

  • OSC 7 Escape sequences to advise the terminal of the working directory
  • OSC 133 Escape sequence to define Input, Output and Prompt zones
  • OSC 1337 Escape sequences to set user vars for tracking additional shell state

OSC is escape sequence jargon for Operating System Command.

These sequences enable some improved user experiences, such as being able to spawn new panes, tabs and windows with the same current working directory as the current pane, jumping through the scrollback to the start of an earlier command, or conveniently selecting the complete output from a command.

In order for these features to be enabled, you will need to configure your shell program to emit the escape sequences at the appropriate place.

You can find some examples for various shells in the wezterm repo.

To use this file to setup shell integration in wezterm with Bash or Zsh, you can copy the file to your computer and source it via . /path/to/file.sh in your .bashrc or .zshrc, or you can install it at /etc/profile.d on most unix systems.

Xonsh is supported via a term-integrations plugin.

Starting with version 20210314-114017-04b7cedd, the Fedora and Debian packages automatically activate shell integration for Bash and Zsh. Starting with version 20230320.124340.559cb7b0, the Arch Linux package also automatically activate it.

If you're on another system, more information on how these escapes work can be found below.

Learn more about OSC 133 Semantic Prompt Escapes.

User Vars

OSC 1337 provides a means for setting user vars, which are somewhat similar to environment variables, except that they are variables associated with a given pane rather than a process.

Installing the wezterm shell integration will define the following user vars by default:

  • WEZTERM_PROG - the command line being executed by the shell
  • WEZTERM_USER - holds the output from id -un; the current user name
  • WEZTERM_HOST - holds the output from hostname; the hostname that the shell is running on
  • WEZTERM_IN_TMUX - holds 1 if the shell is running inside tmux, 0 otherwise

If you are a tmux user, you must ensure that you have set -g allow-passthrough on set in your tmux.conf for user vars to work.

Those vars will be updated each time the prompt is shown and just prior to executing a command.

The shell integration provides a shell function named __wezterm_set_user_var which can be used to set your own user vars.

Setting a user var will generate events in the window that contains the corresponding pane:

  • user-var-changed, which allows you to directly take action when a var is set/changed.
  • update-status which allows you to update left/right status items
  • the title and tab bar area will then update and trigger any associated events as part of that update

You can access the complete set of user vars in a given pane by calling pane:get_user_vars(), or by accessing the user_vars field in a PaneInformation struct.

You may wish to use this information to adjust what is shown in your tab titles or in the status area.

OSC 7 Escape sequence to set the working directory

OSC 7 means Operating System Command number 7. This is an escape sequence that originated in the macOS Terminal application that is used to advise the terminal of the current working directory.

An application (usually your shell) can be configured to emit this escape sequence when the current directory changes, or just to emit it each time it prints the prompt.

The current working directory can be specified as a URL like this:

printf "\033]7;file://HOSTNAME/CURRENT/DIR\033\\"

When the current working directory has been set via OSC 7, spawning a new tab will use the current working directory of the current tab, so that you don't have to manually change the directory.

If you are on a modern Fedora installation, the defaults for bash and zsh source a vte.sh script that configures the shell to emit this sequence. On other systems you will likely need to configure this for yourself.

OSC 7 on Windows with cmd.exe

cmd.exe doesn't allow a lot of flexibility in configuring the prompt, but fortunately it does allow for emitting escape sequences. You can use the set_environment_variables configuration to pre-configure the prompt environment in your .wezterm.lua; this example configures the use of OSC 7 as well as including the time and current directory in the visible prompt with green and purple colors, and makes the prompt span multiple lines:

config.set_environment_variables = {
  prompt = '$E]7;file://localhost/$P$E\\$E[32m$T$E[0m $E[35m$P$E[36m$_$G$E[0m ',
}

OSC 7 on Windows with powershell

You can configure a custom prompt in powershell by creating/editing your powershell profile and defining a function like this:

function prompt {
    $p = $executionContext.SessionState.Path.CurrentLocation
    $osc7 = ""
    if ($p.Provider.Name -eq "FileSystem") {
        $ansi_escape = [char]27
        $provider_path = $p.ProviderPath -Replace "\\", "/"
        $osc7 = "$ansi_escape]7;file://${env:COMPUTERNAME}/${provider_path}${ansi_escape}\"
    }
    "${osc7}PS $p$('>' * ($nestedPromptLevel + 1)) ";
}

OSC 7 on Windows with powershell (with starship)

When using Starship, since it has taken control of the prompt, hooking in to set OSC 7 can be achieved this way instead:

$prompt = ""
function Invoke-Starship-PreCommand {
    $current_location = $executionContext.SessionState.Path.CurrentLocation
    if ($current_location.Provider.Name -eq "FileSystem") {
        $ansi_escape = [char]27
        $provider_path = $current_location.ProviderPath -replace "\\", "/"
        $prompt = "$ansi_escape]7;file://${env:COMPUTERNAME}/${provider_path}$ansi_escape\"
    }
    $host.ui.Write($prompt)
}

Clink brings bash style line editing, completions and autosuggestions to your Windows cmd.exe experience. If you haven't installed clink to be the global default on your system, you can configure wezterm to launch clink by setting the default_prog configuration in your .wezterm.lua; for example, if you have extracted clink to c:\clink you might configure this:

local wezterm = require 'wezterm'
local config = {}

config.set_environment_variables = {}

if wezterm.target_triple == 'x86_64-pc-windows-msvc' then
  -- Use OSC 7 as per the above example
  config.set_environment_variables['prompt'] =
    '$E]7;file://localhost/$P$E\\$E[32m$T$E[0m $E[35m$P$E[36m$_$G$E[0m '
  -- use a more ls-like output format for dir
  config.set_environment_variables['DIRCMD'] = '/d'
  -- And inject clink into the command prompt
  config.default_prog =
    { 'cmd.exe', '/s', '/k', 'c:/clink/clink_x64.exe', 'inject', '-q' }
end

return config

Now, rather than just running cmd.exe on its own, this will cause cmd.exe to self-inject the clink line editor.

wezterm implements support for the iTerm2 inline images protocol and provides a handy imgcat subcommand to make it easy to try out. Because the protocol is just a protocol, wezterm's imgcat also renders images in iTerm2.

To render an image inline in your terminal:

$ wezterm imgcat /path/to/image.png

inline image display

Note that the image protocol isn't fully handled by multiplexer sessions at this time.

{{since('20220319-142410-0fcdea07')}}

WezTerm supports an extension to the protocol; passing doNotMoveCursor=1 as an argument to the File escape sequence causes wezterm to not move the cursor position after processing the image.

wezterm uses an embedded ssh library to provide an integrated SSH client. The client can be used to make ad-hoc SSH connections to remote hosts by invoking the client like this:

$ wezterm ssh wez@my.server

(checkout wezterm ssh -h for more options).

When invoked in this way, wezterm may prompt you for SSH authentication and once a connection is established, open a new terminal window with your requested command, or your shell if you didn't specify one.

Creating new tabs or panes will each create a new channel in your existing session so you won't need to re-authenticate for additional tabs that you create.

SSH sessions created in this way are non-persistent and all associated tabs will die if your network connection is interrupted.

Take a look at the multiplexing section for an alternative configuration that connects to a remote wezterm instance and preserves your tabs.

The ssh_backend configuration can be used to specify which ssh library is used.

{{since('20210404-112810-b63a949d')}}

wezterm is now able to parse ~/.ssh/config and /etc/ssh/ssh_config and respects the following options:

  • IdentityAgent
  • IdentityFile
  • Hostname
  • User
  • Port
  • ProxyCommand
  • Host (including wildcard matching)
  • UserKnownHostsFile
  • IdentitiesOnly
  • BindAddress

All other options are parsed but have no effect. Notably, neither Match or Include will do anything.

{{since('20210502-154244-3f7122cb:')}}

Match is now recognized but currently supports only single-phase (final, canonical are not supported) configuration parsing for Host and LocalUser. Exec based matches are recognized but not supported.

{{since('20210814-124438-54e29167:')}}

Include is now supported.

{{since('nightly')}}

ProxyUseFDpass is now supported. (But not on Microsoft Windows).

CLI Overrides

wezterm ssh CLI allows overriding config settings via the command line. This example shows how to specify the private key to use when connecting to some-host:

wezterm ssh -oIdentityFile=/secret/id_ed25519 some-host

wezterm can also connect to serial ports as a client. This is useful for example when working with embedded devices such as Arduino, or when connecting to a serial console on a headless server.

For example, on Linux:

$ wezterm serial /dev/ttyUSB0

or on Windows:

$ wezterm serial COM0

You can also specify the baud rate:

$ wezterm serial --baud 38400 /dev/ttyUSB0

When a wezterm window is operating in serial mode it is not possible to create new tabs.

!!! note multiplexing is still a young feature and is evolving rapidly. Your feedback is welcomed!

Multiplexing

The out-of-the-box experience with wezterm allows you to multiplex local tabs and windows which will persist until they are closed. With a little extra configuration you can enable local terminal multiplexing with features similar to those in tmux or screen.

Multiplexing in wezterm is based around the concept of multiplexing domains; a domain is a distinct set of windows and tabs. When wezterm starts up it creates a default local domain to manage the windows and tabs in the UI, but it can also be configured to start or connect to additional domains.

Once connected to a domain, wezterm can attach its windows and tabs to the local native UI, providing a more natural experience for interacting with the mouse, clipboard and scrollback features of the terminal.

Key bindings allow you to spawn new tabs in the default local domain, the domain of the current tab, or a specific numbered domain.

SSH Domains

wezterm also supports regular ad-hoc ssh connections. This section of the docs refers to running a wezterm daemon on the remote end of a multiplexing session that uses ssh as a channel

A connection to a remote wezterm multiplexer made via an ssh connection is referred to as an SSH domain. A compatible version of wezterm must be installed on the remote system in order to use SSH domains. SSH domains are supported on all systems via libssh2.

To configure an SSH domain, place something like the following in your .wezterm.lua file:

config.ssh_domains = {
  {
    -- This name identifies the domain
    name = 'my.server',
    -- The hostname or address to connect to. Will be used to match settings
    -- from your ssh config file
    remote_address = '192.168.1.1',
    -- The username to use on the remote host
    username = 'wez',
  },
}

See SshDomain for more information on possible settings to use with SSH domains.

To connect to the system, run:

$ wezterm connect my.server

This will launch an SSH session that connects to the specified address and may pop up authentication dialogs (using SSH keys for auth is strongly recommended!). Once connected, it will attempt to spawn the wezterm multiplexer daemon on the remote host and connect to it via a unix domain socket using a similar mechanism to that described in the Unix Domains section below.

{{since('20230408-112425-69ae8472')}}

Ssh_domains now auto-populate from your ~/.ssh/config file. Each populated host will have both a plain SSH and a multiplexing SSH domain. Plain SSH hosts are defined with a SSH: prefix to their name and multiplexing hosts are defined with a prefix SSHMUX:. For example, to connect to a host named my.server in your ~/.ssh/config using a multiplexing domain, run:

$ wezterm connect SSHMUX:my.server
# or to spawn into a new tab in an existing wezterm gui instance:
$ wezterm cli spawn --domain-name SSHMUX:my.server

To customize this functionality, see the example for wezterm.default_ssh_domains()

Unix Domains

A connection to a multiplexer made via a unix socket is referred to as a unix domain. Unix domains are supported on all systems, even Windows and are a way to connect the native win32 GUI into the Windows Subsystem for Linux (WSL).

The bare minimum configuration to enable a unix domain is this, which will spawn a server if needed and then connect the gui to it automatically when wezterm is launched:

config.unix_domains = {
  {
    name = 'unix',
  },
}

-- This causes `wezterm` to act as though it was started as
-- `wezterm connect unix` by default, connecting to the unix
-- domain on startup.
-- If you prefer to connect manually, leave out this line.
config.default_gui_startup_args = { 'connect', 'unix' }

If you prefer to connect manually, omit the default_gui_startup_args setting and then run:

$ wezterm connect unix

Note that in earlier versions of wezterm, a connect_automatically domain option was shown as the way to connect on startup. Using default_gui_startup_args is recommended instead as it works more reliably.

The possible configuration values are:

config.unix_domains = {
  {
    -- The name; must be unique amongst all domains
    name = 'unix',

    -- The path to the socket.  If unspecified, a reasonable default
    -- value will be computed.

    -- socket_path = "/some/path",

    -- If true, do not attempt to start this server if we try and fail to
    -- connect to it.

    -- no_serve_automatically = false,

    -- If true, bypass checking for secure ownership of the
    -- socket_path.  This is not recommended on a multi-user
    -- system, but is useful for example when running the
    -- server inside a WSL container but with the socket
    -- on the host NTFS volume.

    -- skip_permissions_check = false,
  },
}

{{since('20220101-133340-7edc5b5a')}}

It is now possible to specify a proxy_command that will be used in place of making a direct unix connection. When proxy_command is specified, it will be used instead of the optional socket_path.

This example shows a redundant use of nc (netcat) to connect to the unix socket path on my mac. This isn't useful on its own, but may help with the WSL 2 issue mentioned below when translated to an appropriate invocation of netcat/socat on Windows:

config.unix_domains = {
  {
    name = 'unix',
    proxy_command = { 'nc', '-U', '/Users/wez/.local/share/wezterm/sock' },
  },
}

{{since('20220319-142410-0fcdea07')}}

You may now specify the round-trip latency threshold for enabling predictive local echo using local_echo_threshold_ms. If the measured round-trip latency between the wezterm client and the server exceeds the specified threshold, the client will attempt to predict the server's response to key events and echo the result of that prediction locally without waiting, hence hiding latency to the user. This option only applies when multiplexing = "WezTerm".

config.unix_domains = {
  {
    name = 'unix',
    local_echo_threshold_ms = 10,
  },
}

Connecting into Windows Subsystem for Linux

Note: this only works with WSL 1. WSL 2 doesn't support AF_UNIX interop

Inside your WSL instance, configure .wezterm.lua with this snippet:

config.unix_domains = {
  {
    name = 'wsl',
    -- Override the default path to match the default on the host win32
    -- filesystem.  This will allow the host to connect into the WSL
    -- container.
    socket_path = '/mnt/c/Users/USERNAME/.local/share/wezterm/sock',
    -- NTFS permissions will always be "wrong", so skip that check
    skip_permissions_check = true,
  },
}

In the host win32 configuration, use this snippet:

config.unix_domains = {
  {
    name = 'wsl',
    serve_command = { 'wsl', 'wezterm-mux-server', '--daemonize' },
  },
}
config.default_gui_startup_args = { 'connect', 'wsl' }

Now when you start wezterm you'll be presented with a WSL tab.

You can also omit default_gui_startup_args and use:

$ wezterm connect wsl

to manually connect into your WSL instance.

TLS Domains

A connection to a multiplexer made via a TLS encrypted TCP connection is referred to as a TLS Domain.

Starting with version 20200202-180558-2489abf9, wezterm can bootstrap a TLS session by performing an initial connection via SSH to start the wezterm multiplexer on the remote host and securely obtain a key. Once bootstrapped, the client will use a TLS protected TCP connection to communicate with the server.

Configuring the client

For each server that you wish to connect to, add a client section like this:

config.tls_clients = {
  {
    -- A handy alias for this session; you will use `wezterm connect server.name`
    -- to connect to it.
    name = 'server.name',
    -- The host:port for the remote host
    remote_address = 'server.hostname:8080',
    -- The value can be "user@host:port"; it accepts the same syntax as the
    -- `wezterm ssh` subcommand.
    bootstrap_via_ssh = 'server.hostname',
  },
}

See TlsDomainClient for more information on possible settings.

Configuring the server

config.tls_servers = {
  {
    -- The host:port combination on which the server will listen
    -- for connections
    bind_address = 'server.hostname:8080',
  },
}

See TlsDomainServer for more information on possible settings.

Connecting

On the client, running this will connect to the server, start up the multiplexer and obtain a certificate for the TLS connection. A connection window will show the progress and may prompt you for SSH authentication. Once the connection has been initiated, wezterm will automatically reconnect using the certificate it obtained during bootstrapping if your connection was interrupted and resume your remote terminal session

$ wezterm connect server.name

Quick Start

Create a file named .wezterm.lua in your home directory, with the following contents:

-- Pull in the wezterm API
local wezterm = require 'wezterm'

-- This will hold the configuration.
local config = wezterm.config_builder()

-- This is where you actually apply your config choices

-- For example, changing the color scheme:
config.color_scheme = 'AdventureTime'

-- and finally, return the configuration to wezterm
return config

Configuration Files

wezterm will look for a lua configuration file using the logic shown below.

!!! tip The recommendation is to place your configuration file at $HOME/.wezterm.lua (%USERPROFILE%/.wezterm.lua on Windows) to get started.

More complex configurations that need to span multiple files can be placed in $XDG_CONFIG_HOME/wezterm/wezterm.lua (for X11/Wayland) or $HOME/.config/wezterm/wezterm.lua (for all other systems).

{% raw %}

graph TD
  X[Locate Configuration file] --> A{{--config-file CLI argument specified?}}
  A -->|Yes| B{{Can that file be loaded?}}
  B -->|Yes| C[Use it]
  B -->|No| D[Use built-in default configuration]
  A -->|No| E{{$WEZTERM_CONFIG_FILE<br/>environment set?}}
  E -->|Yes| B
  E -->|No| F{{"Running on Windows and<br/>wezterm.lua exists in same<br/>dir as wezterm.exe?<br/>(Thumb drive mode)"}}
  F -->|Yes| B
  F -->|No| H{{Is $XDG_CONFIG_HOME<br/>environment set and<br/>wezterm/wezterm.lua<br/>exists inside it?}}
  H -->|Yes| B
  J --> B
  H -->|No| K{{Does $HOME/.config/wezterm/wezterm.lua exist?}}
  K -->|Yes| B
  K -->|No| J[Use $HOME/.wezterm.lua]

{% endraw %}

Prior to version 20210314-114017-04b7cedd, if the candidate file exists but failed to parse, wezterm would treat it as though it didn't exist and continue to try other candidate file locations. In all current versions of wezterm, an error will be shown and the default configuration will be used instead.

!!! note On Windows, to support users that carry their wezterm application and configuration around on a thumb drive, wezterm will look for the config file in the same location as wezterm.exe. That is shown in the chart above as thumb drive mode. It is not recommended to store your configs in that location if you are not running off a thumb drive.

wezterm will watch the config file that it loads; if/when it changes, the configuration will be automatically reloaded and the majority of options will take effect immediately. You may also use the CTRL+SHIFT+R keyboard shortcut to force the configuration to be reloaded.

!!! info The configuration file may be evaluated multiple times for each wezterm process both at startup and in response to the configuration file being reloaded. You should avoid taking actions in the main flow of the config file that have side effects; for example, unconditionally launching background processes can result in many of them being spawned over time if you launch many copies of wezterm, or are frequently reloading your config file.

Configuration Overrides

{{since('20210314-114017-04b7cedd')}}

wezterm allows overriding configuration values via the command line; here are a couple of examples:

$ wezterm --config enable_scroll_bar=true
$ wezterm --config 'exit_behavior="Hold"'

Configuration specified via the command line will always override the values provided by the configuration file, even if the configuration file is reloaded.

Each window can have an additional set of window-specific overrides applied to it by code in your configuration file. That's useful for eg: setting transparency or any other arbitrary option on a per-window basis. Read the window:set_config_overrides documentation for more information and examples of how to use that functionality.

Configuration File Structure

The wezterm.lua configuration file is a lua script which allows for a high degree of flexibility. The script is expected to return a configuration table, so a basic empty (and rather useless!) configuration file will look like this:

return {}

Throughout these docs you'll find configuration fragments that demonstrate configuration and that look something like this:

local wezterm = require 'wezterm'
local config = {}

config.color_scheme = 'Batman'

return config

and perhaps another one like this:

local wezterm = require 'wezterm'
local config = {}

config.font = wezterm.font 'JetBrains Mono'

return config

If you wanted to use both of these in the same file, you would merge them together like this:

local wezterm = require 'wezterm'
local config = {}

config.font = wezterm.font 'JetBrains Mono'
config.color_scheme = 'Batman'

return config

For the sake of brevity in these docs, individual snippets may be shown as just the config assignments:

config.color_scheme = 'Batman'

Making your own Lua Modules

If you'd like to break apart your configuration into multiple files, you'll be interested in this information.

The Lua package.path is configured with the following paths in this order:

  • On Windows: a wezterm_modules dir in the same directory as wezterm.exe. This is for thumb drive mode, and is not recommended to be used otherwise.
  • ~/.config/wezterm
  • ~/.wezterm
  • A system specific set of paths which may (or may not!) find locally installed lua modules

That means that if you wanted to break your config up into a helpers.lua file you would place it in ~/.config/wezterm/helpers.lua with contents like this:

-- I am helpers.lua and I should live in ~/.config/wezterm/helpers.lua

local wezterm = require 'wezterm'

-- This is the module table that we will export
local module = {}

-- This function is private to this module and is not visible
-- outside.
local function private_helper()
  wezterm.log_error 'hello!'
end

-- define a function in the module table.
-- Only functions defined in `module` will be exported to
-- code that imports this module.
-- The suggested convention for making modules that update
-- the config is for them to export an `apply_to_config`
-- function that accepts the config object, like this:
function module.apply_to_config(config)
  private_helper()

  config.color_scheme = 'Batman'
end

-- return our module table
return module

and then in your wezterm.lua you would use it like this:

local helpers = require 'helpers'
local config = {}
helpers.apply_to_config(config)
return config

Configuration Reference

Continue browsing this section of the docs for an overview of the commonly adjusted settings, or visit the Lua Config Reference for a more detailed list of possibilities.

Color Scheme

WezTerm ships with over 700 color schemes available from iTerm2-Color-Schemes, base16, Gogh and terminal.sexy and a couple of other locations.

You can select a color scheme with a line like this:

local wezterm = require 'wezterm'
local config = {}

config.color_scheme = 'Batman'

return config

You can find a list of available color schemes and screenshots in The Color Schemes Section.

If you'd like to automatically adjust your color scheme based on the system dark mode or light mode appearance, see the example in wezterm.gui.get_appearance()

!!! note if you are using multiplexing with ssh or tls domains, the color scheme is controlled by the config file on the multiplexer server side. This is because the palette is an attribute of the terminal emulation and that state lives on the multiplexer server.*

Precedence of colors vs color_schemes

The color_scheme option takes precedence over the colors section below, and is mutually exclusive with it. If you want to merge/override colors you need to use wezterm.color.get_default_colors() and explicitly merge them.

{{since('20220903-194523-3bb1ed61')}}

The behavior has been changed so that the color_scheme you have selected, if any, is used to define the colors, and then any colors you define in the colors section will override those colors.

Defining your own colors

You can specify the color palette using the colors configuration section.

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 usual hex notation; eg: #000000 is equivalent to black:

local wezterm = require 'wezterm'
local config = {}

config.colors = {
  -- The default text color
  foreground = 'silver',
  -- The default background color
  background = 'black',

  -- Overrides the cell background color when the current cell is occupied by the
  -- cursor and the cursor style is set to Block
  cursor_bg = '#52ad70',
  -- Overrides the text color when the current cell is occupied by the cursor
  cursor_fg = 'black',
  -- Specifies the border color of the cursor when the cursor style is set to Block,
  -- or the color of the vertical or horizontal bar when the cursor style is set to
  -- Bar or Underline.
  cursor_border = '#52ad70',

  -- the foreground color of selected text
  selection_fg = 'black',
  -- the background color of selected text
  selection_bg = '#fffacd',

  -- The color of the scrollbar "thumb"; the portion that represents the current viewport
  scrollbar_thumb = '#222222',

  -- The color of the split lines between panes
  split = '#444444',

  ansi = {
    'black',
    'maroon',
    'green',
    'olive',
    'navy',
    'purple',
    'teal',
    'silver',
  },
  brights = {
    'grey',
    'red',
    'lime',
    'yellow',
    'blue',
    'fuchsia',
    'aqua',
    'white',
  },

  -- Arbitrary colors of the palette in the range from 16 to 255
  indexed = { [136] = '#af8700' },

  -- Since: 20220319-142410-0fcdea07
  -- When the IME, a dead key or a leader key are being processed and are effectively
  -- holding input pending the result of input composition, change the cursor
  -- to this color to give a visual cue about the compose state.
  compose_cursor = 'orange',

  -- Colors for copy_mode and quick_select
  -- available since: 20220807-113146-c2fee766
  -- In copy_mode, the color of the active text is:
  -- 1. copy_mode_active_highlight_* if additional text was selected using the mouse
  -- 2. selection_* otherwise
  copy_mode_active_highlight_bg = { Color = '#000000' },
  -- use `AnsiColor` to specify one of the ansi color palette values
  -- (index 0-15) using one of the names "Black", "Maroon", "Green",
  --  "Olive", "Navy", "Purple", "Teal", "Silver", "Grey", "Red", "Lime",
  -- "Yellow", "Blue", "Fuchsia", "Aqua" or "White".
  copy_mode_active_highlight_fg = { AnsiColor = 'Black' },
  copy_mode_inactive_highlight_bg = { Color = '#52ad70' },
  copy_mode_inactive_highlight_fg = { AnsiColor = 'White' },

  quick_select_label_bg = { Color = 'peru' },
  quick_select_label_fg = { Color = '#ffffff' },
  quick_select_match_bg = { AnsiColor = 'Navy' },
  quick_select_match_fg = { Color = '#ffffff' },
}

return config

{{since('20220101-133340-7edc5b5a')}}

You may specify colors in the HSL color space, if you prefer that over RGB, by using:

config.colors = {
  -- the first number is the hue measured in degrees with a range
  -- of 0-360.
  -- The second number is the saturation measured in percentage with
  -- a range of 0-100.
  -- The third number is the lightness measured in percentage with
  -- a range of 0-100.
  foreground = 'hsl:235 100 50',
}

{{since('20220319-142410-0fcdea07')}}

Colors now also accept the following CSS-style color specifications:

rgb(0,255,0)
rgb(0% 100% 0%)
rgb(0 255 0 / 100%)
rgba(0,255,0,1)
hsl(120,100%,50%)
hsl(120deg 100% 50%)
hsl(-240 100% 50%)
hsl(-240deg 100% 50%)
hsl(0.3333turn 100% 50%)
hsl(133.333grad 100% 50%)
hsl(2.0944rad 100% 50%)
hsla(120,100%,50%,100%)
hwb(120 0% 0%)
hwb(480deg 0% 0% / 100%)
hsv(120,100%,100%)
hsv(120deg 100% 100% / 100%)

The alpha value is ignored except when used with selection_fg and selection_bg:

config.colors = {
  -- Make the selection text color fully transparent.
  -- When fully transparent, the current text color will be used.
  selection_fg = 'none',
  -- Set the selection background color with alpha.
  -- When selection_bg is transparent, it will be alpha blended over
  -- the current cell background color, rather than replace it
  selection_bg = 'rgba(50% 50% 50% 50%)',
}

Defining a Color Scheme in your .wezterm.lua

If you'd like to keep a couple of color schemes handy in your configuration file, rather than filling out the colors section, place it in a color_schemes section as shown below; you can then reference it using the color_scheme setting.

Color schemes names that you define in your wezterm.lua take precedence over all other color schemes.

All of the settings available from the colors section are available to use in the color_schemes sections.

config.color_scheme = 'Red Scheme'

config.color_schemes = {
  ['Red Scheme'] = {
    background = 'red',
  },
  ['Blue Scheme'] = {
    background = 'blue',
  },
}

See also wezterm.get_builtin_color_schemes() for some more advanced examples, such as picking a random color scheme, or deriving from a builting color scheme.

Defining a Color Scheme in a separate file

If you'd like to factor your color schemes out into separate files, you can create a TOML format file with a [colors] section; take a look at one of the available color schemes for an example.

It is recommended that you place your custom scheme in a directory named $HOME/.config/wezterm/colors if you're on a POSIX system.

On a Windows system, wezterm will search for schemes in a directory named colors that is in the same directory as the wezterm.exe.

If you wish to place your color scheme files in some other location, then you will need to instruct wezterm where to look for your scheme files; the color_scheme_dirs setting specifies a list of directories to be searched:

config.color_scheme_dirs = { '/some/path/to/my/color/schemes' }

Color scheme names that are defined in files in your color_scheme_dirs list take precedence over the built-in color schemes.

Dynamic Color Escape Sequences

Wezterm supports dynamically changing its color palette via escape sequences.

The dynamic-colors directory of the color scheme repo contains shell scripts that can change the color scheme immediately on the fly. This can be used in your own scripts to alter the terminal appearance programmatically:

$ git clone https://github.com/mbadolato/iTerm2-Color-Schemes.git
$ cd iTerm2-Color-Schemes/dynamic-colors
$ for scheme in *.sh ; do ; echo $scheme ; \
   bash "$scheme" ; ../tools/screenshotTable.sh; sleep 0.5; done

Tab Bar Appearance & Colors

The tab bar has two modes; the default is a native looking style, but it is also possible to enable a retro aesthetic. The configuration for the two styles is broadly similar, but there are a few different details.

Native (Fancy) Tab Bar appearance

The following options affect the fancy tab bar:

config.window_frame = {
  -- The font used in the tab bar.
  -- Roboto Bold is the default; this font is bundled
  -- with wezterm.
  -- Whatever font is selected here, it will have the
  -- main font setting appended to it to pick up any
  -- fallback fonts you may have used there.
  font = wezterm.font { family = 'Roboto', weight = 'Bold' },

  -- The size of the font in the tab bar.
  -- Default to 10.0 on Windows but 12.0 on other systems
  font_size = 12.0,

  -- The overall background color of the tab bar when
  -- the window is focused
  active_titlebar_bg = '#333333',

  -- The overall background color of the tab bar when
  -- the window is not focused
  inactive_titlebar_bg = '#333333',
}

config.colors = {
  tab_bar = {
    -- The color of the inactive tab bar edge/divider
    inactive_tab_edge = '#575757',
  },
}

In addition, the tab bar colors mentioned below also apply to the items displayed in the tab bar.

Retro Tab Bar appearance

The following options control the appearance of the tab bar:

config.colors = {
  tab_bar = {
    -- The color of the strip that goes along the top of the window
    -- (does not apply when fancy tab bar is in use)
    background = '#0b0022',

    -- The active tab is the one that has focus in the window
    active_tab = {
      -- The color of the background area for the tab
      bg_color = '#2b2042',
      -- The color of the text for the tab
      fg_color = '#c0c0c0',

      -- Specify whether you want "Half", "Normal" or "Bold" intensity for the
      -- label shown for this tab.
      -- The default is "Normal"
      intensity = 'Normal',

      -- Specify whether you want "None", "Single" or "Double" underline for
      -- label shown for this tab.
      -- The default is "None"
      underline = 'None',

      -- Specify whether you want the text to be italic (true) or not (false)
      -- for this tab.  The default is false.
      italic = false,

      -- Specify whether you want the text to be rendered with strikethrough (true)
      -- or not for this tab.  The default is false.
      strikethrough = false,
    },

    -- Inactive tabs are the tabs that do not have focus
    inactive_tab = {
      bg_color = '#1b1032',
      fg_color = '#808080',

      -- The same options that were listed under the `active_tab` section above
      -- can also be used for `inactive_tab`.
    },

    -- You can configure some alternate styling when the mouse pointer
    -- moves over inactive tabs
    inactive_tab_hover = {
      bg_color = '#3b3052',
      fg_color = '#909090',
      italic = true,

      -- The same options that were listed under the `active_tab` section above
      -- can also be used for `inactive_tab_hover`.
    },

    -- The new tab button that let you create new tabs
    new_tab = {
      bg_color = '#1b1032',
      fg_color = '#808080',

      -- The same options that were listed under the `active_tab` section above
      -- can also be used for `new_tab`.
    },

    -- You can configure some alternate styling when the mouse pointer
    -- moves over the new tab button
    new_tab_hover = {
      bg_color = '#3b3052',
      fg_color = '#909090',
      italic = true,

      -- The same options that were listed under the `active_tab` section above
      -- can also be used for `new_tab_hover`.
    },
  },
}

Window Padding

You may add padding around the edges of the terminal area.

See the window_padding docs for more info

Styling Inactive Panes

{{since('20201031-154415-9614e117')}}

To make it easier to see which pane is active, the inactive panes are dimmed and de-saturated slightly.

You can specify your own transformation to the pane colors with a hue, saturation, brightness (HSB) multiplier.

In this example, inactive panes will be slightly de-saturated and dimmed; this is the default configuration:

config.inactive_pane_hsb = {
  saturation = 0.9,
  brightness = 0.8,
}

The transform works by converting the RGB colors to HSV values and then multiplying the HSV by the numbers specified in inactive_pane_hsb.

Modifying the hue changes the hue of the color by rotating it through the color wheel. It is not as useful as the other components, but is available "for free" as part of the colorspace conversion.

Modifying the saturation can add or reduce the amount of "colorfulness". Making the value smaller can make it appear more washed out.

Modifying the brightness can be used to dim or increase the perceived amount of light.

The range of these values is 0.0 and up; they are used to multiply the existing values, so the default of 1.0 preserves the existing component, whilst 0.5 will reduce it by half, and 2.0 will double the value.

Window Background Image

Screenshot

{{since('20201031-154415-9614e117')}}

You can attach an image to the background of the wezterm window:

config.window_background_image = '/path/to/wallpaper.jpg'

If the path is a relative path then it will be expanded relative to the directory containing your wezterm.lua config file.

PNG, JPEG, GIF, BMP, ICO, TIFF, PNM, DDS, TGA and farbfeld files can be loaded. Animated GIF and PNG files will animate while the window has focus.

The image will be scaled to fit the window contents. Very large images may decrease render performance and take up VRAM from the GPU, so you may wish to resize the image file before using it.

You can optionally transform the background image by specifying a hue, saturation, brightness multiplier:

config.window_background_image = '/path/to/wallpaper.jpg'

config.window_background_image_hsb = {
  -- Darken the background image by reducing it to 1/3rd
  brightness = 0.3,

  -- You can adjust the hue by scaling its value.
  -- a multiplier of 1.0 leaves the value unchanged.
  hue = 1.0,

  -- You can adjust the saturation also.
  saturation = 1.0,
}

See Styling Inactive Panes for more information on hue, saturation, brightness transformations.

If you'd like to have control over scaling, tiling/repeating, scrolling behavior and more, take a look at the more powerful background configuration option.

Window Background Gradient

{{since('20210814-124438-54e29167')}}

Gradient

See window_background_gradient for configuration information on gradients.

Window Background Opacity

{{since('20201031-154415-9614e117')}}

If your Operating System provides Compositing support then WezTerm is able to specify the alpha channel value for the background content, rendering the window background translucent (some refer to this as transparent rather than translucent) and causing the windows/desktop behind it to show through the window.

macOS, Windows and Wayland support compositing out of the box. X11 may require installing or configuring a compositing window manager. XWayland under Mutter/Wayland also works without any additional configuration.

window_background_opacity specifies the alpha channel value with floating point numbers in the range 0.0 (meaning completely translucent/transparent) through to 1.0 (meaning completely opaque).

Setting this to a value other than the default 1.0 may impact render performance.

config.window_background_opacity = 1.0

Text Background Opacity

{{since('20201031-154415-9614e117')}}

When using a background image or background opacity, the image content can have relatively low contrast with respect to the text you are trying to read in your terminal.

The text_background_opacity setting specifies the alpha channel value to use for the background color of cells other than the default background color.

The default for this setting is 1.0, which means that the background color is fully opaque.

The range of values permitted are 0.0 (completely translucent) through to 1.0 (completely opaque).

config.text_background_opacity = 0.3

Launching Programs

By default, when opening new tabs or windows, your shell will be spawned.

Your shell is determined by the following rules:

=== "On Posix Systems"

The shell configured for the current user in the password database will be
used.  The value of the `$SHELL` environment variable is **_deliberately
ignored_** in order for wezterm to continue to be functional without
restarting after the user changes their shell.

wezterm will set the `$SHELL` environment variable to the shell that it
resolved from the password database. If you want to control the value of
`$SHELL` in your spawned processes, use
[set_environment_variables](lua/config/set_environment_variables.md) to
define the value you prefer.

The shell will be spawned as `-<SHELL>` (with a `-` prefixed to its *ARGV0*)
to invoke it as a login shell.  A login shell generally loads additional
startup files and sets up more environment than a non-login shell.

Older versions of wezterm (circa 2022 and earlier) used slightly
different logic to determine the default program and invoke it.

=== "On Windows Systems"

1. The value of the `%COMSPEC%` environment variable is used if it is set.
   **It is not recommended to change COMSPEC**, keep reading this
   page of the documentation to learn how to make wezterm
   run a different program.

2. Otherwise, `cmd.exe`

Changing the default program

If you'd like wezterm to run a different program than the shell as described above, you can use the default_prog config setting to specify the argument array; the array allows specifying the program and arguments portably:

-- Spawn a fish shell in login mode
config.default_prog = { '/usr/local/bin/fish', '-l' }

Launching a different program as a one off via the CLI

If you want to make a shortcut for your desktop environment that will, for example, open an editor in wezterm you can use the start subcommand to launch it. This example opens up a new terminal window running vim to edit your wezterm configuration:

$ wezterm start -- vim ~/.wezterm.lua

Specifying the current working directory

If you'd like wezterm to start running a program in a specific working directory you can do so via the config, CLI, and when using SpawnCommand:

  • Setting the default_cwd via the config:

    config.default_cwd = "/some/path"
    
  • One off program in a specific working directory via the CLI:

    $ wezterm start --cwd /some/path
    
  • The SpawnCommandInNewTab, and SpawnCommandInNewWindow key assignments, and the Launcher Menu described below all accept a SpawnCommand object that accepts an optional cwd field:

    {
      label = "List files in /some/path",
      args = {"ls", "-al"},
      cwd = "/some/path",
    }
    

Panes/Tabs/Windows created after the first will generally try to resolve the current working directory of the current Pane, preferring a value set by OSC 7 and falling back to attempting to lookup the cwd of the current process group leader attached to a local Pane. If no cwd can be resolved, then the default_cwd will be used. If default_cwd is not specified, then the home directory of the user will be used.

See default_cwd for an easier to understand visualization.

Passing Environment variables to the spawned program

The set_environment_variables configuration setting can be used to add environment variables to the environment of the spawned program.

The behavior is to take the environment of the wezterm process and then set the specified variables for the spawned process.

config.set_environment_variables = {
  -- This changes the default prompt for cmd.exe to report the
  -- current directory using OSC 7, show the current time and
  -- the current directory colored in the prompt.
  prompt = '$E]7;file://localhost/$P$E\\$E[32m$T$E[0m $E[35m$P$E[36m$_$G$E[0m ',
}

The Launcher Menu

The launcher menu is accessed from the new tab button in the tab bar UI; the + button to the right of the tabs. Left clicking on the button will spawn a new tab, but right clicking on it will open the launcher menu. You may also bind a key to the ShowLauncher or ShowLauncherArgs action to trigger the menu.

The launcher menu by default lists the various multiplexer domains and offers the option of connecting and spawning tabs/windows in those domains.

You can define your own entries using the launch_menu configuration setting. The snippet below adds two new entries to the menu; one that runs the top program to monitor process activity and a second one that explicitly launches the bash shell.

Each entry in launch_menu is an instance of a SpawnCommand object.

config.launch_menu = {
  {
    args = { 'top' },
  },
  {
    -- Optional label to show in the launcher. If omitted, a label
    -- is derived from the `args`
    label = 'Bash',
    -- The argument array to spawn.  If omitted the default program
    -- will be used as described in the documentation above
    args = { 'bash', '-l' },

    -- You can specify an alternative current working directory;
    -- if you don't specify one then a default based on the OSC 7
    -- escape sequence will be used (see the Shell Integration
    -- docs), falling back to the home directory.
    -- cwd = "/some/path"

    -- You can override environment variables just for this command
    -- by setting this here.  It has the same semantics as the main
    -- set_environment_variables configuration option described above
    -- set_environment_variables = { FOO = "bar" },
  },
}

Launch Menu

Here's a fancy example that will add some helpful entries to the launcher menu when running on Windows:

local wezterm = require 'wezterm'
local launch_menu = {}

if wezterm.target_triple == 'x86_64-pc-windows-msvc' then
  table.insert(launch_menu, {
    label = 'PowerShell',
    args = { 'powershell.exe', '-NoLogo' },
  })

  -- Find installed visual studio version(s) and add their compilation
  -- environment command prompts to the menu
  for _, vsvers in
    ipairs(
      wezterm.glob('Microsoft Visual Studio/20*', 'C:/Program Files (x86)')
    )
  do
    local year = vsvers:gsub('Microsoft Visual Studio/', '')
    table.insert(launch_menu, {
      label = 'x64 Native Tools VS ' .. year,
      args = {
        'cmd.exe',
        '/k',
        'C:/Program Files (x86)/'
          .. vsvers
          .. '/BuildTools/VC/Auxiliary/Build/vcvars64.bat',
      },
    })
  end
end

return {
  launch_menu = launch_menu,
}

WezTerm bundles JetBrains Mono, Nerd Font Symbols and Noto Color Emoji fonts and uses those for the default font configuration.

If you wish to use a different font face, then you can use the wezterm.font function to specify it:

config.font = wezterm.font 'Fira Code'
-- You can specify some parameters to influence the font selection;
-- for example, this selects a Bold, Italic font variant.
config.font =
  wezterm.font('JetBrains Mono', { weight = 'Bold', italic = true })

Fallback

WezTerm allows specifying an ordered list of fonts; when resolving text into glyphs the first font in the list is consulted, and if the glyph isn't present in that font, WezTerm proceeds to the next font in the fallback list.

The default fallback includes the popular Nerd Font Symbols font, which means that you don't need to use specially patched fonts to use the powerline or Nerd Fonts symbol glyphs.

You can specify your own fallback; that's useful if you've got a killer monospace font, but it doesn't have glyphs for the asian script that you sometimes work with:

config.font = wezterm.font_with_fallback {
  'Fira Code',
  'DengXian',
}

WezTerm will still append its default fallback to whatever list you specify, so you needn't worry about replicating that list if you set your own fallback.

If none of the fonts in the fallback list (including WezTerm's default fallback list) contain a given glyph, then wezterm will resolve the system fallback list and try those fonts too. If a glyph cannot be resolved, wezterm will render a special "Last Resort" glyph as a placeholder. You may notice the placeholder appear momentarily and then refresh itself to the system fallback glyph on some systems.

Additional options for configuring fonts can be found elsewhere in the docs:

Troubleshooting Fonts

You may use wezterm ls-fonts to have wezterm explain information about which font files it will use for the different text styles.

It shows output like this:

$ wezterm ls-fonts
Primary font:
wezterm.font_with_fallback({
  -- /home/wez/.fonts/OperatorMonoSSmLig-Medium.otf, FontDirs
  {family="Operator Mono SSm Lig", weight="DemiLight"},

  -- /home/wez/.fonts/MaterialDesignIconsDesktop.ttf, FontDirs
  "Material Design Icons Desktop",

  -- /usr/share/fonts/jetbrains-mono-fonts/JetBrainsMono-Regular.ttf, FontConfig
  "JetBrains Mono",

  -- /usr/share/fonts/google-noto-emoji/NotoColorEmoji.ttf, FontConfig
  -- Assumed to have Emoji Presentation
  -- Pixel sizes: [128]
  "Noto Color Emoji",
})


When Intensity=Half Italic=true:
wezterm.font_with_fallback({
  -- /home/wez/.fonts/OperatorMonoSSmLig-BookItalic.otf, FontDirs
  {family="Operator Mono SSm Lig", weight=325, italic=true},

  -- /home/wez/.fonts/MaterialDesignIconsDesktop.ttf, FontDirs
  "Material Design Icons Desktop",

  -- /usr/share/fonts/jetbrains-mono-fonts/JetBrainsMono-Regular.ttf, FontConfig
  "JetBrains Mono",

  -- /usr/share/fonts/google-noto-emoji/NotoColorEmoji.ttf, FontConfig
  -- Assumed to have Emoji Presentation
  -- Pixel sizes: [128]
  "Noto Color Emoji",
})
...

You can ask wezterm to including a listing of all of the fonts on the system in a form that can be copied and pasted into the configuration file:

$ wezterm ls-fonts --list-system
<same output as above, but then:>
112 fonts found in your font_dirs + built-in fonts:
wezterm.font("Cascadia Code", {weight="ExtraLight", stretch="Normal", italic=false}) -- /home/wez/.fonts/CascadiaCode.ttf index=0 variation=1, FontDirs
wezterm.font("Cascadia Code", {weight="Light", stretch="Normal", italic=false}) -- /home/wez/.fonts/CascadiaCode.ttf index=0 variation=2, FontDirs
wezterm.font("Cascadia Code", {weight="DemiLight", stretch="Normal", italic=false}) -- /home/wez/.fonts/CascadiaCode.ttf index=0 variation=3, FontDirs
wezterm.font("Cascadia Code", {weight="Regular", stretch="Normal", italic=false}) -- /home/wez/.fonts/CascadiaCode.ttf index=0 variation=4, FontDirs
wezterm.font("Cascadia Code", {weight="DemiBold", stretch="Normal", italic=false}) -- /home/wez/.fonts/CascadiaCode.ttf index=0 variation=5, FontDirs
wezterm.font("Cascadia Code", {weight="Bold", stretch="Normal", italic=false}) -- /home/wez/.fonts/CascadiaCode.ttf index=0 variation=6, FontDirs
wezterm.font("Fira Code", {weight="Light", stretch="Normal", italic=false}) -- /home/wez/.fonts/FiraCode-Light.otf, FontDirs
wezterm.font("Fira Code", {weight="Regular", stretch="Normal", italic=false}) -- /home/wez/.fonts/FiraCode-Regular.otf, FontDirs
wezterm.font("Fira Code", {weight=450, stretch="Normal", italic=false}) -- /home/wez/.fonts/FiraCode-Retina.otf, FontDirs
wezterm.font("Fira Code", {weight="Medium", stretch="Normal", italic=false}) -- /home/wez/.fonts/FiraCode-Medium.otf, FontDirs
wezterm.font("Fira Code", {weight="Bold", stretch="Normal", italic=false}) -- /home/wez/.fonts/FiraCode-Bold.otf, FontDirs
wezterm.font("Font Awesome 5 Free", {weight="Black", stretch="Normal", italic=false}) -- /home/wez/.fonts/Font Awesome 5 Free-Solid-900.otf, FontDirs
...
690 system fonts found using FontConfig:
wezterm.font("Abyssinica SIL", {weight="Regular", stretch="Normal", italic=false}) -- /usr/share/fonts/sil-abyssinica-fonts/AbyssinicaSIL-R.ttf, FontConfig
wezterm.font("C059", {weight="Regular", stretch="Normal", italic=false}) -- /usr/share/fonts/urw-base35/C059-Bold.t1, FontConfig
wezterm.font("C059", {weight="Regular", stretch="Normal", italic=false}) -- /usr/share/fonts/urw-base35/C059-Roman.otf, FontConfig
wezterm.font("C059", {weight="Regular", stretch="Normal", italic=false}) -- /usr/share/fonts/urw-base35/C059-Roman.t1, FontConfig
wezterm.font("C059", {weight="Regular", stretch="Normal", italic=true}) -- /usr/share/fonts/urw-base35/C059-BdIta.t1, FontConfig
wezterm.font("C059", {weight="Regular", stretch="Normal", italic=true}) -- /usr/share/fonts/urw-base35/C059-Italic.otf, FontConfig
...

You may also display the shaping plan for a given text string; in this example, the a and the b are separated by a special symbol which is not present in the main font, so we expect to see a different font used for that glyph:

$ wezterm ls-fonts --text a🞄b
a    \u{61}       x_adv=8  glyph=29   wezterm.font("Operator Mono SSm Lig", {weight="DemiLight", stretch="Normal", italic=false})
                                      /home/wez/.fonts/OperatorMonoSSmLig-Medium.otf, FontDirs
🞄    \u{1f784}    x_adv=4  glyph=9129 wezterm.font("Symbola", {weight="Regular", stretch="SemiCondensed", italic=false})
                                      /usr/share/fonts/gdouros-symbola/Symbola.ttf, FontConfig
b    \u{62}       x_adv=8  glyph=30   wezterm.font("Operator Mono SSm Lig", {weight="DemiLight", stretch="Normal", italic=false})
                                      /home/wez/.fonts/OperatorMonoSSmLig-Medium.otf, FontDirs

tags:

  • font keywords:
  • ligature
  • font

Advanced Font Shaping Options

Font shaping is the process which expands font ligatures and applies other advanced font display features that are encoded in your chosen font, in order to correctly position and display the appropriate glyphs on your display.

The HarfBuzz library is used to perform font shaping.

The harfbuzz_features option allows specifying the features to enable when using harfbuzz for font shaping.

There is some light documentation here: https://harfbuzz.github.io/shaping-opentype-features.html but it boils down to allowing opentype feature names to be specified using syntax similar to the CSS font-feature-settings options: https://developer.mozilla.org/en-US/docs/Web/CSS/font-feature-settings. The OpenType spec lists a number of features here: https://docs.microsoft.com/en-us/typography/opentype/spec/featurelist

Options of likely interest will be:

If you want to disable ligatures in most fonts, then you may want to use a setting like this:

config.harfbuzz_features = { 'calt=0', 'clig=0', 'liga=0' }

Some fonts make available extended options via stylistic sets. If you use the Fira Code font, it lists available stylistic sets here: https://github.com/tonsky/FiraCode/wiki/How-to-enable-stylistic-sets

and you can set them in wezterm:

-- Use this for a zero with a line through it rather than a dot
-- when using the Fira Code font
config.harfbuzz_features = { 'zero' }

{{since('20220101-133340-7edc5b5a')}}

You can specify harfbuzz_features on a per-font basis, rather than globally for all fonts:

config.font = wezterm.font {
  family = 'JetBrains Mono',
  harfbuzz_features = { 'calt=0', 'clig=0', 'liga=0' },
}

and this example disables ligatures for JetBrains Mono, but keeps the default for the other fonts in the fallback:

config.font = wezterm.font_with_fallback {
  {
    family = 'JetBrains Mono',
    weight = 'Medium',
    harfbuzz_features = { 'calt=0', 'clig=0', 'liga=0' },
  },
  { family = 'Terminus', weight = 'Bold' },
  'Noto Color Emoji',
}

wezterm allows assigning action(s) to specific key events, and comes pre-configured with a number of commonly useful assignments.

This page describes how key presses are handled and turned into actions or sent to the terminal as text.

It's important to understand these concepts when considering keyboard input; first, some operating system concepts:

  • Input Method Editor (IME) - An OS-provided service which allows for rich composition of input, often with a pop-over candidate selection window. This is commonly used for Asian input, but on some systems the IME may also be responsible for emoji input or dead keys. The IME may have multiple modes per language and those modes can be changed dynamically.
  • Keyboard Layout - An OS configuration that describes how to translate physical key button presses into inputs appropriate to the user's preferred input locale. The mapping performed by the layout is largely opaque to applications and, on most systems, can be changed dynamically.
  • Dead Key - a keyboard layout may define these modal keys which don't immediately produce output (and thus appears to be "dead"), but instead holds some state that will compose with a subsequently pressed key. Most commonly used for example in European layouts to produce accented versions of the plain latin alphabet.
  • Physical Key - a way to identify a key based on its hardware-dependent location. wezterm can refer to keys based on code they would emit if configured to use an ANSI US English keyboard layout (even if that layout is not currently active), or based on its raw scan code.
  • Mapped key - a way to identify a key after the keyboard layout has been applied by the OS.
  • Modifier - A key such as SHIFT, CTRL, CMD, ALT that can be held simultaneously while other keys are pressed. Modifier keys are special because keyboard hardware traditionally only supports those four modifiers, and that detail is ingrained into most OS input APIs.

And then some wezterm concepts:

  • Key Assignment - an action assigned to a matching key and modifier combination.
  • Key Table - a grouping of key assignments. For each window, wezterm maintains a stack of table activations, allowing for rich modal keyboard input customization

Keyboard Processing Flow

This schematic depicts the processing flow for keyboard events in wezterm:

{% raw %}

flowchart TD
A[OS Generates a Key Event]
A --> B{{Is IME enabled?}}
B -->|Yes| C[Deliver event to IME] --> C1{{IME Response}}
B -->|No| F
C1 -->|Composed| D[Make RawKeyEvent from<br/> Composed text] --> RAW1
C1 -->|Composing| E[Render composing status]
C1 -->|Continue| F[Make RawKeyEvent] --> RAW1

RAW1{{match a phys: mapping?}}
RAW1 -->|Yes| RAWDONE1(( ))
RAW1 -->|No| RAW2{{match a raw: mapping?}}
RAW2 -->|Yes| RAWDONE1
RAW2 -->|No| RAW3{{match a mapped: mapping?}}
RAW3 -->|Yes| RAWDONE1
RAW3 -->|No| DEAD1{{Does RawKeyEvent complete a dead-key?}}

DEAD1 -->|Yes| I[Make KeyEvent from<br/>expanded dead key] --> KEY1
DEAD1 -->|No| DEAD2{{Does RawKeyEvent start a dead-key?}}
DEAD2 -->|No| J[Make KeyEvent from<br/>RawKeyEvent] --> KEY1
DEAD2 -->|Yes| DEADCOMP[Render composing status]

KEY1{{match a phys: mapping?}}
KEY1 -->|Yes| RAWDONE2(( ))
KEY1 -->|No| KEY2{{match a raw: mapping?}}
KEY2 -->|Yes| RAWDONE2
KEY2 -->|No| KEY3{{match a mapped: mapping?}}
KEY3 -->|Yes| RAWDONE2
KEY3 -->|No| M[Send key to terminal]

RAWDONE1 --> RAWDONE3[Perform assignment action]
RAWDONE2 --> RAWDONE3

{% endraw %}

Alt / Option Key Behavior & Composed Keys

The operating system has its own user selectable keymap that is sometimes at odds with old-school terminal emulation that pre-dates internationalization as a concept. WezTerm tries to behave reasonably by default, but also give you control in other situations.

Layouts with an AltGr key

If you have, for example, a European keyboard layout with an AltGr key then wezterm will respect the composition effects of AltGr produced by the system. For example, in a German keymap, AltGr < will produce |.

If your physical keyboard doesn't match the keyboard layout (eg: using a US keyboard with DEU selected in the OS), then the right hand Alt key is often re-interpreted as having the AltGr function with behavior as described above.

The left Alt will be treated as a modifier with no composition effects.

Microsoft Windows and Ctrl-Alt <-> AltGr

If you are using VNC and a keyboard layout with dead keys, then you may wish to enable treat_left_ctrlalt_as_altgr.

macOS Left and Right Option Key

{{since('20200620-160318-e00b076c')}}

The default behavior is to treat the left Option key as the Alt modifier with no composition effects, while the right Option key performs composition (making it approximately equivalent to AltGr on other operating systems).

You can control this behavior in your configuration:

config.send_composed_key_when_left_alt_is_pressed = false
config.send_composed_key_when_right_alt_is_pressed = true

{{since('20210203-095643-70a364eb')}}

WezTerm is now able to perform dead-key expansion when use_ime = false. Dead keys are treated as composition effects, so with the default settings of send_composed_key_when_left_alt_is_pressed and send_composed_key_when_right_alt_is_pressed above, in a US layout, Left-Opt n will produce Alt N and Right-Opt n will for a subsequent key press before generating an event; Right-Opt n SPACE will emit ~ whereas Right-Opt n n will emit ñ.

You may also set use_dead_keys = false to skip the hold state; continuing the example above, Right-Opt n will then immediately produce ~.

Input Method Editor (IME)

WezTerm has support for using the operating system Input Method Editor (IME) on some operating systems.

The use_ime docs have more information.

Dead Keys

{{since('20201031-154415-9614e117')}}

By default, if you are using a layout with dead keys (eg: US International layout, or a number of European layouts such as German or French) pressing a dead key in wezterm will "hold" the dead key until the next character is pressed, resulting in a combined character with a diacritic. For example, pressing ^ and then e will produce ê. Pressing ^ then SPACE will produce ^ on its own.

If you are a heavy user of Vi style editors then you may wish to disable dead key processing so that ^ can be used with a single keypress.

You can tell WezTerm to disable dead keys by setting this in your configuration file:

config.use_dead_keys = false

Note that for X11 systems with use_ime=true, depending on the configured IME, the IME may handle dead key processing implicitly. There is no way for wezterm to prevent it from doing that, short of disabling the IME.

Defining Assignments for key combinations that may be composed

When a key combination produces a composed key result, wezterm will look up both the composed and uncomposed versions of the keypress in your key mappings. If either lookup matches your assignment, that will take precedence over the normal key processing.

Configuring Key Assignments

The default key table assignments can be overridden or extended using the keys section in your ~/.wezterm.lua config file. For example, you can disable a default assignment like this:

config.keys = {
  -- Turn off the default CMD-m Hide action, allowing CMD-m to
  -- be potentially recognized and handled by the tab
  {
    key = 'm',
    mods = 'CMD',
    action = wezterm.action.DisableDefaultAssignment,
  },
}

The action value can be one of the available key assignments. Every action has an example that shows how to use it.

Possible Modifier labels are:

  • SUPER, CMD, WIN - these are all equivalent: on macOS the Command key, on Windows the Windows key, on Linux this can also be the Super or Hyper key. Left and right are equivalent.
  • CTRL - The control key. Left and right are equivalent.
  • SHIFT - The shift key. Left and right are equivalent.
  • ALT, OPT, META - these are all equivalent: on macOS the Option key, on other systems the Alt or Meta key. Left and right are equivalent.
  • LEADER - a special modal modifier state managed by wezterm. See Leader Key for more information.
  • VoidSymbol - This keycode is emitted in special cases where the original function of the key has been removed. Such as in Linux and using setxkbmap. setxkbmap -option caps:none. The CapsLock will no longer function as before in all applications, instead emitting VoidSymbol.

You can combine modifiers using the | symbol (eg: "CMD|CTRL").

The key value can be one of the following keycode identifiers. Note that not all of these are meaningful on all platforms:

Hyper, Super, Meta, Cancel, Backspace, Tab, Clear, Enter, Shift, Escape, LeftShift, RightShift, Control, LeftControl, RightControl, Alt, LeftAlt, RightAlt, Menu, LeftMenu, RightMenu, Pause, CapsLock, VoidSymbol, PageUp, PageDown, End, Home, LeftArrow, RightArrow, UpArrow, DownArrow, Select, Print, Execute, PrintScreen, Insert, Delete, Help, LeftWindows, RightWindows, Applications, Sleep, Numpad0, Numpad1, Numpad2, Numpad3, Numpad4, Numpad5, Numpad6, Numpad7, Numpad8, Numpad9, Multiply, Add, Separator, Subtract, Decimal, Divide, NumLock, ScrollLock, BrowserBack, BrowserForward, BrowserRefresh, BrowserStop, BrowserSearch, BrowserFavorites, BrowserHome, VolumeMute, VolumeDown, VolumeUp, MediaNextTrack, MediaPrevTrack, MediaStop, MediaPlayPause, ApplicationLeftArrow, ApplicationRightArrow, ApplicationUpArrow, ApplicationDownArrow, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, F13, F14, F15, F16, F17, F18, F19, F20, F21, F22, F23, F24.

Alternatively, a single unicode character can be specified to indicate pressing the corresponding key.

Pay attention to the case of the text that you use and the state of the SHIFT modifier, as key="A" will match

Physical vs Mapped Key Assignments

{{since('20220319-142410-0fcdea07')}}

The key value can refer either to the physical position of a key on an ANSI US keyboard or to the post-keyboard-layout-mapped value produced by a key press.

You can explicitly assign using the physical position by adding a phys: prefix to the value, for example: key="phys:A". This will match key presses for the key that would be in the position of the A key on an ANSI US keyboard.

You can explicitly assign the mapped key by adding a mapped: prefix to the value, for example: key="mapped:a" will match a key press where the OS keyboard layout produces a, regardless of its physical position.

If you omit an explicit prefix, wezterm will assume phys: and use the physical position of the specified key.

The default key assignments listed above use phys:. In previous releases there was no physical position support and those assignments were all mapped:.

When upgrading from earlier releases, if you had {key="N", mods="CMD", ..} in your config, you will need to change it to either {key="N", mods="CMD|SHIFT", ..} or {key="mapped:N", mods="CMD", ..} in order to continue to respect the SHIFT modifier.

{{since('20220408-101518-b908e2dd')}}

A new key_map_preference option controls how keys without an explicit phys: or mapped: prefix are treated. If key_map_preference = "Mapped" (the default), then mapped: is assumed. If key_map_preference = "Physical" then phys: is assumed.

The default key assignments will respect key_map_preference.

Raw Key Assignments

In some cases, wezterm may not know how to represent a key event in either its phys: or mapped: forms. In that case, you may wish to define an assignment in terms of the underlying operating system key code, using a raw: prefix.

Similar in concept to the phys: mapping described above, the raw: mapping is independent of the OS keyboard layout. Raw codes are hardware and windowing system dependent, so there is no portable way to list which key does what.

To discover these values, you can set debug_key_events = true and press the keys of interest.

You can specify a raw key value of 123 by using key="raw:123" in your config rather than one of the other key values.

Leader Key

{{since('20201031-154415-9614e117')}}

A leader key is a a modal modifier key. If leader is specified in the configuration then pressing that key combination will enable a virtual LEADER modifier.

While LEADER is active, only defined key assignments that include LEADER in the mods mask will be recognized. Other keypresses will be swallowed and NOT passed through to the terminal.

LEADER stays active until a keypress is registered (whether it matches a key binding or not), or until it has been active for the duration specified by timeout_milliseconds, at which point it will automatically cancel itself.

Here's an example configuration using LEADER. In this configuration, pressing CTRL-A activates the leader key for up to 1 second (1000 milliseconds). While LEADER is active, the | key (with no other modifiers) will trigger the current pane to be split.

-- timeout_milliseconds defaults to 1000 and can be omitted
config.leader = { key = 'a', mods = 'CTRL', timeout_milliseconds = 1000 }
config.keys = {
  {
    key = '|',
    mods = 'LEADER|SHIFT',
    action = wezterm.action.SplitHorizontal { domain = 'CurrentPaneDomain' },
  },
  -- Send "CTRL-A" to the terminal when pressing CTRL-A, CTRL-A
  {
    key = 'a',
    mods = 'LEADER|CTRL',
    action = wezterm.action.SendKey { key = 'a', mods = 'CTRL' },
  },
}

VoidSymbol

{{since('20210814-124438-54e29167')}}

On X11 systems, If you decide to change certain keys on the keyboard to VoidSymbol (like CapsLock), then you can utilize it as a LEADER or any other part of key bindings. The following example now uses VoidSymbol and uses CapsLock as a LEADER without it affecting the shift / capital state as long as you have setxkbmap -option caps:none configured.

-- timeout_milliseconds defaults to 1000 and can be omitted
-- for this example use `setxkbmap -option caps:none` in your terminal.
config.leader = { key = 'VoidSymbol', mods = '', timeout_milliseconds = 1000 }
config.keys = {
  {
    key = '|',
    mods = 'LEADER|SHIFT',
    action = wezterm.action.SplitHorizontal { domain = 'CurrentPaneDomain' },
  },
  {
    key = '-',
    mods = 'LEADER',
    action = wezterm.action.SplitVertical { domain = 'CurrentPaneDomain' },
  },
}

Available Actions

See the KeyAssignment reference for information on available actions.

{{since('20220408-101518-b908e2dd')}}

In addition to the default key table defined by the keys configuration option, wezterm supports defining additional named key tables using the key_tables configuration option.

On its own, a named table doesn't do anything, but when paired with the ActivateKeyTable action, some powerful keyboard customization is possible.

As a motivating example, let's consider working with panes. In the default config CTRL+SHIFT+ArrowKey will activate a pane in the direction of the arrow key, while CTRL+SHIFT+ALT+ArrowKey will resize a pane in the direction of the arrow key. Our goal is to avoid holding down so many keys at once, or even having to remember so many key combinations, so what we'd like to do is use CTRL-SHIFT-SPACE as a leader prefix to select between resize and activation modes, using r for resize and a for activation:

local wezterm = require 'wezterm'
local act = wezterm.action
local config = {}

-- Show which key table is active in the status area
wezterm.on('update-right-status', function(window, pane)
  local name = window:active_key_table()
  if name then
    name = 'TABLE: ' .. name
  end
  window:set_right_status(name or '')
end)

config.leader = { key = 'Space', mods = 'CTRL|SHIFT' }
config.keys = {
  -- CTRL+SHIFT+Space, followed by 'r' will put us in resize-pane
  -- mode until we cancel that mode.
  {
    key = 'r',
    mods = 'LEADER',
    action = act.ActivateKeyTable {
      name = 'resize_pane',
      one_shot = false,
    },
  },

  -- CTRL+SHIFT+Space, followed by 'a' will put us in activate-pane
  -- mode until we press some other key or until 1 second (1000ms)
  -- of time elapses
  {
    key = 'a',
    mods = 'LEADER',
    action = act.ActivateKeyTable {
      name = 'activate_pane',
      timeout_milliseconds = 1000,
    },
  },
}

config.key_tables = {
  -- Defines the keys that are active in our resize-pane mode.
  -- Since we're likely to want to make multiple adjustments,
  -- we made the activation one_shot=false. We therefore need
  -- to define a key assignment for getting out of this mode.
  -- 'resize_pane' here corresponds to the name="resize_pane" in
  -- the key assignments above.
  resize_pane = {
    { key = 'LeftArrow', action = act.AdjustPaneSize { 'Left', 1 } },
    { key = 'h', action = act.AdjustPaneSize { 'Left', 1 } },

    { key = 'RightArrow', action = act.AdjustPaneSize { 'Right', 1 } },
    { key = 'l', action = act.AdjustPaneSize { 'Right', 1 } },

    { key = 'UpArrow', action = act.AdjustPaneSize { 'Up', 1 } },
    { key = 'k', action = act.AdjustPaneSize { 'Up', 1 } },

    { key = 'DownArrow', action = act.AdjustPaneSize { 'Down', 1 } },
    { key = 'j', action = act.AdjustPaneSize { 'Down', 1 } },

    -- Cancel the mode by pressing escape
    { key = 'Escape', action = 'PopKeyTable' },
  },

  -- Defines the keys that are active in our activate-pane mode.
  -- 'activate_pane' here corresponds to the name="activate_pane" in
  -- the key assignments above.
  activate_pane = {
    { key = 'LeftArrow', action = act.ActivatePaneDirection 'Left' },
    { key = 'h', action = act.ActivatePaneDirection 'Left' },

    { key = 'RightArrow', action = act.ActivatePaneDirection 'Right' },
    { key = 'l', action = act.ActivatePaneDirection 'Right' },

    { key = 'UpArrow', action = act.ActivatePaneDirection 'Up' },
    { key = 'k', action = act.ActivatePaneDirection 'Up' },

    { key = 'DownArrow', action = act.ActivatePaneDirection 'Down' },
    { key = 'j', action = act.ActivatePaneDirection 'Down' },
  },
}

return config

Key Table Activation Stack

Each wezterm GUI window maintains a stack of activations, which allows you to create complex layering of keyboard customization.

The ActivateKeyTable action will push an entry to the stack, and provides one_shot and timeout_milliseconds fields to affect when/how it will pop itself from the stack, and replace_current to implicitly pop the current entry from the stack.

The PopKeyTable action will explicitly pop an entry from the stack.

The ClearKeyTableStack action will clear the entire stack.

The stack is also cleared when the configuration is reloaded, so if you're working on a complex key table setup and get stuck, you may be able to unstick yourself by re-saving your wezterm configuration to trigger a reload.

{{since('20220624-141144-bd1b7c5d')}}

When resolving a key assignment, the top of stack is first searched for a match, and if one is not found, the next entry on the stack is searched and so on until a match is found.

In previous releases, only a single lookup was performed on the top of the stack.

The new behavior allows key table activations to effectively layer over the top of previously activated key assignments, making it a bit easier to compose key assignments.


search: boost: 20 keywords: default keys key tags:

  • keys

The default key assignments are shown in the table below.

You may also use wezterm show-keys --lua to see the assignments in a form that you can copy and paste into your own configuration.

ModifiersKeyAction
SUPERcCopyTo="Clipboard"
SUPERvPasteFrom="Clipboard"
CTRL+SHIFTcCopyTo="Clipboard"
CTRL+SHIFTvPasteFrom="Clipboard"
CopyCopyTo="Clipboard"
PastePasteFrom="Clipboard"
CTRLInsertCopyTo="PrimarySelection" {{since('20210203-095643-70a364eb', inline=True)}}
SHIFTInsertPasteFrom="PrimarySelection"
SUPERmHide
SUPERnSpawnWindow
CTRL+SHIFTnSpawnWindow
ALTEnterToggleFullScreen
SUPER-DecreaseFontSize
CTRL-DecreaseFontSize
SUPER=IncreaseFontSize
CTRL=IncreaseFontSize
SUPER0ResetFontSize
CTRL0ResetFontSize
SUPERtSpawnTab="CurrentPaneDomain"
CTRL+SHIFTtSpawnTab="CurrentPaneDomain"
SUPER+SHIFTTSpawnTab="DefaultDomain"
SUPERwCloseCurrentTab{confirm=true}
SUPER1ActivateTab=0
SUPER2ActivateTab=1
SUPER3ActivateTab=2
SUPER4ActivateTab=3
SUPER5ActivateTab=4
SUPER6ActivateTab=5
SUPER7ActivateTab=6
SUPER8ActivateTab=7
SUPER9ActivateTab=-1
CTRL+SHIFTwCloseCurrentTab{confirm=true}
CTRL+SHIFT1ActivateTab=0
CTRL+SHIFT2ActivateTab=1
CTRL+SHIFT3ActivateTab=2
CTRL+SHIFT4ActivateTab=3
CTRL+SHIFT5ActivateTab=4
CTRL+SHIFT6ActivateTab=5
CTRL+SHIFT7ActivateTab=6
CTRL+SHIFT8ActivateTab=7
CTRL+SHIFT9ActivateTab=-1
SUPER+SHIFT[ActivateTabRelative=-1
CTRL+SHIFTTabActivateTabRelative=-1
CTRLPageUpActivateTabRelative=-1
SUPER+SHIFT]ActivateTabRelative=1
CTRLTabActivateTabRelative=1
CTRLPageDownActivateTabRelative=1
CTRL+SHIFTPageUpMoveTabRelative=-1
CTRL+SHIFTPageDownMoveTabRelative=1
SHIFTPageUpScrollByPage=-1
SHIFTPageDownScrollByPage=1
SUPERrReloadConfiguration
CTRL+SHIFTRReloadConfiguration
SUPERhHideApplication (macOS only)
SUPERkClearScrollback="ScrollbackOnly"
CTRL+SHIFTKClearScrollback="ScrollbackOnly"
CTRL+SHIFTLShowDebugOverlay {{since('20210814-124438-54e29167', inline=True)}}
CTRL+SHIFTPActivateCommandPalette {{since('20230320-124340-559cb7b0', inline=True)}}
CTRL+SHIFTUCharSelect {{since('20220903-194523-3bb1ed61', inline=True)}}
SUPERfSearch={CaseSensitiveString=""}
CTRL+SHIFTFSearch={CaseSensitiveString=""}
CTRL+SHIFTXActivateCopyMode
CTRL+SHIFTSpaceQuickSelect {{since('20210502-130208-bff6815d', inline=True)}}
CTRL+SHIFT+ALT"SplitVertical={domain="CurrentPaneDomain"}
CTRL+SHIFT+ALT%SplitHorizontal={domain="CurrentPaneDomain"}
CTRL+SHIFT+ALTLeftArrowAdjustPaneSize={"Left", 1}
CTRL+SHIFT+ALTRightArrowAdjustPaneSize={"Right", 1}
CTRL+SHIFT+ALTUpArrowAdjustPaneSize={"Up", 1}
CTRL+SHIFT+ALTDownArrowAdjustPaneSize={"Down", 1}
CTRL+SHIFTLeftArrowActivatePaneDirection="Left"
CTRL+SHIFTRightArrowActivatePaneDirection="Right"
CTRL+SHIFTUpArrowActivatePaneDirection="Up"
CTRL+SHIFTDownArrowActivatePaneDirection="Down"
CTRL+SHIFTZTogglePaneZoomState

If you don't want the default assignments to be registered, you can disable all of them with this configuration; if you chose to do this, you must explicitly register every binding.

config.disable_default_key_bindings = true

!!! tip When using disable_default_key_bindings, it is recommended that you assign ShowDebugOverlay to something to aid in potential future troubleshooting.

Likewise, you may wish to assign
[ActivateCommandPalette](lua/keyassignment/ActivateCommandPalette.md).

Keyboard Encoding

When input that doesn't match a key assignment is processed, it is encoded into a byte stream and sent to the PTY associated with the program that is running in the active pane.

The default encoding scheme used by wezterm is xterm compatible, but there are some configuration options that can modify the encoding.

The standard xterm compatible encoding generates events for key presses (but not releases) and can represent the set of keys that existed on terminal hardware of the 1980's.

That scheme has worked well for quite some time, but has some ambiguity due to the way that the Control modifier "shifts" the ASCII representation of keypresses like Control-I to be ASCII Tab, as an example.

xterm modifyOtherKeys

{{since('20221119-145034-49b9839f')}}

When wezterm receives the sequence CSI >4;Nm, where N is 0, 1 or 2, the keyboard encoding is changed according to modifyOtherKeys, which causes certain modified keys to be encoded as described in xterms docs, making it possible for applications to distinguish between the modified and unmodified key presses.

Note that enable_csi_u_key_encoding and allow_win32_input_mode both take precedence over this behavior.

CSI-u/fixterms/libtickit

Fix Keyboard Input on Terminals is an attempt at resolving the ambiguous encoding and doing a better job at representing more modifiers. It's not a perfect attempt as there are a number of issues with it.

You can enable support for this encoding by setting enable_csi_u_key_encoding = true, however, it is not recommended as it does change the behavior of some keys in backwards incompatible ways and there isn't a way for applications to detect or request this behavior.

See also: enable_csi_u_key_encoding.

Note that allow_win32_input_mode takes precedence over this option.

Kitty Keyboard Protocol

The Kitty terminal extended and enhanced the CSI-u based encoding scheme with its Comprehensive keyboard handling protocol.

The kitty protocol allows applications to request varying degrees of enhancement over the standard encoding scheme and also allows for more modifier keys (notably: CMD/Super/Windows) to be reported to the application.

enable_kitty_keyboard controls whether wezterm will honor the application requests to modify the keyboard encoding.

Windows

On Windows, allow_win32_input_mode defaults to true which causes wezterm to listen for an escape sequence generated by the ConPTY layer of Windows to enable Win32 Input Mode.

In this mode, key release events as well as events that can distinguish between positional (left/right) modifier keys are generated and this mode provides the best compatibility with win32 console applications such as Far Manager.

allow_win32_input_mode takes precedence over enable_csi_u_key_encoding.


tags:

  • mouse

Mouse bindings are configurable, and there are a number of default assignments described below.

The assignments are based around a triggering mouse event which may be combined with a set of modifier keys to produce an action.

By default applications running in the terminal don't respond to the mouse. However, applications can emit escape sequences to request mouse event tracking. When mouse event tracking is enabled, mouse events are NOT matched against the mouse assignments and are instead passed through to the application.

You can bypass the mouse reporting capture by holding down the SHIFT key; that will prevent the event from being passed to the application and allow matching it against your assignments as though the SHIFT key were not pressed.

The bypass_mouse_reporting_modifiers option allows you to specify an alternative set of modifiers to use for bypassing mouse reporting capture.

Default Mouse Assignments

Note: you can run wezterm show-keys to show the effective key and mouse assignments.

In the table below, Triple Left Down means that the left mouse button is being triple clicked and that the event matches the downstroke of the third quick consecutive press. Triple Left Up matches the subsequent release event of that triple click, so for a triple click both SelectTextAtMouseCursor="Line" and CompleteSelection will be triggered in that order.

NOTE: In the action column, act is an alias to wezterm.action (to avoid repetition):

local act = wezterm.action
EventModifiersAction
Triple Left DownNONEact.SelectTextAtMouseCursor("Line")
Double Left DownNONEact.SelectTextAtMouseCursor("Word")
Single Left DownNONEact.SelectTextAtMouseCursor("Cell")
Single Left DownSHIFTact.ExtendSelectionToMouseCursor("Cell")
Single Left DownALTact.SelectTextAtMouseCursor("Block") {{since('20220624-141144-bd1b7c5d', inline=True)}}
Single Left UpSHIFTact.CompleteSelectionOrOpenLinkAtMouseCursor("ClipboardAndPrimarySelection")
Single Left UpNONEact.CompleteSelectionOrOpenLinkAtMouseCursor("ClipboardAndPrimarySelection")
Single Left UpALTact.CompleteSelection("ClipboardAndPrimarySelection") {{since('20220624-141144-bd1b7c5d', inline=True)}}
Double Left UpNONEact.CompleteSelection("ClipboardAndPrimarySelection")
Triple Left UpNONEact.CompleteSelection("ClipboardAndPrimarySelection")
Single Left DragNONEact.ExtendSelectionToMouseCursor("Cell")
Single Left DragALTact.ExtendSelectionToMouseCursor("Block") {{since('20220624-141144-bd1b7c5d', inline=True)}}
Single Left DownALT+SHIFTact.ExtendSelectionToMouseCursor("Block") {{since('20220624-141144-bd1b7c5d', inline=True)}}
Single Left UpALT+SHIFTact.CompleteSelection("ClipboardAndPrimarySelection") {{since('20220624-141144-bd1b7c5d', inline=True)}}
Double Left DragNONEact.ExtendSelectionToMouseCursor("Word")
Triple Left DragNONEact.ExtendSelectionToMouseCursor("Line")
Single Middle DownNONEact.PasteFrom("PrimarySelection")
Single Left DragSUPERact.StartWindowDrag (since 20210314-114017-04b7cedd)
Single Left DragCTRL+SHIFTact.StartWindowDrag (since 20210314-114017-04b7cedd)

If you don't want the default assignments to be registered, you can disable all of them with this configuration; if you chose to do this, you must explicitly register every binding.

config.disable_default_mouse_bindings = true

Configuring Mouse Assignments

{{since('20200607-144723-74889cd4')}}

You can define mouse actions using the mouse_bindings configuration section:

local wezterm = require 'wezterm'
local act = wezterm.action
local config = {}

config.mouse_bindings = {
  -- Right click sends "woot" to the terminal
  {
    event = { Down = { streak = 1, button = 'Right' } },
    mods = 'NONE',
    action = act.SendString 'woot',
  },

  -- Change the default click behavior so that it only selects
  -- text and doesn't open hyperlinks
  {
    event = { Up = { streak = 1, button = 'Left' } },
    mods = 'NONE',
    action = act.CompleteSelection 'ClipboardAndPrimarySelection',
  },

  -- and make CTRL-Click open hyperlinks
  {
    event = { Up = { streak = 1, button = 'Left' } },
    mods = 'CTRL',
    action = act.OpenLinkAtMouseCursor,
  },
  -- NOTE that binding only the 'Up' event can give unexpected behaviors.
  -- Read more below on the gotcha of binding an 'Up' event only.
}

return config

Each entry in the mouse binding table can have the following fields:

  • event - the mouse event on which to trigger. Described in detail below.
  • mods - the keyboard modifier keys that must be active in order to match the event. mods have the same definition and meaning as for key assignments and are described in more detail in Configuring Key Assignments.
  • action - the action to take when this mouse binding is matched
  • mouse_reporting - an optional boolean that defaults to false. This mouse binding entry will only be considered if the current pane's mouse reporting state matches. In general, you should avoid defining assignments that have mouse_reporting=true as it will prevent the application running in the pane from receiving that mouse event. You can, of course, define these and still send your mouse event to the pane by holding down the configured mouse reporting bypass modifier key. {{since('20220807-113146-c2fee766', inline=True)}}
  • alt_screen - an optional field that defaults to 'Any', but that can also be set to either true or false. This mouse binding entry will only be considered if the current pane's alt screen state matches this field. Most of the default mouse assignments are defined as alt_screen='Any', a notable exception being that mouse wheel scrolling only applies when alt_screen=false, as the mouse wheel is typically mapped to arrow keys by the terminal in alt screen mode. {{since('20220807-113146-c2fee766', inline=True)}}.

The action and mods portions are described in more detail in the key assignment information below.

The event portion has three components:

  • Whether it is a Down, Up or Drag event
  • The number of consecutive clicks within the click threshold (the click streak)
  • The mouse button; Left, Right, or Middle.

A double click is a down-up-down sequence where either the second button down is held for long enough or is released and no subsequent down event occurs within the click threshold. When recognized, it emits a Down event with streak=2. If the mouse is moved while the button is held, a Drag event with streak=2 is generated. When the mouse button is released an Up event with streak=2 is generated.

The mouse event recognizer supports an arbitrary click streak, so if you wanted quadruple-click bindings you can specify streak=4.

EventLua Representation
Triple Left Downevent={Down={streak=3, button="Left"}}
Double Left Upevent={Up={streak=2, button="Left"}}
Single Left Dragevent={Drag={streak=1, button="Left"}}

{{since('20220807-113146-c2fee766')}}

You can handle vertical wheel scroll events using the example shown below. The streak and amount associated with either WheelUp or WheelDown are set to 1 for the sake of simplicity of matching the event; you may use window:current_event, if to access the actual delta scroll value while handling the event.

local wezterm = require 'wezterm'
local act = wezterm.action
local config = {}

config.mouse_bindings = {
  -- Scrolling up while holding CTRL increases the font size
  {
    event = { Down = { streak = 1, button = { WheelUp = 1 } } },
    mods = 'CTRL',
    action = act.IncreaseFontSize,
  },

  -- Scrolling down while holding CTRL decreases the font size
  {
    event = { Down = { streak = 1, button = { WheelDown = 1 } } },
    mods = 'CTRL',
    action = act.DecreaseFontSize,
  },
}

return config

Gotcha on binding an 'Up' event only

If you only have a mouse bind on the 'Up' event and not on the 'Down' event, the 'Down' event will still be sent to the running program. If that program is tracking mouse inputs (like tmux or vim with mouse support), you may experience unintuitive behavior as the program receives the 'Down' event, but not the 'Up' event (which is bound to something in your config).

To avoid this, it is recommended to disable the 'Down' event (to ensure it won't be sent to the running program), for example:

local wezterm = require 'wezterm'
local act = wezterm.action
local config = {}

config.mouse_bindings = {
  -- Bind 'Up' event of CTRL-Click to open hyperlinks
  {
    event = { Up = { streak = 1, button = 'Left' } },
    mods = 'CTRL',
    action = act.OpenLinkAtMouseCursor,
  },
  -- Disable the 'Down' event of CTRL-Click to avoid weird program behaviors
  {
    event = { Down = { streak = 1, button = 'Left' } },
    mods = 'CTRL',
    action = act.Nop,
  },
}
return config

Available Actions

See the KeyAssignment reference for information on available actions.

Introduction

A Wezterm plugin is a package of Lua files that provide some some predefined functionality not in the core product.

A plugin is distributed via a Git URL.

!!! Tip

Michael Brusegard maintains a [list of plugins](https://github.com/michaelbrusegard/awesome-wezterm)

Installing a Plugin

Brief example:

local wezterm = require 'wezterm'
local a_plugin = wezterm.plugin.require 'https://github.com/owner/repo'

local config = wezterm.config_builder()

a_plugin.apply_to_config(config)

return config

The plugin URL must use the HTTPS or file protocol.

When Wezterm clones the repo into the runtime directory the default branch (probably main) is checked out and used as the plugin source.

Plugins can be configured, for example:

local wezterm = require 'wezterm'
local a_plugin = wezterm.plugin.require 'https://github.com/owner/repo'

local config = wezterm.config_builder()

local myPluginConfig = { enable = true, location = 'right' }

a_plugin.apply_to_config(config, myPluginConfig)

return config

!!! Note

Consult the README for a particular plugin to discover any specific configuration options.

Updating Plugins

When changes are published to a plugin repository they are not updated in the local Wezterm instance.

Run the command wezterm.plugin.update_all() to update all local plugins.

!!! Tip

This can be run using the Lua REPL in [DebugOverlay](../troubleshooting.md#debug-overlay).

Removing a Plugin

When a plugin is first referenced, wezterm.plugin.require() will clone the repo if it doesn't already exist and store it in the runtime directory under plugins/NAME where NAME is derived from the repo URL.

You can discover locations of the various plugins with wezterm.plugin.list().

To remove the plugin simply delete the appropriate plugin directory.

Developing a Plugin

  1. Create a local development repo
  2. Add a file plugin/init.lua
  3. init.lua must return a module that exports an apply_to_config function. This function must accept at least a config builder parameter, but may pass other parameters, or a Lua table with a config field that maps to a config build parameter
  4. Add any other Lua code needed to fulfil the plugin feature set.
  5. Add the plugin using a local file url e.g.
    local a_plugin = wezterm.plugin.require "file:///home/user/projects/myPlugin"
    

!!! Info When changes are made to the local project, wezterm.plugin.update_all() must be run to sync the changes into the Wezterm runtime directory for testing and use.

!!! Info This assumes development on the repo default branch (i.e. main). To use a different development branch see below.

Managing a Plugin with Multiple Lua Modules

When requiring other Lua modules in your plugin the value of package.path needs to updated with the location of the plugin. The plugin directory can be obtained by running wezterm.plugin.list(). This function returns an array of triplets. e.g.

[
    {
        "component": "filesCssZssZssZsUserssZsdevelopersZsprojectssZsmysDsPlugin",
        "plugin_dir": "/Users/alec/Library/Application Support/wezterm/plugins/filesCssZssZssZsUserssZsalecsZsprojectssZsbarsDswezterm",
        "url": "file:///Users/developer/projects/my.Plugin",
    },
]

The package path can then be updated with the value of plugin_dir. For example:

function findPluginPackagePath(myProject)
  local separator = package.config:sub(1, 1) == '\\' and '\\' or '/'
  for _, v in ipairs(wezterm.plugin.list()) do
    if v.url == myProject then
      return v.plugin_dir .. separator .. 'plugin' .. separator .. '?.lua'
    end
  end
  --- #TODO Add error fail here
end

package.path = package.path
  .. ';'
  .. findPluginPackagePath 'file:///Users/developer/projects/my.Plugin'

!!! Tip Review other published plugins to discover more details on how to structure a plugin project

Making changes to a Existing Plugin

  1. Remove the original plugin from Wezterm
  2. Fork the plugin repo
  3. Clone the repo to a local directory
  4. Optionally set an upstream remote to the original plugin repo. This makes it easier it merge upstream changes
  5. Create a new branch for development
  6. Make the new branch the default branch with git symbolic-ref HEAD refs/heads/mybranch
  7. Set the plugin_dir if required (some plugins hard code the value of the plugin directory).
  8. Add the plugin to Wezterm using the file protocol

Proceed using the develop workflow above

1001 Color schemes listed by first letter


title: Color Schemes with first letter "3"

3024 (base16)

Author: `Jan T. Sott (http://github.com/idleberg)`
Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `3024 (dark) (terminal.sexy)`.

To use this scheme, add this to your config:

config.color_scheme = '3024 (base16)'

3024 (dark) (terminal.sexy)

Author: `Chris Kempson`
Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = '3024 (dark) (terminal.sexy)'

3024 (light) (terminal.sexy)

Author: `Chris Kempson`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = '3024 (light) (terminal.sexy)'

3024 Day

Author: `Jan T. Sott (http://github.com/idleberg)`
Source:
This scheme is also known as `3024 Day (Gogh)`, `3024Day (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = '3024 Day'

3024 Day (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = '3024 Day (Gogh)'

3024 Night

Author: `Jan T. Sott (http://github.com/idleberg)`
Source:
This scheme is also known as `3024 Night (Gogh)`, `3024Night (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = '3024 Night'

3024 Night (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = '3024 Night (Gogh)'

title: Color Schemes with first letter "a"

Aardvark Blue

Source:
{{since('20240127-113634-bbcac864')}}

To use this scheme, add this to your config:

config.color_scheme = 'Aardvark Blue'

Abernathy

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Abernathy'

Aci (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Aci (Gogh)'

Aco (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Aco (Gogh)'

Adventure

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Adventure'

Adventure Time (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Adventure Time (Gogh)'

AdventureTime

Source:
This scheme is also known as `Adventure Time (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'AdventureTime'

Afterglow

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Afterglow'

Afterglow (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Afterglow (Gogh)'

aikofog (terminal.sexy)

Author: `Gutterslob`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'aikofog (terminal.sexy)'

Alabaster

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Alabaster'

Alien Blood (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Alien Blood (Gogh)'

AlienBlood

Source:
This scheme is also known as `Alien Blood (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'AlienBlood'

Andromeda

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Andromeda'

Apathy (base16)

Author: `Jannik Siebert (https://github.com/janniks)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Apathy (base16)'

Apple Classic

Source:
{{since('20230320-124340-559cb7b0')}}

To use this scheme, add this to your config:

config.color_scheme = 'Apple Classic'

Apple System Colors

Source:
{{since('20240127-113634-bbcac864')}}

To use this scheme, add this to your config:

config.color_scheme = 'Apple System Colors'

Apprentice (base16)

Author: `romainl`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Apprentice (base16)'

Apprentice (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Apprentice (Gogh)'

arcoiris

Source:

To use this scheme, add this to your config:

config.color_scheme = 'arcoiris'

Argonaut

Source:
This scheme is also known as `Argonaut (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Argonaut'

Argonaut (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Argonaut (Gogh)'

Arthur

Source:
This scheme is also known as `Arthur (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Arthur'

Arthur (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Arthur (Gogh)'

Ashes (base16)

Author: `Jannik Siebert (https://github.com/janniks)`
Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `Ashes (dark) (terminal.sexy)`.

To use this scheme, add this to your config:

config.color_scheme = 'Ashes (base16)'

Ashes (dark) (terminal.sexy)

Author: `Chris Kempson`
Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Ashes (dark) (terminal.sexy)'

Ashes (light) (terminal.sexy)

Author: `Chris Kempson`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Ashes (light) (terminal.sexy)'

Astrodark (Gogh)

Source:
{{since('nightly builds only')}}

To use this scheme, add this to your config:

config.color_scheme = 'Astrodark (Gogh)'

astromouse (terminal.sexy)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'astromouse (terminal.sexy)'

Atelier Cave (base16)

Author: `Bram de Haan (http://atelierbramdehaan.nl)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Atelier Cave (base16)'

Atelier Cave Light (base16)

Author: `Bram de Haan (http://atelierbramdehaan.nl)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Atelier Cave Light (base16)'

Atelier Dune (base16)

Author: `Bram de Haan (http://atelierbramdehaan.nl)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Atelier Dune (base16)'

Atelier Dune Light (base16)

Author: `Bram de Haan (http://atelierbramdehaan.nl)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Atelier Dune Light (base16)'

Atelier Estuary (base16)

Author: `Bram de Haan (http://atelierbramdehaan.nl)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Atelier Estuary (base16)'

Atelier Estuary Light (base16)

Author: `Bram de Haan (http://atelierbramdehaan.nl)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Atelier Estuary Light (base16)'

Atelier Forest (base16)

Author: `Bram de Haan (http://atelierbramdehaan.nl)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Atelier Forest (base16)'

Atelier Forest Light (base16)

Author: `Bram de Haan (http://atelierbramdehaan.nl)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Atelier Forest Light (base16)'

Atelier Heath (base16)

Author: `Bram de Haan (http://atelierbramdehaan.nl)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Atelier Heath (base16)'

Atelier Heath Light (base16)

Author: `Bram de Haan (http://atelierbramdehaan.nl)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Atelier Heath Light (base16)'

Atelier Lakeside (base16)

Author: `Bram de Haan (http://atelierbramdehaan.nl)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Atelier Lakeside (base16)'

Atelier Lakeside Light (base16)

Author: `Bram de Haan (http://atelierbramdehaan.nl)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Atelier Lakeside Light (base16)'

Atelier Plateau (base16)

Author: `Bram de Haan (http://atelierbramdehaan.nl)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Atelier Plateau (base16)'

Atelier Plateau Light (base16)

Author: `Bram de Haan (http://atelierbramdehaan.nl)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Atelier Plateau Light (base16)'

Atelier Savanna (base16)

Author: `Bram de Haan (http://atelierbramdehaan.nl)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Atelier Savanna (base16)'

Atelier Savanna Light (base16)

Author: `Bram de Haan (http://atelierbramdehaan.nl)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Atelier Savanna Light (base16)'

Atelier Seaside (base16)

Author: `Bram de Haan (http://atelierbramdehaan.nl)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Atelier Seaside (base16)'

Atelier Seaside Light (base16)

Author: `Bram de Haan (http://atelierbramdehaan.nl)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Atelier Seaside Light (base16)'

Atelier Sulphurpool (base16)

Author: `Bram de Haan (http://atelierbramdehaan.nl)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Atelier Sulphurpool (base16)'

Atelier Sulphurpool Light (base16)

Author: `Bram de Haan (http://atelierbramdehaan.nl)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Atelier Sulphurpool Light (base16)'

Atelierdune (dark) (terminal.sexy)

Author: `Chris Kempson`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Atelierdune (dark) (terminal.sexy)'

Atelierdune (light) (terminal.sexy)

Author: `Chris Kempson`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Atelierdune (light) (terminal.sexy)'

Atelierforest (dark) (terminal.sexy)

Author: `Chris Kempson`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Atelierforest (dark) (terminal.sexy)'

Atelierforest (light) (terminal.sexy)

Author: `Chris Kempson`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Atelierforest (light) (terminal.sexy)'

Atelierheath (dark) (terminal.sexy)

Author: `Chris Kempson`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Atelierheath (dark) (terminal.sexy)'

Atelierheath (light) (terminal.sexy)

Author: `Chris Kempson`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Atelierheath (light) (terminal.sexy)'

Atelierlakeside (dark) (terminal.sexy)

Author: `Chris Kempson`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Atelierlakeside (dark) (terminal.sexy)'

Atelierlakeside (light) (terminal.sexy)

Author: `Chris Kempson`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Atelierlakeside (light) (terminal.sexy)'

Atelierseaside (dark) (terminal.sexy)

Author: `Chris Kempson`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Atelierseaside (dark) (terminal.sexy)'

Atelierseaside (light) (terminal.sexy)

Author: `Chris Kempson`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Atelierseaside (light) (terminal.sexy)'

AtelierSulphurpool

Source:

To use this scheme, add this to your config:

config.color_scheme = 'AtelierSulphurpool'

Atlas (base16)

Author: `Alex Lende (https://ajlende.com)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Atlas (base16)'

Atom

Source:
This scheme is also known as `Atom (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Atom'

Atom (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Atom (Gogh)'

AtomOneLight

Source:

To use this scheme, add this to your config:

config.color_scheme = 'AtomOneLight'

Aura (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Aura (Gogh)'

Aurora

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Aurora'

ayu

Source:

To use this scheme, add this to your config:

config.color_scheme = 'ayu'

Ayu Dark (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `AyuDark (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Ayu Dark (Gogh)'

Ayu Light (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `AyuLight (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Ayu Light (Gogh)'

Ayu Mirage

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Ayu Mirage'

Ayu Mirage (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `AyuMirage (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Ayu Mirage (Gogh)'

ayu_light

Source:

To use this scheme, add this to your config:

config.color_scheme = 'ayu_light'

Azu (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Azu (Gogh)'

title: Color Schemes with first letter "b"

Bamboo

Author: `Riley Bruins`
Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Bamboo'

Bamboo Light

Author: `Riley Bruins`
Source:
{{since('20240127-113634-bbcac864')}}

To use this scheme, add this to your config:

config.color_scheme = 'Bamboo Light'

Bamboo Multiplex

Author: `Riley Bruins`
Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Bamboo Multiplex'

Banana Blueberry

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Banana Blueberry'

Batman

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Batman'

Belafonte Day

Author: `Jan T. Sott`
Source:
This scheme is also known as `Belafonte Day (Gogh)`, `BelafonteDay (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Belafonte Day'

Belafonte Day (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Belafonte Day (Gogh)'

Belafonte Night

Author: `Jan T. Sott`
Source:
This scheme is also known as `Belafonte Night (Gogh)`, `BelafonteNight (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Belafonte Night'

Belafonte Night (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Belafonte Night (Gogh)'

Belge (terminal.sexy)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Belge (terminal.sexy)'

Bespin (base16)

Author: `Jan T. Sott`
Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `Bespin (dark) (terminal.sexy)`.

To use this scheme, add this to your config:

config.color_scheme = 'Bespin (base16)'

Bespin (dark) (terminal.sexy)

Author: `Chris Kempson`
Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Bespin (dark) (terminal.sexy)'

Bespin (light) (terminal.sexy)

Author: `Chris Kempson`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Bespin (light) (terminal.sexy)'

Bim (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Bim (Gogh)'

Birds Of Paradise (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Birds Of Paradise (Gogh)'

BirdsOfParadise

Source:
This scheme is also known as `Birds Of Paradise (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'BirdsOfParadise'

Bitmute (terminal.sexy)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Bitmute (terminal.sexy)'

Black Metal (base16)

Author: `metalelf0 (https://github.com/metalelf0)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Black Metal (base16)'

Black Metal (Bathory) (base16)

Author: `metalelf0 (https://github.com/metalelf0)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Black Metal (Bathory) (base16)'

Black Metal (Burzum) (base16)

Author: `metalelf0 (https://github.com/metalelf0)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Black Metal (Burzum) (base16)'

Black Metal (Dark Funeral) (base16)

Author: `metalelf0 (https://github.com/metalelf0)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Black Metal (Dark Funeral) (base16)'

Black Metal (Gorgoroth) (base16)

Author: `metalelf0 (https://github.com/metalelf0)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Black Metal (Gorgoroth) (base16)'

Black Metal (Immortal) (base16)

Author: `metalelf0 (https://github.com/metalelf0)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Black Metal (Immortal) (base16)'

Black Metal (Khold) (base16)

Author: `metalelf0 (https://github.com/metalelf0)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Black Metal (Khold) (base16)'

Black Metal (Marduk) (base16)

Author: `metalelf0 (https://github.com/metalelf0)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Black Metal (Marduk) (base16)'

Black Metal (Mayhem) (base16)

Author: `metalelf0 (https://github.com/metalelf0)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Black Metal (Mayhem) (base16)'

Black Metal (Nile) (base16)

Author: `metalelf0 (https://github.com/metalelf0)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Black Metal (Nile) (base16)'

Black Metal (Venom) (base16)

Author: `metalelf0 (https://github.com/metalelf0)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Black Metal (Venom) (base16)'

Blazer

Source:
This scheme is also known as `Blazer (Gogh)`, `Miu (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Blazer'

Blazer (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Blazer (Gogh)'

Bleh-1 (terminal.sexy)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Bleh-1 (terminal.sexy)'

Blue Dolphin (Gogh)

Source:
{{since('nightly builds only')}}

To use this scheme, add this to your config:

config.color_scheme = 'Blue Dolphin (Gogh)'

Blue Matrix

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Blue Matrix'

BlueBerryPie

Source:

To use this scheme, add this to your config:

config.color_scheme = 'BlueBerryPie'

BlueDolphin

Source:

To use this scheme, add this to your config:

config.color_scheme = 'BlueDolphin'

Bluloco Light (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `BlulocoLight (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Bluloco Light (Gogh)'

Bluloco Zsh Light (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `BlulocoZshLight (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Bluloco Zsh Light (Gogh)'

BlulocoDark

Source:

To use this scheme, add this to your config:

config.color_scheme = 'BlulocoDark'

BlulocoLight

Source:

To use this scheme, add this to your config:

config.color_scheme = 'BlulocoLight'

Borland

Source:
This scheme is also known as `Borland (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Borland'

Borland (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Borland (Gogh)'

Breadog (Gogh)

Source:
{{since('nightly builds only')}}

To use this scheme, add this to your config:

config.color_scheme = 'Breadog (Gogh)'

Breath (Gogh)

Source:
{{since('20230320-124340-559cb7b0')}}

To use this scheme, add this to your config:

config.color_scheme = 'Breath (Gogh)'

Breath Darker (Gogh)

Source:
{{since('20230320-124340-559cb7b0')}}

To use this scheme, add this to your config:

config.color_scheme = 'Breath Darker (Gogh)'

Breath Light (Gogh)

Source:
{{since('20230320-124340-559cb7b0')}}
This scheme is also known as `BreathLight (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Breath Light (Gogh)'

Breath Silverfox (Gogh)

Source:
{{since('20230320-124340-559cb7b0')}}
This scheme is also known as `BreathSilverfox (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Breath Silverfox (Gogh)'

Breeze

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Breeze'

Breeze (Gogh)

Source:
{{since('20230320-124340-559cb7b0')}}

To use this scheme, add this to your config:

config.color_scheme = 'Breeze (Gogh)'

Brewer (base16)

Author: `Timothée Poisot (http://github.com/tpoisot)`
Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `Brewer (dark) (terminal.sexy)`.

To use this scheme, add this to your config:

config.color_scheme = 'Brewer (base16)'

Brewer (dark) (terminal.sexy)

Author: `Chris Kempson`
Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Brewer (dark) (terminal.sexy)'

Brewer (light) (terminal.sexy)

Author: `Chris Kempson`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Brewer (light) (terminal.sexy)'

Bright (base16)

Author: `Chris Kempson (http://chriskempson.com)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Bright (base16)'

Bright Lights

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Bright Lights'

Broadcast

Source:
This scheme is also known as `Broadcast (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Broadcast'

Broadcast (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Broadcast (Gogh)'

Brogrammer

Source:
This scheme is also known as `Brogrammer (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Brogrammer'

Brogrammer (base16)

Author: `Vik Ramanujam (http://github.com/piggyslasher)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Brogrammer (base16)'

Brogrammer (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Brogrammer (Gogh)'

Brush Trees (base16)

Author: `Abraham White `
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Brush Trees (base16)'

Brush Trees Dark (base16)

Author: `Abraham White `
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Brush Trees Dark (base16)'

Builtin Dark

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Builtin Dark'

Builtin Light

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Builtin Light'

Builtin Pastel Dark

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Builtin Pastel Dark'

Builtin Solarized Dark

Source:
This scheme is also known as `iTerm2 Solarized Dark`.

To use this scheme, add this to your config:

config.color_scheme = 'Builtin Solarized Dark'

Builtin Solarized Light

Source:
This scheme is also known as `Solarized Light (Gogh)`, `SolarizedLight (Gogh)`, `iTerm2 Solarized Light`.

To use this scheme, add this to your config:

config.color_scheme = 'Builtin Solarized Light'

Builtin Tango Dark

Source:
This scheme is also known as `Gnometerm (terminal.sexy)`.

To use this scheme, add this to your config:

config.color_scheme = 'Builtin Tango Dark'

Builtin Tango Light

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Builtin Tango Light'

Butrin (Gogh)

Source:
{{since('nightly builds only')}}

To use this scheme, add this to your config:

config.color_scheme = 'Butrin (Gogh)'

title: Color Schemes with first letter "c"

C64

Author: `Jan T. Sott`
Source:
This scheme is also known as `C64 (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'C64'

C64 (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'C64 (Gogh)'

Cai (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Cai (Gogh)'

Calamity

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Calamity'

Campbell (Gogh)

Source:
{{since('20240127-113634-bbcac864')}}

To use this scheme, add this to your config:

config.color_scheme = 'Campbell (Gogh)'

Canvased Pastel (terminal.sexy)

Author: `dkeg`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Canvased Pastel (terminal.sexy)'

carbonfox

Author: `EdenEast`
Source:
{{since('20220903-194523-3bb1ed61')}}

To use this scheme, add this to your config:

config.color_scheme = 'carbonfox'

Catch Me If You Can (terminal.sexy)

Author: `dkeg`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Catch Me If You Can (terminal.sexy)'

Catppuccin Frappe

Author: `Catppuccin Org`
Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `Catppuccin Frappé (Gogh)`, `catppuccin-frappe`.

To use this scheme, add this to your config:

config.color_scheme = 'Catppuccin Frappe'

Catppuccin Frappé (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Catppuccin Frappé (Gogh)'

Catppuccin Latte

Author: `Catppuccin Org`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Catppuccin Latte'

Catppuccin Latte (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Catppuccin Latte (Gogh)'

Catppuccin Macchiato

Author: `Catppuccin Org`
Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `Catppuccin Macchiato (Gogh)`, `catppuccin-macchiato`.

To use this scheme, add this to your config:

config.color_scheme = 'Catppuccin Macchiato'

Catppuccin Macchiato (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Catppuccin Macchiato (Gogh)'

Catppuccin Mocha

Author: `Catppuccin Org`
Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `Catppuccin Mocha (Gogh)`, `catppuccin-mocha`.

To use this scheme, add this to your config:

config.color_scheme = 'Catppuccin Mocha'

Catppuccin Mocha (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Catppuccin Mocha (Gogh)'

catppuccin-frappe

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'catppuccin-frappe'

catppuccin-latte

Source:
{{since('20230320-124340-559cb7b0')}}
This scheme is also known as `Catppuccin Latte (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'catppuccin-latte'

catppuccin-macchiato

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'catppuccin-macchiato'

catppuccin-mocha

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'catppuccin-mocha'

CGA

Source:

To use this scheme, add this to your config:

config.color_scheme = 'CGA'

Chalk

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Chalk'

Chalk (base16)

Author: `Chris Kempson (http://chriskempson.com)`
Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `Chalk (dark) (terminal.sexy)`.

To use this scheme, add this to your config:

config.color_scheme = 'Chalk (base16)'

Chalk (dark) (terminal.sexy)

Author: `Chris Kempson`
Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Chalk (dark) (terminal.sexy)'

Chalk (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Chalk (Gogh)'

Chalk (light) (terminal.sexy)

Author: `Chris Kempson`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Chalk (light) (terminal.sexy)'

Chalkboard

Source:
This scheme is also known as `Chalkboard (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Chalkboard'

Chalkboard (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Chalkboard (Gogh)'

ChallengerDeep

Source:

To use this scheme, add this to your config:

config.color_scheme = 'ChallengerDeep'

Chameleon (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Chameleon (Gogh)'

Chester

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Chester'

Ciapre

Source:
This scheme is also known as `Ciapre (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Ciapre'

Ciapre (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Ciapre (Gogh)'

Circus (base16)

Author: `Stephan Boyer (https://github.com/stepchowfun) and Esther Wang (https://github.com/ewang12)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Circus (base16)'

City Lights (Gogh)

Source:
{{since('nightly builds only')}}

To use this scheme, add this to your config:

config.color_scheme = 'City Lights (Gogh)'

City Streets (terminal.sexy)

Author: `dkeg`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'City Streets (terminal.sexy)'

Classic Dark (base16)

Author: `Jason Heeris (http://heeris.id.au)`
Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `Default (dark) (terminal.sexy)`.

To use this scheme, add this to your config:

config.color_scheme = 'Classic Dark (base16)'

Classic Light (base16)

Author: `Jason Heeris (http://heeris.id.au)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Classic Light (base16)'

Clone Of Ubuntu (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `CloneofUbuntu (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Clone Of Ubuntu (Gogh)'

Cloud (terminal.sexy)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Cloud (terminal.sexy)'

CLRS

Source:
This scheme is also known as `Clrs (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'CLRS'

Clrs (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Clrs (Gogh)'

Cobalt 2 (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Cobalt 2 (Gogh)'

Cobalt Neon

Source:
This scheme is also known as `Cobalt Neon (Gogh)`, `CobaltNeon (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Cobalt Neon'

Cobalt Neon (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Cobalt Neon (Gogh)'

Cobalt2

Source:
This scheme is also known as `Cobalt 2 (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Cobalt2'

Codeschool (base16)

Author: `blockloop`
Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `Codeschool (dark) (terminal.sexy)`.

To use this scheme, add this to your config:

config.color_scheme = 'Codeschool (base16)'

Codeschool (dark) (terminal.sexy)

Author: `Chris Kempson`
Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Codeschool (dark) (terminal.sexy)'

Codeschool (light) (terminal.sexy)

Author: `Chris Kempson`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Codeschool (light) (terminal.sexy)'

coffee_theme

Source:

To use this scheme, add this to your config:

config.color_scheme = 'coffee_theme'

Color Star (terminal.sexy)

Author: `dkeg`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Color Star (terminal.sexy)'

Colorcli (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Colorcli (Gogh)'

Colorful Colors (terminal.sexy)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Colorful Colors (terminal.sexy)'

Colors (base16)

Author: `mrmrs (http://clrs.cc)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Colors (base16)'

Count Von Count (terminal.sexy)

Author: `Baskerville`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Count Von Count (terminal.sexy)'

Crayon Pony Fish (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Crayon Pony Fish (Gogh)'

CrayonPonyFish

Source:
This scheme is also known as `Crayon Pony Fish (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'CrayonPonyFish'

Cupcake (base16)

Author: `Chris Kempson (http://chriskempson.com)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Cupcake (base16)'

Cupertino (base16)

Author: `Defman21`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Cupertino (base16)'

CutiePro

Source:
{{since('nightly builds only')}}

To use this scheme, add this to your config:

config.color_scheme = 'CutiePro'

Cyberdyne

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Cyberdyne'

cyberpunk

Source:

To use this scheme, add this to your config:

config.color_scheme = 'cyberpunk'

title: Color Schemes with first letter "d"

DanQing (base16)

Author: `Wenhan Zhu (Cosmos) (zhuwenhan950913@gmail.com)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'DanQing (base16)'

DanQing Light (base16)

Author: `Wenhan Zhu (Cosmos) (zhuwenhan950913@gmail.com)`
Source:
{{since('20220903-194523-3bb1ed61')}}

To use this scheme, add this to your config:

config.color_scheme = 'DanQing Light (base16)'

Darcula (base16)

Author: `jetbrains`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Darcula (base16)'

Dark Ocean (terminal.sexy)

Author: `DOOMICIDE`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Dark Ocean (terminal.sexy)'

Dark Pastel

Source:
This scheme is also known as `Dark Pastel (Gogh)`, `DarkPastel (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Dark Pastel'

Dark Pastel (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Dark Pastel (Gogh)'

Dark Violet (base16)

Author: `ruler501 (https://github.com/ruler501/base16-darkviolet)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Dark Violet (base16)'

Dark+

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Dark+'

darkermatrix

Source:

To use this scheme, add this to your config:

config.color_scheme = 'darkermatrix'

darkmatrix

Source:

To use this scheme, add this to your config:

config.color_scheme = 'darkmatrix'

darkmoss (base16)

Author: `Gabriel Avanzi (https://github.com/avanzzzi)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'darkmoss (base16)'

Darkside

Source:
This scheme is also known as `Darkside (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Darkside'

Darkside (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Darkside (Gogh)'

Darktooth (base16)

Author: `Jason Milkins (https://github.com/jasonm23)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Darktooth (base16)'

Dawn (terminal.sexy)

Author: `Escapist`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Dawn (terminal.sexy)'

dawnfox

Author: `EdenEast`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'dawnfox'

dayfox

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'dayfox'

Deafened (terminal.sexy)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Deafened (terminal.sexy)'

Decaf (base16)

Author: `Alex Mirrington (https://github.com/alexmirrington)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Decaf (base16)'

deep

Source:

To use this scheme, add this to your config:

config.color_scheme = 'deep'

Default (dark) (terminal.sexy)

Author: `Chris Kempson`
Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Default (dark) (terminal.sexy)'

Default (light) (terminal.sexy)

Author: `Chris Kempson`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Default (light) (terminal.sexy)'

Default Dark (base16)

Author: `Chris Kempson (http://chriskempson.com)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Default Dark (base16)'

Default Light (base16)

Author: `Chris Kempson (http://chriskempson.com)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Default Light (base16)'

Dehydration (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `DeHydration (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Dehydration (Gogh)'

Derp (terminal.sexy)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Derp (terminal.sexy)'

Desert

Source:
This scheme is also known as `Desert (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Desert'

Desert (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Desert (Gogh)'

Digerati (terminal.sexy)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Digerati (terminal.sexy)'

Dimmed Monokai (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Dimmed Monokai (Gogh)'

DimmedMonokai

Source:
This scheme is also known as `Dimmed Monokai (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'DimmedMonokai'

dirtysea (base16)

Author: `Kahlil (Kal) Hodgson`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'dirtysea (base16)'

Dissonance (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Dissonance (Gogh)'

Django

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Django'

DjangoRebornAgain

Source:

To use this scheme, add this to your config:

config.color_scheme = 'DjangoRebornAgain'

DjangoSmooth

Source:

To use this scheme, add this to your config:

config.color_scheme = 'DjangoSmooth'

Doom Peacock

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Doom Peacock'

DoomOne

Source:

To use this scheme, add this to your config:

config.color_scheme = 'DoomOne'

DotGov

Source:

To use this scheme, add this to your config:

config.color_scheme = 'DotGov'

Dotshare (terminal.sexy)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Dotshare (terminal.sexy)'

Dracula

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Dracula'

Dracula (base16)

Author: `Mike Barkmin (http://github.com/mikebarkmin) based on Dracula Theme (http://github.com/dracula)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Dracula (base16)'

Dracula (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Dracula (Gogh)'

Dracula (Official)

Author: `timescam`
Source:
{{since('20220903-194523-3bb1ed61')}}

To use this scheme, add this to your config:

config.color_scheme = 'Dracula (Official)'

Dracula+

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Dracula+'

duckbones

Source:

To use this scheme, add this to your config:

config.color_scheme = 'duckbones'

Duotone Dark

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Duotone Dark'

duskfox

Author: `EdenEast`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'duskfox'

DWM rob (terminal.sexy)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'DWM rob (terminal.sexy)'

title: Color Schemes with first letter "e"

Earthsong

Source:
This scheme is also known as `Earthsong (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Earthsong'

Earthsong (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Earthsong (Gogh)'

Edge Dark (base16)

Author: `cjayross (https://github.com/cjayross)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Edge Dark (base16)'

Edge Light (base16)

Author: `cjayross (https://github.com/cjayross)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Edge Light (base16)'

Ef-Arbutus

Author: `anhsirk0`
Source:
{{since('20240127-113634-bbcac864')}}

To use this scheme, add this to your config:

config.color_scheme = 'Ef-Arbutus'

Ef-Autumn

Author: `anhsirk0`
Source:
{{since('20230408-112425-69ae8472')}}

To use this scheme, add this to your config:

config.color_scheme = 'Ef-Autumn'

Ef-Bio

Author: `anhsirk0`
Source:
{{since('20230408-112425-69ae8472')}}

To use this scheme, add this to your config:

config.color_scheme = 'Ef-Bio'

Ef-Cherie

Author: `anhsirk0`
Source:
{{since('20230408-112425-69ae8472')}}

To use this scheme, add this to your config:

config.color_scheme = 'Ef-Cherie'

Ef-Cyprus

Author: `anhsirk0`
Source:
{{since('20240127-113634-bbcac864')}}

To use this scheme, add this to your config:

config.color_scheme = 'Ef-Cyprus'

Ef-Dark

Author: `anhsirk0`
Source:
{{since('20230408-112425-69ae8472')}}

To use this scheme, add this to your config:

config.color_scheme = 'Ef-Dark'

Ef-Day

Author: `anhsirk0`
Source:
{{since('20240127-113634-bbcac864')}}

To use this scheme, add this to your config:

config.color_scheme = 'Ef-Day'

Ef-Deuteranopia-Dark

Author: `anhsirk0`
Source:
{{since('20240127-113634-bbcac864')}}

To use this scheme, add this to your config:

config.color_scheme = 'Ef-Deuteranopia-Dark'

Ef-Deuteranopia-Light

Author: `anhsirk0`
Source:
{{since('20240127-113634-bbcac864')}}

To use this scheme, add this to your config:

config.color_scheme = 'Ef-Deuteranopia-Light'

Ef-Dream

Author: `anhsirk0`
Source:
{{since('nightly builds only')}}

To use this scheme, add this to your config:

config.color_scheme = 'Ef-Dream'

Ef-Duo-Dark

Author: `anhsirk0`
Source:
{{since('20240127-113634-bbcac864')}}

To use this scheme, add this to your config:

config.color_scheme = 'Ef-Duo-Dark'

Ef-Duo-Light

Author: `anhsirk0`
Source:
{{since('20240127-113634-bbcac864')}}

To use this scheme, add this to your config:

config.color_scheme = 'Ef-Duo-Light'

Ef-Elea-Dark

Author: `anhsirk0`
Source:
{{since('20240127-113634-bbcac864')}}

To use this scheme, add this to your config:

config.color_scheme = 'Ef-Elea-Dark'

Ef-Elea-Light

Author: `anhsirk0`
Source:
{{since('20240127-113634-bbcac864')}}

To use this scheme, add this to your config:

config.color_scheme = 'Ef-Elea-Light'

Ef-Frost

Author: `anhsirk0`
Source:
{{since('20240127-113634-bbcac864')}}

To use this scheme, add this to your config:

config.color_scheme = 'Ef-Frost'

Ef-Kassio

Author: `anhsirk0`
Source:
{{since('20240127-113634-bbcac864')}}

To use this scheme, add this to your config:

config.color_scheme = 'Ef-Kassio'

Ef-Light

Author: `anhsirk0`
Source:
{{since('20240127-113634-bbcac864')}}

To use this scheme, add this to your config:

config.color_scheme = 'Ef-Light'

Ef-Maris-Dark

Author: `anhsirk0`
Source:
{{since('20240127-113634-bbcac864')}}

To use this scheme, add this to your config:

config.color_scheme = 'Ef-Maris-Dark'

Ef-Maris-Light

Author: `anhsirk0`
Source:
{{since('20240127-113634-bbcac864')}}

To use this scheme, add this to your config:

config.color_scheme = 'Ef-Maris-Light'

Ef-Melissa-Dark

Author: `anhsirk0`
Source:
{{since('20240127-113634-bbcac864')}}

To use this scheme, add this to your config:

config.color_scheme = 'Ef-Melissa-Dark'

Ef-Melissa-Light

Author: `anhsirk0`
Source:
{{since('20240127-113634-bbcac864')}}

To use this scheme, add this to your config:

config.color_scheme = 'Ef-Melissa-Light'

Ef-Night

Author: `anhsirk0`
Source:
{{since('20240127-113634-bbcac864')}}

To use this scheme, add this to your config:

config.color_scheme = 'Ef-Night'

Ef-Reverie

Author: `anhsirk0`
Source:
{{since('nightly builds only')}}

To use this scheme, add this to your config:

config.color_scheme = 'Ef-Reverie'

Ef-Rosa

Author: `anhsirk0`
Source:
{{since('20240127-113634-bbcac864')}}

To use this scheme, add this to your config:

config.color_scheme = 'Ef-Rosa'

Ef-Spring

Author: `anhsirk0`
Source:
{{since('20230408-112425-69ae8472')}}

To use this scheme, add this to your config:

config.color_scheme = 'Ef-Spring'

Ef-Summer

Author: `anhsirk0`
Source:
{{since('20230408-112425-69ae8472')}}

To use this scheme, add this to your config:

config.color_scheme = 'Ef-Summer'

Ef-Symbiosis

Author: `anhsirk0`
Source:
{{since('20240127-113634-bbcac864')}}

To use this scheme, add this to your config:

config.color_scheme = 'Ef-Symbiosis'

Ef-Trio-Dark

Author: `anhsirk0`
Source:
{{since('20230408-112425-69ae8472')}}

To use this scheme, add this to your config:

config.color_scheme = 'Ef-Trio-Dark'

Ef-Trio-Light

Author: `anhsirk0`
Source:
{{since('20230408-112425-69ae8472')}}

To use this scheme, add this to your config:

config.color_scheme = 'Ef-Trio-Light'

Ef-Tritanopia-Dark

Author: `anhsirk0`
Source:
{{since('20230408-112425-69ae8472')}}

To use this scheme, add this to your config:

config.color_scheme = 'Ef-Tritanopia-Dark'

Ef-Tritanopia-Light

Author: `anhsirk0`
Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Ef-Tritanopia-Light'

Ef-Winter

Author: `anhsirk0`
Source:
{{since('20230408-112425-69ae8472')}}

To use this scheme, add this to your config:

config.color_scheme = 'Ef-Winter'

Eighties (base16)

Author: `Chris Kempson (http://chriskempson.com)`
Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `Eighties (dark) (terminal.sexy)`.

To use this scheme, add this to your config:

config.color_scheme = 'Eighties (base16)'

Eighties (dark) (terminal.sexy)

Author: `Chris Kempson`
Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Eighties (dark) (terminal.sexy)'

Eighties (light) (terminal.sexy)

Author: `Chris Kempson`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Eighties (light) (terminal.sexy)'

Eldorado dark (terminal.sexy)

Author: `Baskerville`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Eldorado dark (terminal.sexy)'

Eldritch

Author: `jacobrreed`
Source:
{{since('nightly builds only')}}

To use this scheme, add this to your config:

config.color_scheme = 'Eldritch'

Elemental

Source:
This scheme is also known as `Elemental (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Elemental'

Elemental (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Elemental (Gogh)'

Elementary

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Elementary'

Elementary (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Elementary (Gogh)'

Elic (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Elic (Gogh)'

Elio (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Elio (Gogh)'

Embers (base16)

Author: `Jannik Siebert (https://github.com/janniks)`
Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `Embers (dark) (terminal.sexy)`.

To use this scheme, add this to your config:

config.color_scheme = 'Embers (base16)'

Embers (dark) (terminal.sexy)

Author: `Chris Kempson`
Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Embers (dark) (terminal.sexy)'

Embers (light) (terminal.sexy)

Author: `Chris Kempson`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Embers (light) (terminal.sexy)'

ENCOM

Source:

To use this scheme, add this to your config:

config.color_scheme = 'ENCOM'

Epiphany (terminal.sexy)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Epiphany (terminal.sexy)'

Eqie6 (terminal.sexy)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Eqie6 (terminal.sexy)'

Equilibrium Dark (base16)

Author: `Carlo Abelli`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Equilibrium Dark (base16)'

Equilibrium Gray Dark (base16)

Author: `Carlo Abelli`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Equilibrium Gray Dark (base16)'

Equilibrium Gray Light (base16)

Author: `Carlo Abelli`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Equilibrium Gray Light (base16)'

Equilibrium Light (base16)

Author: `Carlo Abelli`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Equilibrium Light (base16)'

Erebus (terminal.sexy)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Erebus (terminal.sexy)'

Espresso

Source:
This scheme is also known as `Espresso (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Espresso'

Espresso (base16)

Author: `Unknown. Maintained by Alex Mirrington (https://github.com/alexmirrington)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Espresso (base16)'

Espresso (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Espresso (Gogh)'

Espresso Libre

Source:
This scheme is also known as `Espresso Libre (Gogh)`, `EspressoLibre (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Espresso Libre'

Espresso Libre (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Espresso Libre (Gogh)'

Euphrasia (terminal.sexy)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Euphrasia (terminal.sexy)'

Eva (base16)

Author: `kjakapat (https://github.com/kjakapat)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Eva (base16)'

Eva Dim (base16)

Author: `kjakapat (https://github.com/kjakapat)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Eva Dim (base16)'

Everblush

Source:
{{since('20230320-124340-559cb7b0')}}
This scheme is also known as `Everblush (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Everblush'

Everblush (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Everblush (Gogh)'

Everforest Dark (Gogh)

Source:
{{since('20230320-124340-559cb7b0')}}
This scheme is also known as `EverforestDark (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Everforest Dark (Gogh)'

Everforest Dark Hard (Gogh)

Source:
{{since('nightly builds only')}}

To use this scheme, add this to your config:

config.color_scheme = 'Everforest Dark Hard (Gogh)'

Everforest Dark Medium (Gogh)

Source:
{{since('nightly builds only')}}

To use this scheme, add this to your config:

config.color_scheme = 'Everforest Dark Medium (Gogh)'

Everforest Dark Soft (Gogh)

Source:
{{since('nightly builds only')}}

To use this scheme, add this to your config:

config.color_scheme = 'Everforest Dark Soft (Gogh)'

Everforest Light (Gogh)

Source:
{{since('20230320-124340-559cb7b0')}}
This scheme is also known as `EverforestLight (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Everforest Light (Gogh)'

Everforest Light Hard (Gogh)

Source:
{{since('nightly builds only')}}

To use this scheme, add this to your config:

config.color_scheme = 'Everforest Light Hard (Gogh)'

Everforest Light Medium (Gogh)

Source:
{{since('nightly builds only')}}

To use this scheme, add this to your config:

config.color_scheme = 'Everforest Light Medium (Gogh)'

Everforest Light Soft (Gogh)

Source:
{{since('nightly builds only')}}

To use this scheme, add this to your config:

config.color_scheme = 'Everforest Light Soft (Gogh)'

title: Color Schemes with first letter "f"

Fahrenheit

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Fahrenheit'

Fairy Floss (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `FairyFloss (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Fairy Floss (Gogh)'

Fairy Floss Dark (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `FairyFlossDark (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Fairy Floss Dark (Gogh)'

Fairyfloss

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Fairyfloss'

farmhouse-dark

Source:
{{since('20240127-113634-bbcac864')}}

To use this scheme, add this to your config:

config.color_scheme = 'farmhouse-dark'

farmhouse-light

Source:
{{since('20240127-113634-bbcac864')}}

To use this scheme, add this to your config:

config.color_scheme = 'farmhouse-light'

FarSide (terminal.sexy)

Author: `Baskerville`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'FarSide (terminal.sexy)'

Fideloper

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Fideloper'

Firefly Traditional

Source:
{{since('20240127-113634-bbcac864')}}

To use this scheme, add this to your config:

config.color_scheme = 'Firefly Traditional'

FirefoxDev

Source:

To use this scheme, add this to your config:

config.color_scheme = 'FirefoxDev'

Firewatch

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Firewatch'

Fishbone (terminal.sexy)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Fishbone (terminal.sexy)'

FishTank

Source:
This scheme is also known as `Fishtank (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'FishTank'

Fishtank (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Fishtank (Gogh)'

Flat

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Flat'

Flat (base16)

Author: `Chris Kempson (http://chriskempson.com)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Flat (base16)'

Flat (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Flat (Gogh)'

Flat Remix (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `FlatRemix (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Flat Remix (Gogh)'

Flatland

Source:
This scheme is also known as `Flatland (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Flatland'

Flatland (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Flatland (Gogh)'

flexoki-dark

Source:
{{since('20240127-113634-bbcac864')}}

To use this scheme, add this to your config:

config.color_scheme = 'flexoki-dark'

flexoki-light

Source:
{{since('20240127-113634-bbcac864')}}

To use this scheme, add this to your config:

config.color_scheme = 'flexoki-light'

Floraverse

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Floraverse'

ForestBlue

Source:

To use this scheme, add this to your config:

config.color_scheme = 'ForestBlue'

Foxnightly (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Foxnightly (Gogh)'

Framer

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Framer'

Framer (base16)

Author: `Framer (Maintained by Jesse Hoyos)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Framer (base16)'

Freya (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Freya (Gogh)'

Frontend Delight (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Frontend Delight (Gogh)'

Frontend Fun Forrest (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Frontend Fun Forrest (Gogh)'

Frontend Galaxy (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Frontend Galaxy (Gogh)'

FrontEndDelight

Source:
This scheme is also known as `Frontend Delight (Gogh)`, `FrontendDelight (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'FrontEndDelight'

Fruit Soda (base16)

Author: `jozip`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Fruit Soda (base16)'

FunForrest

Source:
This scheme is also known as `Frontend Fun Forrest (Gogh)`, `FrontendFunForrest (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'FunForrest'

title: Color Schemes with first letter "g"

Galaxy

Source:
This scheme is also known as `Frontend Galaxy (Gogh)`, `FrontendGalaxy (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Galaxy'

Galizur

Author: `Raziel Anarki (http://github.com/razielanarki)`
Source:

To use this scheme, add this to your config:

config.color_scheme = 'Galizur'

Geohot (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `GeoHot (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Geohot (Gogh)'

Gigavolt (base16)

Author: `Aidan Swope (http://github.com/Whillikers)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Gigavolt (base16)'

Github

Source:
This scheme is also known as `Github (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Github'

Github (base16)

Author: `Defman21`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Github (base16)'

Github (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}
This scheme is also known as `Github Light (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Github (Gogh)'

GitHub Dark

Source:

To use this scheme, add this to your config:

config.color_scheme = 'GitHub Dark'

Github Dark (Gogh)

Source:
{{since('20240127-113634-bbcac864')}}

To use this scheme, add this to your config:

config.color_scheme = 'Github Dark (Gogh)'

Github Light (Gogh)

Source:
{{since('nightly builds only')}}

To use this scheme, add this to your config:

config.color_scheme = 'Github Light (Gogh)'

GJM (terminal.sexy)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'GJM (terminal.sexy)'

Glacier

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Glacier'

Gnometerm (terminal.sexy)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Gnometerm (terminal.sexy)'

Gogh (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Gogh (Gogh)'

Gooey (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `gooey (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Gooey (Gogh)'

Google (dark) (terminal.sexy)

Author: `Chris Kempson`
Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Google (dark) (terminal.sexy)'

Google (light) (terminal.sexy)

Author: `Chris Kempson`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Google (light) (terminal.sexy)'

Google Dark (base16)

Author: `Seth Wright (http://sethawright.com)`
Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `Google (dark) (terminal.sexy)`.

To use this scheme, add this to your config:

config.color_scheme = 'Google Dark (base16)'

Google Dark (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `GoogleDark (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Google Dark (Gogh)'

Google Light (base16)

Author: `Seth Wright (http://sethawright.com)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Google Light (base16)'

Google Light (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `GoogleLight (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Google Light (Gogh)'

Gotham (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `Gotham (terminal.sexy)`, `gotham (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Gotham (Gogh)'

Gotham (terminal.sexy)

Author: `whatyouhide`
Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Gotham (terminal.sexy)'

Grandshell (terminal.sexy)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Grandshell (terminal.sexy)'

Grape

Source:
This scheme is also known as `Grape (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Grape'

Grape (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Grape (Gogh)'

Grass

Source:
This scheme is also known as `Grass (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Grass'

Grass (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Grass (Gogh)'

Grayscale (dark) (terminal.sexy)

Author: `Chris Kempson`
Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Grayscale (dark) (terminal.sexy)'

Grayscale (light) (terminal.sexy)

Author: `Chris Kempson`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Grayscale (light) (terminal.sexy)'

Grayscale Dark (base16)

Author: `Alexandre Gavioli (https://github.com/Alexx2/)`
Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `Grayscale (dark) (terminal.sexy)`.

To use this scheme, add this to your config:

config.color_scheme = 'Grayscale Dark (base16)'

Grayscale Light (base16)

Author: `Alexandre Gavioli (https://github.com/Alexx2/)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Grayscale Light (base16)'

Green Screen (base16)

Author: `Chris Kempson (http://chriskempson.com)`
Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `Greenscreen (dark) (terminal.sexy)`.

To use this scheme, add this to your config:

config.color_scheme = 'Green Screen (base16)'

Greenscreen (dark) (terminal.sexy)

Author: `Chris Kempson`
Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Greenscreen (dark) (terminal.sexy)'

Greenscreen (light) (terminal.sexy)

Author: `Chris Kempson`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Greenscreen (light) (terminal.sexy)'

Grey-green

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Grey-green'

Gruber (base16)

Author: `Patel, Nimai , colors from www.github.com/rexim/gruber-darker-theme`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Gruber (base16)'

Gruvbox (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Gruvbox (Gogh)'

Gruvbox Dark (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Gruvbox Dark (Gogh)'

Gruvbox dark, hard (base16)

Author: `Dawid Kurek (dawikur@gmail.com), morhetz (https://github.com/morhetz/gruvbox)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Gruvbox dark, hard (base16)'

Gruvbox dark, medium (base16)

Author: `Dawid Kurek (dawikur@gmail.com), morhetz (https://github.com/morhetz/gruvbox)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Gruvbox dark, medium (base16)'

Gruvbox dark, pale (base16)

Author: `Dawid Kurek (dawikur@gmail.com), morhetz (https://github.com/morhetz/gruvbox)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Gruvbox dark, pale (base16)'

Gruvbox dark, soft (base16)

Author: `Dawid Kurek (dawikur@gmail.com), morhetz (https://github.com/morhetz/gruvbox)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Gruvbox dark, soft (base16)'

Gruvbox light, hard (base16)

Author: `Dawid Kurek (dawikur@gmail.com), morhetz (https://github.com/morhetz/gruvbox)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Gruvbox light, hard (base16)'

Gruvbox light, medium (base16)

Author: `Dawid Kurek (dawikur@gmail.com), morhetz (https://github.com/morhetz/gruvbox)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Gruvbox light, medium (base16)'

Gruvbox light, soft (base16)

Author: `Dawid Kurek (dawikur@gmail.com), morhetz (https://github.com/morhetz/gruvbox)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Gruvbox light, soft (base16)'

Gruvbox Material (Gogh)

Source:
{{since('20230408-112425-69ae8472')}}

To use this scheme, add this to your config:

config.color_scheme = 'Gruvbox Material (Gogh)'

GruvboxDark

Source:
{{since('20230320-124340-559cb7b0')}}
This scheme is also known as `Gruvbox Dark (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'GruvboxDark'

GruvboxDarkHard

Source:
{{since('20230320-124340-559cb7b0')}}

To use this scheme, add this to your config:

config.color_scheme = 'GruvboxDarkHard'

GruvboxLight

Source:
This scheme is also known as `Gruvbox Light`.

To use this scheme, add this to your config:

config.color_scheme = 'GruvboxLight'

Guezwhoz

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Guezwhoz'

title: Color Schemes with first letter "h"

Hacktober

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Hacktober'

Hardcore

Source:
This scheme is also known as `Hardcore (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Hardcore'

Hardcore (base16)

Author: `Chris Caller`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Hardcore (base16)'

Hardcore (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Hardcore (Gogh)'

hardhacker

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'hardhacker'

Harmonic16 Dark (base16)

Author: `Jannik Siebert (https://github.com/janniks)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Harmonic16 Dark (base16)'

Harmonic16 Light (base16)

Author: `Jannik Siebert (https://github.com/janniks)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Harmonic16 Light (base16)'

Harper

Author: `Jan T. Sott`
Source:
This scheme is also known as `Harper (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Harper'

Harper (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Harper (Gogh)'

HaX0R_BLUE

Source:

To use this scheme, add this to your config:

config.color_scheme = 'HaX0R_BLUE'

HaX0R_GR33N

Source:

To use this scheme, add this to your config:

config.color_scheme = 'HaX0R_GR33N'

HaX0R_R3D

Source:

To use this scheme, add this to your config:

config.color_scheme = 'HaX0R_R3D'

Heetch Dark (base16)

Author: `Geoffrey Teale (tealeg@gmail.com)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Heetch Dark (base16)'

Heetch Light (base16)

Author: `Geoffrey Teale (tealeg@gmail.com)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Heetch Light (base16)'

Helios (base16)

Author: `Alex Meyer (https://github.com/reyemxela)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Helios (base16)'

Hemisu Dark (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `HemisuDark (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Hemisu Dark (Gogh)'

Hemisu Light (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `HemisuLight (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Hemisu Light (Gogh)'

Highway

Source:
This scheme is also known as `Highway (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Highway'

Highway (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Highway (Gogh)'

Hipster Green

Source:
This scheme is also known as `Hipster Green (Gogh)`, `HipsterGreen (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Hipster Green'

Hipster Green (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Hipster Green (Gogh)'

Hivacruz

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Hivacruz'

Homebrew

Source:
This scheme is also known as `Homebrew (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Homebrew'

Homebrew (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Homebrew (Gogh)'

Homebrew Light (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Homebrew Light (Gogh)'

Homebrew Ocean (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Homebrew Ocean (Gogh)'

Hopscotch

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Hopscotch'

Hopscotch (base16)

Author: `Jan T. Sott`
Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Hopscotch (base16)'

Hopscotch.256

Source:
This scheme is also known as `Hopscotch (base16)`.

To use this scheme, add this to your config:

config.color_scheme = 'Hopscotch.256'

Horizon Bright (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `HorizonBright (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Horizon Bright (Gogh)'

Horizon Dark (base16)

Author: `Michaël Ball (http://github.com/michael-ball/)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Horizon Dark (base16)'

Horizon Dark (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `HorizonDark (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Horizon Dark (Gogh)'

Horizon Light (base16)

Author: `Michaël Ball (http://github.com/michael-ball/)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Horizon Light (base16)'

Humanoid dark (base16)

Author: `Thomas (tasmo) Friese`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Humanoid dark (base16)'

Humanoid light (base16)

Author: `Thomas (tasmo) Friese`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Humanoid light (base16)'

hund (terminal.sexy)

Author: `hund`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'hund (terminal.sexy)'

Hurtado

Source:
This scheme is also known as `Hurtado (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Hurtado'

Hurtado (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Hurtado (Gogh)'

Hybrid

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Hybrid'

Hybrid (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Hybrid (Gogh)'

Hybrid (terminal.sexy)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Hybrid (terminal.sexy)'

title: Color Schemes with first letter "i"

Ibm 3270 (High Contrast) (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `IBM3270(HighContrast) (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Ibm 3270 (High Contrast) (Gogh)'

Ibm3270 (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `ibm3270 (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Ibm3270 (Gogh)'

Ic Green Ppl (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `ICGreenPPL (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Ic Green Ppl (Gogh)'

Ic Orange Ppl (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Ic Orange Ppl (Gogh)'

IC_Green_PPL

Source:

To use this scheme, add this to your config:

config.color_scheme = 'IC_Green_PPL'

IC_Orange_PPL

Source:
This scheme is also known as `ICOrangePPL (Gogh)`, `Ic Orange Ppl (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'IC_Orange_PPL'

Iceberg (Gogh)

Source:
{{since('nightly builds only')}}

To use this scheme, add this to your config:

config.color_scheme = 'Iceberg (Gogh)'

iceberg-dark

Source:

To use this scheme, add this to your config:

config.color_scheme = 'iceberg-dark'

iceberg-light

Source:

To use this scheme, add this to your config:

config.color_scheme = 'iceberg-light'

Icy Dark (base16)

Author: `icyphox (https://icyphox.ga)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Icy Dark (base16)'

idea

Source:

To use this scheme, add this to your config:

config.color_scheme = 'idea'

Idle Toes (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Idle Toes (Gogh)'

idleToes

Source:
This scheme is also known as `Idle Toes (Gogh)`, `IdleToes (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'idleToes'

Iiamblack (terminal.sexy)

Author: `iiamblack`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Iiamblack (terminal.sexy)'

Insignificato (terminal.sexy)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Insignificato (terminal.sexy)'

Invisibone (terminal.sexy)

Author: `Baskerville`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Invisibone (terminal.sexy)'

IR Black (base16)

Author: `Timothée Poisot (http://timotheepoisot.fr)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'IR Black (base16)'

Ir Black (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `IrBlack (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Ir Black (Gogh)'

IR_Black

Source:

To use this scheme, add this to your config:

config.color_scheme = 'IR_Black'

Isotope (base16)

Author: `Jan T. Sott`
Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `Isotope (dark) (terminal.sexy)`.

To use this scheme, add this to your config:

config.color_scheme = 'Isotope (base16)'

Isotope (dark) (terminal.sexy)

Author: `Chris Kempson`
Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Isotope (dark) (terminal.sexy)'

Isotope (light) (terminal.sexy)

Author: `Chris Kempson`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Isotope (light) (terminal.sexy)'

iTerm2 Dark Background

Source:
{{since('20240127-113634-bbcac864')}}

To use this scheme, add this to your config:

config.color_scheme = 'iTerm2 Dark Background'

iTerm2 Default

Source:
{{since('20240127-113634-bbcac864')}}

To use this scheme, add this to your config:

config.color_scheme = 'iTerm2 Default'

iTerm2 Light Background

Source:
{{since('20240127-113634-bbcac864')}}

To use this scheme, add this to your config:

config.color_scheme = 'iTerm2 Light Background'

iTerm2 Pastel Dark Background

Source:
{{since('20240127-113634-bbcac864')}}

To use this scheme, add this to your config:

config.color_scheme = 'iTerm2 Pastel Dark Background'

iTerm2 Smoooooth

Source:
{{since('20240127-113634-bbcac864')}}

To use this scheme, add this to your config:

config.color_scheme = 'iTerm2 Smoooooth'

iTerm2 Tango Dark

Source:
{{since('20240127-113634-bbcac864')}}

To use this scheme, add this to your config:

config.color_scheme = 'iTerm2 Tango Dark'

iTerm2 Tango Light

Source:
{{since('20240127-113634-bbcac864')}}

To use this scheme, add this to your config:

config.color_scheme = 'iTerm2 Tango Light'

Ivory Dark (terminal.sexy)

Author: `Baskerville`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Ivory Dark (terminal.sexy)'

Ivory Light (terminal.sexy)

Author: `Baskerville`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Ivory Light (terminal.sexy)'

title: Color Schemes with first letter "j"

Jackie Brown

Source:
This scheme is also known as `Jackie Brown (Gogh)`, `JackieBrown (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Jackie Brown'

Jackie Brown (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Jackie Brown (Gogh)'

Japanesque

Source:
This scheme is also known as `Japanesque (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Japanesque'

Japanesque (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Japanesque (Gogh)'

Jason Wryan (terminal.sexy)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Jason Wryan (terminal.sexy)'

Jellybeans

Source:
This scheme is also known as `Jellybeans (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Jellybeans'

Jellybeans (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Jellybeans (Gogh)'

JetBrains Darcula

Source:

To use this scheme, add this to your config:

config.color_scheme = 'JetBrains Darcula'

jmbi (terminal.sexy)

Author: `jmbi`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'jmbi (terminal.sexy)'

jubi

Source:

To use this scheme, add this to your config:

config.color_scheme = 'jubi'

Jup (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Jup (Gogh)'

JWR dark (terminal.sexy)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'JWR dark (terminal.sexy)'

title: Color Schemes with first letter "k"

Kanagawa (Gogh)

Source:
{{since('20230320-124340-559cb7b0')}}
This scheme is also known as `kanagawa (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Kanagawa (Gogh)'

Kanagawa Dragon (Gogh)

Source:
{{since('nightly builds only')}}

To use this scheme, add this to your config:

config.color_scheme = 'Kanagawa Dragon (Gogh)'

kanagawabones

Source:

To use this scheme, add this to your config:

config.color_scheme = 'kanagawabones'

Kasugano (terminal.sexy)

Author: `Kori Ayakashi`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Kasugano (terminal.sexy)'

Kibble

Source:
This scheme is also known as `Kibble (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Kibble'

Kibble (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Kibble (Gogh)'

Kimber (base16)

Author: `Mishka Nguyen (https://github.com/akhsiM)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Kimber (base16)'

Kokuban (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `kokuban (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Kokuban (Gogh)'

Kolorit

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Kolorit'

Konsolas

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Konsolas'

kurokula

Source:
{{since('nightly builds only')}}

To use this scheme, add this to your config:

config.color_scheme = 'kurokula'

title: Color Schemes with first letter "l"

Lab Fox

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Lab Fox'

Laser

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Laser'

Laserwave (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `laserwave (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Laserwave (Gogh)'

Later This Evening

Source:
This scheme is also known as `Later This Evening (Gogh)`, `LaterThisEvening (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Later This Evening'

Later This Evening (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Later This Evening (Gogh)'

Lavandula

Source:
This scheme is also known as `Lavandula (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Lavandula'

Lavandula (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Lavandula (Gogh)'

Light White (terminal.sexy)

Author: `Gutterslob`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Light White (terminal.sexy)'

Liquid Carbon (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Liquid Carbon (Gogh)'

Liquid Carbon Transparent (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Liquid Carbon Transparent (Gogh)'

LiquidCarbon

Source:
This scheme is also known as `Liquid Carbon (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'LiquidCarbon'

LiquidCarbonTransparent

Source:
This scheme is also known as `Liquid Carbon Transparent (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'LiquidCarbonTransparent'

LiquidCarbonTransparentInverse

Source:

To use this scheme, add this to your config:

config.color_scheme = 'LiquidCarbonTransparentInverse'

London Tube (base16)

Author: `Jan T. Sott`
Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `Londontube (dark) (terminal.sexy)`.

To use this scheme, add this to your config:

config.color_scheme = 'London Tube (base16)'

Londontube (dark) (terminal.sexy)

Author: `Chris Kempson`
Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Londontube (dark) (terminal.sexy)'

Londontube (light) (terminal.sexy)

Author: `Chris Kempson`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Londontube (light) (terminal.sexy)'

Lost Woods (terminal.sexy)

Author: `Baskerville`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Lost Woods (terminal.sexy)'

lovelace

Source:

To use this scheme, add this to your config:

config.color_scheme = 'lovelace'

Low Contrast (terminal.sexy)

Author: `Muzieca`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Low Contrast (terminal.sexy)'

Lumifoo (terminal.sexy)

Author: `Gutterslob`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Lumifoo (terminal.sexy)'

Lunaria Dark (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `LunariaDark (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Lunaria Dark (Gogh)'

Lunaria Eclipse (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `LunariaEclipse (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Lunaria Eclipse (Gogh)'

Lunaria Light (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `LunariaLight (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Lunaria Light (Gogh)'

title: Color Schemes with first letter "m"

Macintosh (base16)

Author: `Rebecca Bettencourt (http://www.kreativekorp.com)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Macintosh (base16)'

Maia (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Maia (Gogh)'

Man Page

Source:
This scheme is also known as `Man Page (Gogh)`, `ManPage (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Man Page'

Man Page (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Man Page (Gogh)'

Mar (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Mar (Gogh)'

Mariana

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Mariana'

Marrakesh (base16)

Author: `Alexandre Gavioli (http://github.com/Alexx2/)`
Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `Marrakesh (dark) (terminal.sexy)`.

To use this scheme, add this to your config:

config.color_scheme = 'Marrakesh (base16)'

Marrakesh (dark) (terminal.sexy)

Author: `Chris Kempson`
Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Marrakesh (dark) (terminal.sexy)'

Marrakesh (light) (terminal.sexy)

Author: `Chris Kempson`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Marrakesh (light) (terminal.sexy)'

Mashup Colors (terminal.sexy)

Author: `user 77`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Mashup Colors (terminal.sexy)'

Materia (base16)

Author: `Defman21`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Materia (base16)'

Material

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Material'

Material (base16)

Author: `Nate Peterson`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Material (base16)'

Material (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Material (Gogh)'

Material (terminal.sexy)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Material (terminal.sexy)'

Material Darker (base16)

Author: `Nate Peterson`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Material Darker (base16)'

Material Lighter (base16)

Author: `Nate Peterson`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Material Lighter (base16)'

Material Palenight (base16)

Author: `Nate Peterson`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Material Palenight (base16)'

Material Vivid (base16)

Author: `joshyrobot`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Material Vivid (base16)'

MaterialDark

Source:

To use this scheme, add this to your config:

config.color_scheme = 'MaterialDark'

MaterialDarker

Source:

To use this scheme, add this to your config:

config.color_scheme = 'MaterialDarker'

MaterialDesignColors

Source:

To use this scheme, add this to your config:

config.color_scheme = 'MaterialDesignColors'

MaterialOcean

Source:

To use this scheme, add this to your config:

config.color_scheme = 'MaterialOcean'

Mathias

Source:
This scheme is also known as `Mathias (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Mathias'

Mathias (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Mathias (Gogh)'

matrix

Source:

To use this scheme, add this to your config:

config.color_scheme = 'matrix'

Matrix (terminal.sexy)

Author: `OK100`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Matrix (terminal.sexy)'

Medallion

Source:
This scheme is also known as `Medallion (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Medallion'

Medallion (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Medallion (Gogh)'

Mellifluous

Author: `rektdeckard (http://github.com/rektdeckard)`
Source:
{{since('nightly builds only')}}

To use this scheme, add this to your config:

config.color_scheme = 'Mellifluous'

Mellow Purple (base16)

Author: `gidsi`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Mellow Purple (base16)'

Mexico Light (base16)

Author: `Sheldon Johnson`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Mexico Light (base16)'

midnight-in-mojave

Source:

To use this scheme, add this to your config:

config.color_scheme = 'midnight-in-mojave'

Mikado (terminal.sexy)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Mikado (terminal.sexy)'

Mikazuki (terminal.sexy)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Mikazuki (terminal.sexy)'

Mirage

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Mirage'

Miramare (Gogh)

Source:
{{since('nightly builds only')}}

To use this scheme, add this to your config:

config.color_scheme = 'Miramare (Gogh)'

Misterioso

Source:
This scheme is also known as `Misterioso (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Misterioso'

Misterioso (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Misterioso (Gogh)'

Mocha (base16)

Author: `Chris Kempson (http://chriskempson.com)`
Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `Mocha (dark) (terminal.sexy)`.

To use this scheme, add this to your config:

config.color_scheme = 'Mocha (base16)'

Mocha (dark) (terminal.sexy)

Author: `Chris Kempson`
Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Mocha (dark) (terminal.sexy)'

Mocha (light) (terminal.sexy)

Author: `Chris Kempson`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Mocha (light) (terminal.sexy)'

Modus Operandi (Gogh)

Source:
{{since('nightly builds only')}}

To use this scheme, add this to your config:

config.color_scheme = 'Modus Operandi (Gogh)'

Modus Operandi Tinted (Gogh)

Source:
{{since('nightly builds only')}}

To use this scheme, add this to your config:

config.color_scheme = 'Modus Operandi Tinted (Gogh)'

Modus Vivendi (Gogh)

Source:
{{since('nightly builds only')}}

To use this scheme, add this to your config:

config.color_scheme = 'Modus Vivendi (Gogh)'

Modus Vivendi Tinted (Gogh)

Source:
{{since('nightly builds only')}}

To use this scheme, add this to your config:

config.color_scheme = 'Modus Vivendi Tinted (Gogh)'

Modus-Operandi

Author: `anhsirk0`
Source:
{{since('20230408-112425-69ae8472')}}

To use this scheme, add this to your config:

config.color_scheme = 'Modus-Operandi'

Modus-Operandi-Deuteranopia

Author: `anhsirk0`
Source:
{{since('20240127-113634-bbcac864')}}
This scheme is also known as `Modus-Operandi-Tritanopia`.

To use this scheme, add this to your config:

config.color_scheme = 'Modus-Operandi-Deuteranopia'

Modus-Operandi-Tinted

Author: `anhsirk0`
Source:
{{since('20240127-113634-bbcac864')}}

To use this scheme, add this to your config:

config.color_scheme = 'Modus-Operandi-Tinted'

Modus-Vivendi

Author: `anhsirk0`
Source:
{{since('20230408-112425-69ae8472')}}

To use this scheme, add this to your config:

config.color_scheme = 'Modus-Vivendi'

Modus-Vivendi-Deuteranopia

Author: `anhsirk0`
Source:
{{since('20240127-113634-bbcac864')}}

To use this scheme, add this to your config:

config.color_scheme = 'Modus-Vivendi-Deuteranopia'

Modus-Vivendi-Tinted

Author: `anhsirk0`
Source:
{{since('20240127-113634-bbcac864')}}

To use this scheme, add this to your config:

config.color_scheme = 'Modus-Vivendi-Tinted'

Modus-Vivendi-Tritanopia

Author: `anhsirk0`
Source:
{{since('20240127-113634-bbcac864')}}

To use this scheme, add this to your config:

config.color_scheme = 'Modus-Vivendi-Tritanopia'

Molokai

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Molokai'

Molokai (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Molokai (Gogh)'

Mona Lisa (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Mona Lisa (Gogh)'

MonaLisa

Source:
This scheme is also known as `Mona Lisa (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'MonaLisa'

Mono (terminal.sexy)

Author: `Muzieca`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Mono (terminal.sexy)'

Mono Amber (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `mono-amber (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Mono Amber (Gogh)'

Mono Cyan (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `mono-cyan (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Mono Cyan (Gogh)'

Mono Green (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `mono-green (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Mono Green (Gogh)'

Mono Red (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `mono-red (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Mono Red (Gogh)'

Mono Theme (terminal.sexy)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Mono Theme (terminal.sexy)'

Mono White (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `mono-white (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Mono White (Gogh)'

Mono Yellow (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `mono-yellow (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Mono Yellow (Gogh)'

Monokai (base16)

Author: `Wimer Hazenberg (http://www.monokai.nl)`
Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `Monokai (dark) (terminal.sexy)`.

To use this scheme, add this to your config:

config.color_scheme = 'Monokai (base16)'

Monokai (dark) (terminal.sexy)

Author: `Chris Kempson`
Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Monokai (dark) (terminal.sexy)'

Monokai (light) (terminal.sexy)

Author: `Chris Kempson`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Monokai (light) (terminal.sexy)'

Monokai (terminal.sexy)

Author: `Cacodaimon`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Monokai (terminal.sexy)'

Monokai Dark (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `MonokaiDark (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Monokai Dark (Gogh)'

Monokai Pro (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `MonokaiPro (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Monokai Pro (Gogh)'

Monokai Pro Ristretto (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `MonokaiProRistretto (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Monokai Pro Ristretto (Gogh)'

Monokai Remastered

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Monokai Remastered'

Monokai Soda

Source:
This scheme is also known as `Monokai Soda (Gogh)`, `MonokaiSoda (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Monokai Soda'

Monokai Soda (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Monokai Soda (Gogh)'

Monokai Vivid

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Monokai Vivid'

Moonfly (Gogh)

Source:
{{since('20240127-113634-bbcac864')}}

To use this scheme, add this to your config:

config.color_scheme = 'Moonfly (Gogh)'

Morada (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Morada (Gogh)'

Mostly Bright (terminal.sexy)

Author: `m83`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Mostly Bright (terminal.sexy)'

Muse (terminal.sexy)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Muse (terminal.sexy)'

title: Color Schemes with first letter "n"

N0tch2k

Source:
This scheme is also known as `N0Tch2K (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'N0tch2k'

N0Tch2K (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'N0Tch2K (Gogh)'

Nancy (terminal.sexy)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Nancy (terminal.sexy)'

Nature Suede (terminal.sexy)

Author: `Gslob`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Nature Suede (terminal.sexy)'
Author: `hal`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Navy and Ivory (terminal.sexy)'

Nebula (base16)

Author: `Gabriel Fontes (https://github.com/Misterio77)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Nebula (base16)'

neobones_dark

Source:

To use this scheme, add this to your config:

config.color_scheme = 'neobones_dark'

neobones_light

Source:

To use this scheme, add this to your config:

config.color_scheme = 'neobones_light'

Neon

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Neon'

Neon (terminal.sexy)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Neon (terminal.sexy)'

Neon Night (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `neon-night (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Neon Night (Gogh)'

Neopolitan

Source:
This scheme is also known as `Neopolitan (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Neopolitan'

Neopolitan (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Neopolitan (Gogh)'

Nep (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Nep (Gogh)'

Neutron

Source:
This scheme is also known as `Neutron (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Neutron'

Neutron (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Neutron (Gogh)'

Night Owl (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `NightOwl (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Night Owl (Gogh)'

Night Owlish Light

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Night Owlish Light'

Nightfly (Gogh)

Source:
{{since('20240127-113634-bbcac864')}}

To use this scheme, add this to your config:

config.color_scheme = 'Nightfly (Gogh)'

nightfox

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'nightfox'

NightLion v1

Source:
This scheme is also known as `Nightlion V1 (Gogh)`, `NightlionV1 (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'NightLion v1'

Nightlion V1 (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Nightlion V1 (Gogh)'

NightLion v2

Source:
This scheme is also known as `Nightlion V2 (Gogh)`, `NightlionV2 (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'NightLion v2'

Nightlion V2 (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Nightlion V2 (Gogh)'

Nighty (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `nighty (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Nighty (Gogh)'

niji

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'niji'

Nocturnal Winter

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Nocturnal Winter'

nord

Source:
This scheme is also known as `Nord (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'nord'

Nord (base16)

Author: `arcticicestudio`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Nord (base16)'

Nord (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Nord (Gogh)'

Nord Light (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `NordLight (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Nord Light (Gogh)'

nord-light

Source:

To use this scheme, add this to your config:

config.color_scheme = 'nord-light'

nordfox

Author: `EdenEast`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'nordfox'

Nova (base16)

Author: `George Essig (https://github.com/gessig), Trevor D. Miller (https://trevordmiller.com)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Nova (base16)'

Novel

Source:
This scheme is also known as `Novel (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Novel'

Novel (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Novel (Gogh)'

Nucolors (terminal.sexy)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Nucolors (terminal.sexy)'

Nudge (terminal.sexy)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Nudge (terminal.sexy)'

Numix Darkest (terminal.sexy)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Numix Darkest (terminal.sexy)'

NvimDark

Source:
{{since('nightly builds only')}}

To use this scheme, add this to your config:

config.color_scheme = 'NvimDark'

NvimLight

Source:
{{since('nightly builds only')}}

To use this scheme, add this to your config:

config.color_scheme = 'NvimLight'

title: Color Schemes with first letter "o"

Obsidian

Source:
This scheme is also known as `Obsidian (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Obsidian'

Obsidian (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Obsidian (Gogh)'

Ocean

Source:
This scheme is also known as `Homebrew Ocean (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Ocean'

Ocean (base16)

Author: `Chris Kempson (http://chriskempson.com)`
Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `Ocean (dark) (terminal.sexy)`.

To use this scheme, add this to your config:

config.color_scheme = 'Ocean (base16)'

Ocean (dark) (terminal.sexy)

Author: `Chris Kempson`
Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Ocean (dark) (terminal.sexy)'

Ocean (light) (terminal.sexy)

Author: `Chris Kempson`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Ocean (light) (terminal.sexy)'

Ocean Dark (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `OceanDark (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Ocean Dark (Gogh)'

Oceanic Next (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Oceanic Next (Gogh)'

Oceanic-Next

Source:
This scheme is also known as `Oceanic Next (Gogh)`, `OceanicNext (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Oceanic-Next'

OceanicMaterial

Source:

To use this scheme, add this to your config:

config.color_scheme = 'OceanicMaterial'

OceanicNext (base16)

Author: `https://github.com/voronianski/oceanic-next-color-scheme`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'OceanicNext (base16)'

Ollie

Source:
This scheme is also known as `Ollie (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Ollie'

Ollie (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Ollie (Gogh)'

Omni (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Omni (Gogh)'

One Dark (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `OneDark (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'One Dark (Gogh)'

One Half Black (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `OneHalfBlack (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'One Half Black (Gogh)'

One Light (base16)

Author: `Daniel Pfeifer (http://github.com/purpleKarrot)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'One Light (base16)'

One Light (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `OneLight (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'One Light (Gogh)'

OneDark (base16)

Author: `Lalit Magant (http://github.com/tilal6991)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'OneDark (base16)'

OneHalfDark

Author: `Son A. Pham `
Source:

To use this scheme, add this to your config:

config.color_scheme = 'OneHalfDark'

OneHalfLight

Author: `Son A. Pham `
Source:

To use this scheme, add this to your config:

config.color_scheme = 'OneHalfLight'

Operator Mono Dark

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Operator Mono Dark'

Orangish (terminal.sexy)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Orangish (terminal.sexy)'

Outrun Dark (base16)

Author: `Hugo Delahousse (http://github.com/hugodelahousse/)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Outrun Dark (base16)'

Overnight Slumber

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Overnight Slumber'

Oxocarbon Dark (Gogh)

Source:
{{since('20240127-113634-bbcac864')}}

To use this scheme, add this to your config:

config.color_scheme = 'Oxocarbon Dark (Gogh)'

title: Color Schemes with first letter "p"

Palenight (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `palenight (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Palenight (Gogh)'

PaleNightHC

Source:

To use this scheme, add this to your config:

config.color_scheme = 'PaleNightHC'

Pali (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Pali (Gogh)'

Panda (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Panda (Gogh)'

Pandora

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Pandora'

Panels (terminal.sexy)

Author: `dkeg`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Panels (terminal.sexy)'

Paper (Gogh)

Source:
{{since('nightly builds only')}}

To use this scheme, add this to your config:

config.color_scheme = 'Paper (Gogh)'

PaperColor Dark (base16)

Author: `Jon Leopard (http://github.com/jonleopard) based on PaperColor Theme (https://github.com/NLKNguyen/papercolor-theme)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'PaperColor Dark (base16)'

Papercolor Dark (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `PaperColorDark (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Papercolor Dark (Gogh)'

PaperColor Light (base16)

Author: `Jon Leopard (http://github.com/jonleopard) based on PaperColor Theme (https://github.com/NLKNguyen/papercolor-theme)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'PaperColor Light (base16)'

Papercolor Light (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `PaperColorLight (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Papercolor Light (Gogh)'

Paraiso (base16)

Author: `Jan T. Sott`
Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Paraiso (base16)'

Paraiso (dark) (terminal.sexy)

Author: `Chris Kempson`
Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Paraiso (dark) (terminal.sexy)'

Paraiso (light) (terminal.sexy)

Author: `Chris Kempson`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Paraiso (light) (terminal.sexy)'

Paraiso Dark

Author: `Jan T. Sott`
Source:
This scheme is also known as `Paraiso (base16)`, `Paraiso (dark) (terminal.sexy)`, `Paraiso Dark (Gogh)`, `ParaisoDark (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Paraiso Dark'

Paraiso Dark (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Paraiso Dark (Gogh)'

Parker Brothers (terminal.sexy)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Parker Brothers (terminal.sexy)'

Pasque (base16)

Author: `Gabriel Fontes (https://github.com/Misterio77)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Pasque (base16)'

Pastel White (terminal.sexy)

Author: `Muzieca`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Pastel White (terminal.sexy)'

Paul Millr (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `PaulMillr (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Paul Millr (Gogh)'

PaulMillr

Source:

To use this scheme, add this to your config:

config.color_scheme = 'PaulMillr'

Pencil Dark (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Pencil Dark (Gogh)'

Pencil Light (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Pencil Light (Gogh)'

PencilDark

Source:
This scheme is also known as `Pencil Dark (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'PencilDark'

PencilLight

Source:
This scheme is also known as `Pencil Light (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'PencilLight'

Peppermint

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Peppermint'

Peppermint (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Peppermint (Gogh)'

PhD (base16)

Author: `Hennig Hasemann (http://leetless.de/vim.html)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'PhD (base16)'

Phrak1 (terminal.sexy)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Phrak1 (terminal.sexy)'

Piatto Light

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Piatto Light'

Pico (base16)

Author: `PICO-8 (http://www.lexaloffle.com/pico-8.php)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Pico (base16)'

pinky (base16)

Author: `Benjamin (https://github.com/b3nj5m1n)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'pinky (base16)'

Pixiefloss (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Pixiefloss (Gogh)'

Pnevma

Source:
This scheme is also known as `Pnevma (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Pnevma'

Pnevma (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Pnevma (Gogh)'

Poimandres

Author: `Oliver Cederborg`
Source:
{{since('20220903-194523-3bb1ed61')}}

To use this scheme, add this to your config:

config.color_scheme = 'Poimandres'

Poimandres Storm

Author: `Oliver Cederborg`
Source:
{{since('20220903-194523-3bb1ed61')}}

To use this scheme, add this to your config:

config.color_scheme = 'Poimandres Storm'

Pop (base16)

Author: `Chris Kempson (http://chriskempson.com)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Pop (base16)'

Popping and Locking

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Popping and Locking'

Porple (base16)

Author: `Niek den Breeje (https://github.com/AuditeMarlow)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Porple (base16)'

Powershell (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `PowerShell (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Powershell (Gogh)'

Predawn (Gogh)

Source:
{{since('20230320-124340-559cb7b0')}}

To use this scheme, add this to your config:

config.color_scheme = 'Predawn (Gogh)'

Pretty and Pastel (terminal.sexy)

Author: `IWAFU`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Pretty and Pastel (terminal.sexy)'

primary

Source:

To use this scheme, add this to your config:

config.color_scheme = 'primary'

Pro

Source:
This scheme is also known as `Pro (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Pro'

Pro (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Pro (Gogh)'

Pro Light

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Pro Light'

Pulp (terminal.sexy)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Pulp (terminal.sexy)'

Purple People Eater (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `PurplePeopleEater (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Purple People Eater (Gogh)'

Purple Rain

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Purple Rain'

Purpledream (base16)

Author: `malet`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Purpledream (base16)'

purplepeter

Source:

To use this scheme, add this to your config:

config.color_scheme = 'purplepeter'

title: Color Schemes with first letter "q"

Qualia (base16)

Author: `isaacwhanson`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Qualia (base16)'

Quiet (Gogh)

Source:
{{since('nightly builds only')}}

To use this scheme, add this to your config:

config.color_scheme = 'Quiet (Gogh)'

title: Color Schemes with first letter "r"

Railscasts (base16)

Author: `Ryan Bates (http://railscasts.com)`
Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `Railscasts (dark) (terminal.sexy)`.

To use this scheme, add this to your config:

config.color_scheme = 'Railscasts (base16)'

Railscasts (dark) (terminal.sexy)

Author: `Chris Kempson`
Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Railscasts (dark) (terminal.sexy)'

Railscasts (light) (terminal.sexy)

Author: `Chris Kempson`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Railscasts (light) (terminal.sexy)'

Rapture

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Rapture'

Rasi (terminal.sexy)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Rasi (terminal.sexy)'

Raycast_Dark

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Raycast_Dark'

Raycast_Light

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Raycast_Light'

rebecca

Source:

To use this scheme, add this to your config:

config.color_scheme = 'rebecca'

Rebecca (base16)

Author: `Victor Borja (http://github.com/vic) based on Rebecca Theme (http://github.com/vic/rebecca-theme)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Rebecca (base16)'

Red Alert

Source:
This scheme is also known as `Red Alert (Gogh)`, `RedAlert (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Red Alert'

Red Alert (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Red Alert (Gogh)'

Red Phoenix (terminal.sexy)

Author: `dkeg`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Red Phoenix (terminal.sexy)'

Red Planet

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Red Planet'

Red Sands

Source:
This scheme is also known as `Red Sands (Gogh)`, `RedSands (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Red Sands'

Red Sands (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Red Sands (Gogh)'

Relaxed

Source:
This scheme is also known as `Relaxed (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Relaxed'

Relaxed (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Relaxed (Gogh)'

Retro

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Retro'

Rezza (terminal.sexy)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Rezza (terminal.sexy)'

Rippedcasts

Source:
This scheme is also known as `Rippedcasts (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Rippedcasts'

Rippedcasts (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Rippedcasts (Gogh)'

rose-pine

Source:
{{since('20230320-124340-559cb7b0')}}
This scheme is also known as `Rosé Pine (Gogh)`, `RoséPine (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'rose-pine'

rose-pine-dawn

Source:
{{since('20230320-124340-559cb7b0')}}
This scheme is also known as `Rosé Pine Dawn (Gogh)`, `RoséPineDawn (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'rose-pine-dawn'

rose-pine-moon

Source:
{{since('20230320-124340-559cb7b0')}}
This scheme is also known as `Rosé Pine Moon (Gogh)`, `RoséPineMoon (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'rose-pine-moon'

Rosé Pine (base16)

Author: `Emilia Dunfelt `
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Rosé Pine (base16)'

Rosé Pine (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Rosé Pine (Gogh)'

Rosé Pine Dawn (base16)

Author: `Emilia Dunfelt `
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Rosé Pine Dawn (base16)'

Rosé Pine Dawn (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Rosé Pine Dawn (Gogh)'

Rosé Pine Moon (base16)

Author: `Emilia Dunfelt `
Source:
{{since('20240127-113634-bbcac864')}}

To use this scheme, add this to your config:

config.color_scheme = 'Rosé Pine Moon (base16)'

Rosé Pine Moon (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Rosé Pine Moon (Gogh)'

Rouge 2

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Rouge 2'

Royal

Source:
This scheme is also known as `Royal (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Royal'

Royal (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Royal (Gogh)'

Rydgel (terminal.sexy)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Rydgel (terminal.sexy)'

Ryuuko

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Ryuuko'

title: Color Schemes with first letter "s"

s3r0 modified (terminal.sexy)

Author: `earsplit`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 's3r0 modified (terminal.sexy)'

Sagelight (base16)

Author: `Carter Veldhuizen`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Sagelight (base16)'

Sakura

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Sakura'

Sakura (base16)

Author: `Misterio77 (http://github.com/Misterio77)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Sakura (base16)'

Sandcastle (base16)

Author: `George Essig (https://github.com/gessig)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Sandcastle (base16)'

Sat (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Sat (Gogh)'

Scarlet Protocol

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Scarlet Protocol'

Sea Shells (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Sea Shells (Gogh)'

Seafoam Pastel

Source:
This scheme is also known as `Seafoam Pastel (Gogh)`, `SeafoamPastel (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Seafoam Pastel'

Seafoam Pastel (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Seafoam Pastel (Gogh)'

SeaShells

Source:
This scheme is also known as `Sea Shells (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'SeaShells'

Selenized Black (Gogh)

Source:
{{since('nightly builds only')}}

To use this scheme, add this to your config:

config.color_scheme = 'Selenized Black (Gogh)'

Selenized Dark (Gogh)

Source:
{{since('20240127-113634-bbcac864')}}

To use this scheme, add this to your config:

config.color_scheme = 'Selenized Dark (Gogh)'

Selenized Light (Gogh)

Source:
{{since('20240127-113634-bbcac864')}}

To use this scheme, add this to your config:

config.color_scheme = 'Selenized Light (Gogh)'

Selenized White (Gogh)

Source:
{{since('nightly builds only')}}

To use this scheme, add this to your config:

config.color_scheme = 'Selenized White (Gogh)'

Seoul256 (Gogh)

Source:
{{since('nightly builds only')}}

To use this scheme, add this to your config:

config.color_scheme = 'Seoul256 (Gogh)'

Seoul256 Light (Gogh)

Source:
{{since('nightly builds only')}}

To use this scheme, add this to your config:

config.color_scheme = 'Seoul256 Light (Gogh)'

seoulbones_dark

Source:

To use this scheme, add this to your config:

config.color_scheme = 'seoulbones_dark'

seoulbones_light

Source:

To use this scheme, add this to your config:

config.color_scheme = 'seoulbones_light'

Sequoia Monochrome

Author: `Hiroya-W and Michael Andreuzza`
Source:
{{since('20220903-194523-3bb1ed61')}}

To use this scheme, add this to your config:

config.color_scheme = 'Sequoia Monochrome'

Sequoia Moonlight

Author: `Hiroya-W and Michael Andreuzza`
Source:
{{since('20220903-194523-3bb1ed61')}}

To use this scheme, add this to your config:

config.color_scheme = 'Sequoia Moonlight'

Seti

Source:
This scheme is also known as `Seti (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Seti'

Seti (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Seti (Gogh)'

Seti UI (base16)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Seti UI (base16)'

Sex Colors (terminal.sexy)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Sex Colors (terminal.sexy)'

Shades of Purple (base16)

Author: `Iolar Demartini Junior (http://github.com/demartini) based on Shades of Purple Theme (https://github.com/ahmadawais/shades-of-purple-vscode).`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Shades of Purple (base16)'

shades-of-purple

Source:

To use this scheme, add this to your config:

config.color_scheme = 'shades-of-purple'

Shaman

Source:
This scheme is also known as `Shaman (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Shaman'

Shaman (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Shaman (Gogh)'

Shapeshifter (base16)

Author: `Tyler Benziger (http://tybenz.com)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Shapeshifter (base16)'

Shapeshifter (dark) (terminal.sexy)

Author: `Chris Kempson`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Shapeshifter (dark) (terminal.sexy)'

Shapeshifter (light) (terminal.sexy)

Author: `Chris Kempson`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Shapeshifter (light) (terminal.sexy)'

Shel (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Shel (Gogh)'

Shic (terminal.sexy)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Shic (terminal.sexy)'

Silk Dark (base16)

Author: `Gabriel Fontes (https://github.com/Misterio77)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Silk Dark (base16)'

Silk Light (base16)

Author: `Gabriel Fontes (https://github.com/Misterio77)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Silk Light (base16)'

Simple Rainbow (terminal.sexy)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Simple Rainbow (terminal.sexy)'

Slate

Source:
This scheme is also known as `Slate (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Slate'

Slate (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Slate (Gogh)'

SleepyHollow

Source:

To use this scheme, add this to your config:

config.color_scheme = 'SleepyHollow'

Smyck

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Smyck'

Smyck (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Smyck (Gogh)'

Snazzy

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Snazzy'

Snazzy (base16)

Author: `Chawye Hsu (https://github.com/chawyehsu) based on Hyper Snazzy Theme (https://github.com/sindresorhus/hyper-snazzy)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Snazzy (base16)'

Snazzy (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Snazzy (Gogh)'

Soft Server (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Soft Server (Gogh)'

SoftServer

Source:
This scheme is also known as `Soft Server (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'SoftServer'

Solar Flare (base16)

Author: `Chuck Harmston (https://chuck.harmston.ch)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Solar Flare (base16)'

Solar Flare Light (base16)

Author: `Chuck Harmston (https://chuck.harmston.ch)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Solar Flare Light (base16)'

Solarized (dark) (terminal.sexy)

Author: `Chris Kempson`
Source:
{{since('20230320-124340-559cb7b0')}}

To use this scheme, add this to your config:

config.color_scheme = 'Solarized (dark) (terminal.sexy)'

Solarized (light) (terminal.sexy)

Author: `Chris Kempson`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Solarized (light) (terminal.sexy)'

Solarized Darcula

Source:
This scheme is also known as `Solarized Darcula (Gogh)`, `SolarizedDarcula (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Solarized Darcula'

Solarized Darcula (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Solarized Darcula (Gogh)'

Solarized Dark (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `SolarizedDark (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Solarized Dark (Gogh)'

Solarized Dark - Patched

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Solarized Dark - Patched'

Solarized Dark Higher Contrast

Source:
This scheme is also known as `Solarized Dark Higher Contrast (Gogh)`, `SolarizedDarkHigherContrast (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Solarized Dark Higher Contrast'

Solarized Dark Higher Contrast (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Solarized Dark Higher Contrast (Gogh)'

Solarized Light (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Solarized Light (Gogh)'

Sonokai (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Sonokai (Gogh)'

SOS (terminal.sexy)

Author: `Rooster`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'SOS (terminal.sexy)'

Spacedust

Source:
This scheme is also known as `Spacedust (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Spacedust'

Spacedust (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Spacedust (Gogh)'

SpaceGray

Source:
This scheme is also known as `Spacegray (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'SpaceGray'

Spacegray (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Spacegray (Gogh)'

SpaceGray Eighties

Source:
This scheme is also known as `SpaceGrayEighties (Gogh)`, `Spacegray Eighties (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'SpaceGray Eighties'

Spacegray Eighties (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Spacegray Eighties (Gogh)'

SpaceGray Eighties Dull

Source:
This scheme is also known as `SpaceGrayEightiesDull (Gogh)`, `Spacegray Eighties Dull (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'SpaceGray Eighties Dull'

Spacegray Eighties Dull (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Spacegray Eighties Dull (Gogh)'

Spacemacs (base16)

Author: `Nasser Alshammari (https://github.com/nashamri/spacemacs-theme)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Spacemacs (base16)'

Sparky (Gogh)

Source:
{{since('nightly builds only')}}

To use this scheme, add this to your config:

config.color_scheme = 'Sparky (Gogh)'

Spiderman

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Spiderman'

Splurge (terminal.sexy)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Splurge (terminal.sexy)'

Spring

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Spring'

Spring (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Spring (Gogh)'

Square

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Square'

Square (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Square (Gogh)'

Srcery (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Srcery (Gogh)'

Sublette

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Sublette'

Subliminal

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Subliminal'

Sugarplum

Author: `lemonlime0x3C33 (https://github.com/lemonlime0x3C33)`
Source:
{{since('nightly builds only')}}

To use this scheme, add this to your config:

config.color_scheme = 'Sugarplum'

Summer Pop (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `summer-pop (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Summer Pop (Gogh)'

summercamp (base16)

Author: `zoe firi (zoefiri.github.io)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'summercamp (base16)'

Summerfruit Dark (base16)

Author: `Christopher Corley (http://christop.club/)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Summerfruit Dark (base16)'

Summerfruit Light (base16)

Author: `Christopher Corley (http://christop.club/)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Summerfruit Light (base16)'

Sundried

Source:
This scheme is also known as `Sundried (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Sundried'

Sundried (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Sundried (Gogh)'

Swayr (terminal.sexy)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Swayr (terminal.sexy)'

Sweet Eliverlara (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `sweet-eliverlara (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Sweet Eliverlara (Gogh)'

Sweet Love (terminal.sexy)

Author: `Boroshlawa`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Sweet Love (terminal.sexy)'

Sweet Terminal (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `SweetTerminal (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Sweet Terminal (Gogh)'

Symfonic

Source:
This scheme is also known as `Symphonic (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Symfonic'

Symphonic (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Symphonic (Gogh)'

Synth Midnight Terminal Dark (base16)

Author: `Michaël Ball (http://github.com/michael-ball/)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Synth Midnight Terminal Dark (base16)'

Synth Midnight Terminal Light (base16)

Author: `Michaël Ball (http://github.com/michael-ball/)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Synth Midnight Terminal Light (base16)'

synthwave

Source:

To use this scheme, add this to your config:

config.color_scheme = 'synthwave'

Synthwave (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `SynthWave (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Synthwave (Gogh)'

Synthwave Alpha (Gogh)

Source:
{{since('20220903-194523-3bb1ed61')}}
This scheme is also known as `SynthwaveAlpha (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Synthwave Alpha (Gogh)'

synthwave-everything

Source:

To use this scheme, add this to your config:

config.color_scheme = 'synthwave-everything'

SynthwaveAlpha

Source:
{{since('20220903-194523-3bb1ed61')}}

To use this scheme, add this to your config:

config.color_scheme = 'SynthwaveAlpha'

title: Color Schemes with first letter "t"

Tango (base16)

Author: `@Schnouki, based on the Tango Desktop Project`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Tango (base16)'

Tango (terminal.sexy)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Tango (terminal.sexy)'

Tango Adapted

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Tango Adapted'

Tango Half Adapted

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Tango Half Adapted'

Tangoesque (terminal.sexy)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Tangoesque (terminal.sexy)'

Tartan (terminal.sexy)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Tartan (terminal.sexy)'

Teerb

Source:
This scheme is also known as `Teerb (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Teerb'

Teerb (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Teerb (Gogh)'

tender (base16)

Author: `Jacobo Tabernero (https://github/com/jacoborus/tender.vim)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'tender (base16)'

Tender (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Tender (Gogh)'

terafox

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'terafox'

Terminal Basic

Source:
This scheme is also known as `Homebrew Light (Gogh)`, `TerminalBasic (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Terminal Basic'

Terminal Basic (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Terminal Basic (Gogh)'

Terminix Dark (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `TerminixDark (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Terminix Dark (Gogh)'

Teva (terminal.sexy)

Author: `dkeg`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Teva (terminal.sexy)'

Thayer Bright

Source:
This scheme is also known as `Thayer Bright (Gogh)`, `ThayerBright (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Thayer Bright'

Thayer Bright (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Thayer Bright (Gogh)'

The Hulk

Source:

To use this scheme, add this to your config:

config.color_scheme = 'The Hulk'

theme2 (terminal.sexy)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'theme2 (terminal.sexy)'

thwump (terminal.sexy)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'thwump (terminal.sexy)'

Tin (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Tin (Gogh)'

Tinacious Design (Dark)

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Tinacious Design (Dark)'

Tinacious Design (Light)

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Tinacious Design (Light)'

tlh (terminal.sexy)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'tlh (terminal.sexy)'

Tokyo Night

Author: `folke`
Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Tokyo Night'

Tokyo Night (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `TokyoNight (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Tokyo Night (Gogh)'

Tokyo Night Day

Author: `folke`
Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Tokyo Night Day'

Tokyo Night Light (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `TokyoNightLight (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Tokyo Night Light (Gogh)'

Tokyo Night Moon

Author: `folke`
Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Tokyo Night Moon'

Tokyo Night Storm

Author: `folke`
Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Tokyo Night Storm'

Tokyo Night Storm (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `TokyoNightStorm (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Tokyo Night Storm (Gogh)'

tokyonight

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'tokyonight'

tokyonight-day

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'tokyonight-day'

tokyonight-storm

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'tokyonight-storm'

tokyonight_day

Author: `folke`
Source:
This scheme is also known as `tokyonight-day`.

To use this scheme, add this to your config:

config.color_scheme = 'tokyonight_day'

tokyonight_moon

Author: `folke`
Source:
{{since('20230320-124340-559cb7b0')}}

To use this scheme, add this to your config:

config.color_scheme = 'tokyonight_moon'

tokyonight_night

Author: `folke`
Source:
This scheme is also known as `tokyonight`.

To use this scheme, add this to your config:

config.color_scheme = 'tokyonight_night'

tokyonight_storm

Author: `folke`
Source:
This scheme is also known as `tokyonight-storm`.

To use this scheme, add this to your config:

config.color_scheme = 'tokyonight_storm'

Tomorrow

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Tomorrow'

Tomorrow (dark) (terminal.sexy)

Author: `Chris Kempson`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Tomorrow (dark) (terminal.sexy)'

Tomorrow (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Tomorrow (Gogh)'

Tomorrow (light) (terminal.sexy)

Author: `Chris Kempson`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Tomorrow (light) (terminal.sexy)'

Tomorrow Night

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Tomorrow Night'

Tomorrow Night (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `TomorrowNight (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Tomorrow Night (Gogh)'

Tomorrow Night Blue

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Tomorrow Night Blue'

Tomorrow Night Blue (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `TomorrowNightBlue (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Tomorrow Night Blue (Gogh)'

Tomorrow Night Bright

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Tomorrow Night Bright'

Tomorrow Night Bright (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `TomorrowNightBright (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Tomorrow Night Bright (Gogh)'

Tomorrow Night Burns

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Tomorrow Night Burns'

Tomorrow Night Eighties

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Tomorrow Night Eighties'

Tomorrow Night Eighties (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `TomorrowNightEighties (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Tomorrow Night Eighties (Gogh)'

Toy Chest (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Toy Chest (Gogh)'

ToyChest

Source:
This scheme is also known as `Toy Chest (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'ToyChest'

Treehouse

Source:
This scheme is also known as `Treehouse (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Treehouse'

Treehouse (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Treehouse (Gogh)'

Trim Yer Beard (terminal.sexy)

Author: `franksn`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Trim Yer Beard (terminal.sexy)'

Twilight

Source:
This scheme is also known as `Twilight (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Twilight'

Twilight (base16)

Author: `David Hart (https://github.com/hartbit)`
Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `Twilight (dark) (terminal.sexy)`.

To use this scheme, add this to your config:

config.color_scheme = 'Twilight (base16)'

Twilight (dark) (terminal.sexy)

Author: `Chris Kempson`
Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Twilight (dark) (terminal.sexy)'

Twilight (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Twilight (Gogh)'

Twilight (light) (terminal.sexy)

Author: `Chris Kempson`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Twilight (light) (terminal.sexy)'

title: Color Schemes with first letter "u"

Ubuntu

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Ubuntu'

UltraDark

Source:

To use this scheme, add this to your config:

config.color_scheme = 'UltraDark'

UltraViolent

Source:

To use this scheme, add this to your config:

config.color_scheme = 'UltraViolent'

UnderTheSea

Source:

To use this scheme, add this to your config:

config.color_scheme = 'UnderTheSea'

Unikitty

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Unikitty'

Unikitty Dark (base16)

Author: `Josh W Lewis (@joshwlewis)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Unikitty Dark (base16)'

Unikitty Light (base16)

Author: `Josh W Lewis (@joshwlewis)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Unikitty Light (base16)'

Unikitty Reversible (base16)

Author: `Josh W Lewis (@joshwlewis)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Unikitty Reversible (base16)'

Unsifted Wheat (terminal.sexy)

Author: `dkeg`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Unsifted Wheat (terminal.sexy)'

Ura (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Ura (Gogh)'

Urple

Source:
This scheme is also known as `Urple (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Urple'

Urple (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Urple (Gogh)'

title: Color Schemes with first letter "v"

Vacuous 2 (terminal.sexy)

Author: `hal`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Vacuous 2 (terminal.sexy)'

Vag (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Vag (Gogh)'

Vaughn

Source:
This scheme is also known as `Vaughn (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Vaughn'

Vaughn (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Vaughn (Gogh)'

Vesper

Source:
{{since('nightly builds only')}}

To use this scheme, add this to your config:

config.color_scheme = 'Vesper'

Vibrant Ink (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Vibrant Ink (Gogh)'

VibrantInk

Source:
This scheme is also known as `Vibrant Ink (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'VibrantInk'

Vice Alt (base16)

Author: `Thomas Leon Highbaugh`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Vice Alt (base16)'

Vice Dark (base16)

Author: `Thomas Leon Highbaugh`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Vice Dark (base16)'

vimbones

Source:

To use this scheme, add this to your config:

config.color_scheme = 'vimbones'

Violet Dark

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Violet Dark'

Violet Light

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Violet Light'

VisiBlue (terminal.sexy)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'VisiBlue (terminal.sexy)'

VisiBone (terminal.sexy)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'VisiBone (terminal.sexy)'

Visibone Alt. 2 (terminal.sexy)

Author: `Gutterslob`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Visibone Alt. 2 (terminal.sexy)'

Vs Code Dark+ (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `VSCodeDark+ (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Vs Code Dark+ (Gogh)'

Vs Code Light+ (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}
This scheme is also known as `VSCodeLight+ (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Vs Code Light+ (Gogh)'

vulcan (base16)

Author: `Andrey Varfolomeev`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'vulcan (base16)'

VWbug (terminal.sexy)

Author: `dkeg`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'VWbug (terminal.sexy)'

title: Color Schemes with first letter "w"

Warm Neon (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Warm Neon (Gogh)'

WarmNeon

Source:
This scheme is also known as `Warm Neon (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'WarmNeon'

Website (Gogh)

Source:
{{since('20240127-113634-bbcac864')}}

To use this scheme, add this to your config:

config.color_scheme = 'Website (Gogh)'

Wez

Source:
This scheme is also known as `Wez (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Wez'

Wez (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Wez (Gogh)'

Whimsy

Source:

To use this scheme, add this to your config:

config.color_scheme = 'Whimsy'

Wild Cherry (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Wild Cherry (Gogh)'

WildCherry

Source:
This scheme is also known as `Wild Cherry (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'WildCherry'

wilmersdorf

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'wilmersdorf'

Windows 10 (base16)

Author: `Fergus Collins (https://github.com/C-Fergus)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Windows 10 (base16)'

Windows 10 Light (base16)

Author: `Fergus Collins (https://github.com/C-Fergus)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Windows 10 Light (base16)'

Windows 95 (base16)

Author: `Fergus Collins (https://github.com/C-Fergus)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Windows 95 (base16)'

Windows 95 Light (base16)

Author: `Fergus Collins (https://github.com/C-Fergus)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Windows 95 Light (base16)'

Windows High Contrast (base16)

Author: `Fergus Collins (https://github.com/C-Fergus)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Windows High Contrast (base16)'

Windows High Contrast Light (base16)

Author: `Fergus Collins (https://github.com/C-Fergus)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Windows High Contrast Light (base16)'

Windows NT (base16)

Author: `Fergus Collins (https://github.com/C-Fergus)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Windows NT (base16)'

Windows NT Light (base16)

Author: `Fergus Collins (https://github.com/C-Fergus)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Windows NT Light (base16)'

Wombat

Source:
This scheme is also known as `Wombat (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Wombat'

Wombat (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Wombat (Gogh)'

Woodland (base16)

Author: `Jay Cornwall (https://jcornwall.com)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Woodland (base16)'

Wryan

Source:
This scheme is also known as `Wryan (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Wryan'

Wryan (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Wryan (Gogh)'

Wzoreck (Gogh)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Wzoreck (Gogh)'

title: Color Schemes with first letter "x"

X::DotShare (terminal.sexy)

Author: `crshd`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'X::DotShare (terminal.sexy)'

X::Erosion (terminal.sexy)

Author: `earsplit`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'X::Erosion (terminal.sexy)'

XCode Dusk (base16)

Author: `Elsa Gonsiorowski (https://github.com/gonsie)`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'XCode Dusk (base16)'

title: Color Schemes with first letter "y"

Yousai (terminal.sexy)

Author: `Kori`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Yousai (terminal.sexy)'

title: Color Schemes with first letter "z"

zenbones

Source:
This scheme is also known as `zenbones_light`.

To use this scheme, add this to your config:

config.color_scheme = 'zenbones'

zenbones_dark

Source:

To use this scheme, add this to your config:

config.color_scheme = 'zenbones_dark'

Zenburn

Source:
This scheme is also known as `Zenburn (Gogh)`.

To use this scheme, add this to your config:

config.color_scheme = 'Zenburn'

Zenburn (base16)

Author: `elnawe`
Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'Zenburn (base16)'

Zenburn (Gogh)

Source:
{{since('20230712-072601-f4abf8fd')}}

To use this scheme, add this to your config:

config.color_scheme = 'Zenburn (Gogh)'

zenburn (terminal.sexy)

Source:
{{since('20220807-113146-c2fee766')}}

To use this scheme, add this to your config:

config.color_scheme = 'zenburn (terminal.sexy)'

zenburned

Source:

To use this scheme, add this to your config:

config.color_scheme = 'zenburned'

zenwritten_dark

Source:

To use this scheme, add this to your config:

config.color_scheme = 'zenwritten_dark'

zenwritten_light

Source:

To use this scheme, add this to your config:

config.color_scheme = 'zenwritten_light'

Recipes

This section of the docs is intended to show you ways to do certain things in wezterm. They may not be the only or even the best way to get things done, but can help you figure out how things work.

Passing Data from a pane to Lua

After spawning a program into a pane, a terminal emulator has no guaranteed reliable way to reason about what might be happening inside the pane; the only official system-provided means of interaction is through a limited PTY interface that basically provides only input and output streams and a way to communicate the screen size to the pane.

While wezterm provides a few functions that can help to peek into locally running processes, those cannot be used with remote processes when you're ssh'ing to a remote host, for example.

Here are a few options you might consider using, depending on your needs.

We'll start with a very general but powerful mechanism:

User Vars

You can use an escape sequence to set a key/value pair in a terminal pane. These user vars are similar in some ways to environment variables but are scoped to the terminal pane and cannot be read by applications running in the pane, only written.

Here's an example of setting the foo user variable to the value bar:

printf "\033]1337;SetUserVar=%s=%s\007" foo `echo -n bar | base64`

Note that the value must be base64 encoded.

Setting a user var will generate events in the window that contains the corresponding pane:

  • user-var-changed, which allows you to directly take action when a var is set/changed.
  • update-status which allows you to update left/right status items
  • the title and tab bar area will then update and trigger any associated events as part of that update

The user var change event will propagate to all connected multiplexer clients.

You can access the complete set of user vars in a given pane by calling pane:get_user_vars(), or by accessing the user_vars field in a PaneInformation struct.

In this example, an alias is used to set a user var named PROG to something when running various commands:

# This function emits an OSC 1337 sequence to set a user var
# associated with the current terminal pane.
# It requires the `base64` utility to be available in the path.
# This function is included in the wezterm shell integration script, but
# is reproduced here for clarity
__wezterm_set_user_var() {
  if hash base64 2>/dev/null ; then
    if [[ -z "${TMUX}" ]] ; then
      printf "\033]1337;SetUserVar=%s=%s\007" "$1" `echo -n "$2" | base64`
    else
      # <https://github.com/tmux/tmux/wiki/FAQ#what-is-the-passthrough-escape-sequence-and-how-do-i-use-it>
      # Note that you ALSO need to add "set -g allow-passthrough on" to your tmux.conf
      printf "\033Ptmux;\033\033]1337;SetUserVar=%s=%s\007\033\\" "$1" `echo -n "$2" | base64`
    fi
  fi
}

function _run_prog() {
    # set PROG to the program being run
    __wezterm_set_user_var "PROG" "$1"

    # arrange to clear it when it is done
    trap '__wezterm_set_user_var PROG ""' EXIT

    # and now run the corresponding command, taking care to avoid looping
    # with the alias definition
    command "$@"
}

alias vim="_run_prog vim"
alias tmux="_run_prog tmux"
alias nvim="_run_prog nvim"

Then on the wezterm side, this information can be used when formatting the tab titles:

local wezterm = require 'wezterm'

wezterm.on('format-tab-title', function(tab)
  local prog = tab.active_pane.user_vars.PROG
  return tab.active_pane.title .. ' [' .. (prog or '') .. ']'
end)

return {}

If you install the wezterm shell integration you will get a more comprehensive set of user vars set for you automatically.

User vars enable you to very deliberately signal information from your pane to your wezterm config, and will work across multiplexer connections and even through tmux (provided that you use the tmux passthrough escape sequence to allow it to pass through).

The downside is that you need to take steps to ensure that your shell knows to emit the appropriate user vars when you need them.

Depending on your needs, there are some alternative ways to reason about specific information in a pane.

OSC 0, 1, 2 for setting the Window/Pane Title

wezterm, like many other terminals, will interpret Operating System Command (OSC) escape sequences for codes 0, 1 and 2 as updating the title:

OSCDescriptionActionExample
0Set Icon Name and Window TitleClears Icon Name, sets Window Title.\x1b]0;title\x1b\\
1Set Icon NameSets Icon Name, which is used as the Tab title when it is non-empty\x1b]1;tab-title\x1b\\
2Set Window TitleSet Window Title\x1b]2;window-title\x1b\\

pane:get_title() and/or the PaneInformation title field can be used to retrieve the effective title that has been set for a pane.

It is common practice for shells in many distributions to arrange to set OSC 2 prior to executing a command. wezterm doesn't currently set this up automatically. Note that wezterm will attempt to determine the foreground process and substitute its title if the pane is a local pane and no title has been set by an OSC escape sequence.

OSC 7 for setting the current working directory

Emitting OSC 7 will tell wezterm to use a specific URI for the current working directory associated with a pane:

printf "\033]7;file://HOSTNAME/CURRENT/DIR\033\\"

You may also use wezterm set-working-directory for this if you have wezterm available.

The value you set via OSC 7 is available pane:get_current_working_dir() and/or the PaneInformation current_working_dir field can be used to retrieve the working directory that has been set for a pane. If OSC 7 has never been used in a pane, and that pane is a local pane, wezterm can attempt to determine the working directory of the foreground process that is associated with the pane.

Installing the wezterm shell integration will arrange for bash/zsh to set OSC 7 for you.

Local Process State

wezterm provides some functions that can attempt to extract information about processes that are running on the local machine; these will not work with multiplexer connections of any kind (even unix multiplexers):

There are a couple of other similar/related methods available to the Pane object and in the wezterm.procinfo module.

Because these local process functions don't require changing your shell configuration to get them working, they may be the most convenient to use in your wezterm configuration, but they are limited to local processes only and may not work as well to determine the correct foreground process when running on Windows.

Workspaces / Sessions

If you are familiar with tmux then you may have used its session functionality to manage separate groups of related tmux windows (which map to tabs in wezterm).

wezterm doesn't have an exact match to tmux sessions, but does have a similar concept known as Workspaces.

Every MuxWindow is associated with a workspace, which is just a label.

The wezterm GUI is focused on the active workspace, which means that it will present a GUI window for each MuxWindow that is present in that workspace.

You can spawn windows into differently named workspaces and they won't become visible until you set the active workspace to that name.

When switching the active workspace, wezterm will swap the contents of the GUI windows with the MuxWindows that belong to the now-focused workspace.

The following key assignments are helpful when working with workspaces:

You can pre-define a layout of windows/tabs/panes in specific workspaces by using these events:

Lua Reference

WezTerm provides Lua 5.4 as a configuration language. This section documents the various lua functions and types that are provided to the configuration file. These are provided by the wezterm module that must be imported into your configuration file:

local wezterm = require 'wezterm'
local config = {}
config.font = wezterm.font 'JetBrains Mono'
return config

Full List of Configuration Options

Config Options has a list of the main configuration options.


search: exclude: true

Config struct

The return statement at the end of your wezterm.lua file returns a table that is interpreted as the internal Config struct type.

This section documents the various available fields in the config struct.

At the time of writing, it is not a complete list!


tags:

  • font

adjust_window_size_when_changing_font_size = true

{{since('20210203-095643-70a364eb')}}

Control whether changing the font size adjusts the dimensions of the window (true) or adjusts the number of terminal rows/columns (false). The default is true.

If you use a tiling window manager then you may wish to set this to false.

See also IncreaseFontSize, DecreaseFontSize.

{{since('20230712-072601-f4abf8fd')}}

The default value is now nil which causes wezterm to match the name of the connected window environment (which you can see if you open the debug overlay) against the list of known tiling environments configured by tiling_desktop_environments. If the environment is known to be tiling then the effective value of adjust_window_size_when_changing_font_size is false, and true otherwise.


tags:

  • font

allow_square_glyphs_to_overflow_width = "Never"

{{since('20210203-095643-70a364eb')}}

Configures how square symbol glyph's cell is rendered:

  • "WhenFollowedBySpace" - (this is the default) deliberately overflow the cell width when the next cell is a space.
  • "Always" - overflow the cell regardless of the next cell being a space.
  • "Never" - strictly respect the cell width.

{{since('20210404-112810-b63a949d')}}

This setting now applies to any glyph with an aspect ratio larger than 0.9, which covers more symbol glyphs than in earlier releases.

The default value for this setting was changed from Never to WhenFollowedBySpace.


tags:

  • keys

allow_win32_input_mode

{{since('20220319-142410-0fcdea07')}}

When set to true, wezterm will honor an escape sequence generated by the Windows ConPTY layer to switch the keyboard encoding to a proprietary scheme that has maximum compatibility with win32 console applications.

See also Improved Keyboard Handling in ConPTY.

{{since('20220624-141144-bd1b7c5d')}}

The default for allow_win32_input_mode is now true.


tags:

  • mouse

alternate_buffer_wheel_scroll_speed = 3

{{since('20210203-095643-70a364eb')}}

Normally the vertical mouse wheel will scroll the terminal viewport so that different sections of the scrollback are visible.

When an application activates the Alternate Screen Buffer (this is common for "full screen" terminal programs such as pagers and editors), the alternate screen doesn't have a scrollback.

In this mode, if the application hasn't enabled mouse reporting, wezterm will generate Arrow Up/Down key events when the vertical mouse wheel is scrolled.

The alternate_buffer_wheel_scroll_speed specifies how many arrow key presses are generated by a single scroll wheel "tick".

The default for this value is 3, which means that a single wheel up tick will appear to the application as though the user pressed arrow up three times in quick succession.

In versions of wezterm prior to this configuration option being available, the behavior was the same except that the effective value of this option was always 1.


tags:

  • tuning

animation_fps = 10

{{since('20220319-142410-0fcdea07')}}

This setting controls the maximum frame rate used when rendering easing effects for blinking cursors, blinking text and visual bell.

Setting it larger will result in smoother easing effects but will increase GPU utilization.

If you are running with a CPU renderer (eg: you have front_end = "Software", or your system doesn't have a GPU), then setting animation_fps = 1 is recommended, as doing so will disable easing effects and use transitions:

config.animation_fps = 1
config.cursor_blink_ease_in = 'Constant'
config.cursor_blink_ease_out = 'Constant'

tags:

  • appearance
  • font

anti_alias_custom_block_glyphs = true

{{since('20220405-091515-8a0072ad')}}

Control whether custom_block_glyphs are rendered using anti-aliasing or not. Anti-aliasing makes lines look smoother but may not look so nice at smaller font sizes.


tags:

  • bell

audible_bell

{{since('20211204-082213-a66c61ee9')}}

When the BEL ascii sequence is sent to a pane, the bell is "rung" in that pane.

You may choose to configure the audible_bell option to change the sound that wezterm makes when the bell rings.

The follow are possible values:

  • "SystemBeep" - perform the system beep or alert sound. This is the default. On Wayland systems, which have no system beep function, it does not produce a sound.
  • "Disabled" - don't make a sound

See also visual_bell and bell event


tags:

  • reload

automatically_reload_config

{{since('20201031-154415-9614e117')}}

When true (the default), watch the config file and reload it automatically when it is detected as changing. When false, you will need to manually trigger a config reload with a key bound to the action ReloadConfiguration.

For example, to disable auto config reload:

config.automatically_reload_config = false

tags:

  • appearance
  • background

background

{{since('20220624-141144-bd1b7c5d')}}

The background config option allows you to compose a number of layers to produce the background content in the terminal.

Layers can be image files, gradients or solid blocks of color. Layers composite over each other based on their alpha channel. Images in layers can be made to fill the viewport or to tile, and also to scroll with optional parallax as the viewport is scrolled.

This video demonstrates the use of multiple layers to produce a rich video game style parallax background; the configuration used for this is shown as an example at the bottom of this page:

The background option is a table that lists the desired layers starting with the deepest/back-most layer. Subsequent layers are composited over the top of preceding layers.

Layer Definition

A layer is a lua table with the following fields:

  • source - defines the source of the layer texture data. See below for source definitions
  • attachment - controls whether the layer is fixed to the viewport or moves as it scrolls. Can be:
    • "Fixed" (the default) to not move as the window scrolls,
    • "Scroll" to scroll 1:1 with the number of pixels scrolled in the viewport,
    • {Parallax=0.1} to scroll 1:10 with the number of pixels scrolled in the viewport.
  • repeat_x - controls whether the image is repeated in the x-direction. Can be one of:
    • "Repeat" - Repeat as much as possible to cover the area. The last image will be clipped if it doesn't fit. This is the default.
    • "Mirror" - Like "Repeat" except that the image is alternately mirrored which can make images that don't tile seamlessly look a bit better when repeated
    • "NoRepeat" - the image is not repeated.
  • repeat_x_size - Normally, when repeating, the image is tiled based on its width such that each copy of the image is immediately adjacent to the preceding instance. You may set repeat_x_size to a different value to increase or decrease the space between the repeated instances. Accepts:
    • number values in pixels,
    • string values like "100%" to specify a size relative to the viewport,
    • "10cell" to specify a size based on the terminal cell metrics.
  • repeat_y - like repeat_x but affects the y-direction.
  • repeat_y_size - like repeat_x_size but affects the y-direction.
  • vertical_align - controls the initial vertical position of the layer, relative to the viewport:
    • "Top" (the default),
    • "Middle",
    • "Bottom"
  • vertical_offset - specify an offset from the initial vertical position. Accepts:
    • number values in pixels,
    • string values like "100%" to specify a size relative to the viewport,
    • "10cell" to specify a size based on terminal cell metrics.
  • horizontal_align - controls the initial horizontal position of the layer, relative to the viewport:
    • "Left" (the default),
    • "Center"
    • "Right"
  • horizontal_offset - like vertical_offset but applies to the x-direction.
  • opacity - a number in the range 0 through 1.0 inclusive that is multiplied with the alpha channel of the source to adjust the opacity of the layer. The default is 1.0 to use the source alpha channel as-is. Using a smaller value makes the layer less opaque/more transparent.
  • hsb - a hue, saturation, brightness transformation that can be used to adjust those attributes of the layer. See foreground_text_hsb for more information about this kind of transform.
  • height - controls the height of the image. The following values are accepted:
    • "Cover" (this is the default) - Scales the image, preserving aspect ratio, to the smallest possible size to fill the viewport, leaving no empty space. If the aspect ratio of the viewport differs from the image, the image is cropped.
    • "Contain" - Scales the image as large as possible without cropping or stretching. If the viewport is larger than the image, tiles the image unless repeat_y is set to "NoRepeat".
    • 123 - specifies a height of 123 pixels
    • "50%" - specifies a size of 50% of the viewport height
    • "2cell" - specifies a size equivalent to 2 rows
  • width - controls the width of the image. Same details as height but applies to the x-direction.

Source Definition

A source can be one of the following:

  • {File="/path/to/file.png"} - load the specified image file. PNG, JPEG, GIF, BMP, ICO, TIFF, PNM, DDS, TGA and farbfeld files can be loaded. Animated GIF and PNG files will animate while the window has focus.
  • {File={path="/path/to/anim.gif", speed=0.2}} - load the specified image file, which is an animated gif, and adjust the animation speed to 0.2 times its normal speed.
  • {Gradient={preset="Warm"}} - generate a gradient. The gradient definitions are the same as those allowed for window_background_gradient.
  • {Color="black"} - generate an image with the specified color.

Relationship with other config options

Specifying the following options:

  • window_background_gradient
  • window_background_image
  • window_background_opacity
  • window_background_image_hsb

will implicitly prepend a layer to the background configuration with width and height set to 100%.

It is recommended that you migrate to the newer background rather than mixing both the older and the newer configuration options.

Parallax Example

This example uses these Alien Space Ship Background - Parallax - Repeatable (Vertical) assets to demonstrate most of the available features of background. That asset pack includes a background layer and a number of overlays. The overlays are positioned at varying offsets with differing parallax to provide a greater sense of depth.

The video at the top of this page demonstrate this configuration in action.

-- The art is a bit too bright and colorful to be useful as a backdrop
-- for text, so we're going to dim it down to 10% of its normal brightness
local dimmer = { brightness = 0.1 }

config.enable_scroll_bar = true
config.min_scroll_bar_height = '2cell'
config.colors = {
  scrollbar_thumb = 'white',
}
config.background = {
  -- This is the deepest/back-most layer. It will be rendered first
  {
    source = {
      File = '/Alien_Ship_bg_vert_images/Backgrounds/spaceship_bg_1.png',
    },
    -- The texture tiles vertically but not horizontally.
    -- When we repeat it, mirror it so that it appears "more seamless".
    -- An alternative to this is to set `width = "100%"` and have
    -- it stretch across the display
    repeat_x = 'Mirror',
    hsb = dimmer,
    -- When the viewport scrolls, move this layer 10% of the number of
    -- pixels moved by the main viewport. This makes it appear to be
    -- further behind the text.
    attachment = { Parallax = 0.1 },
  },
  -- Subsequent layers are rendered over the top of each other
  {
    source = {
      File = '/Alien_Ship_bg_vert_images/Overlays/overlay_1_spines.png',
    },
    width = '100%',
    repeat_x = 'NoRepeat',

    -- position the spins starting at the bottom, and repeating every
    -- two screens.
    vertical_align = 'Bottom',
    repeat_y_size = '200%',
    hsb = dimmer,

    -- The parallax factor is higher than the background layer, so this
    -- one will appear to be closer when we scroll
    attachment = { Parallax = 0.2 },
  },
  {
    source = {
      File = '/Alien_Ship_bg_vert_images/Overlays/overlay_2_alienball.png',
    },
    width = '100%',
    repeat_x = 'NoRepeat',

    -- start at 10% of the screen and repeat every 2 screens
    vertical_offset = '10%',
    repeat_y_size = '200%',
    hsb = dimmer,
    attachment = { Parallax = 0.3 },
  },
  {
    source = {
      File = '/Alien_Ship_bg_vert_images/Overlays/overlay_3_lobster.png',
    },
    width = '100%',
    repeat_x = 'NoRepeat',

    vertical_offset = '30%',
    repeat_y_size = '200%',
    hsb = dimmer,
    attachment = { Parallax = 0.4 },
  },
  {
    source = {
      File = '/Alien_Ship_bg_vert_images/Overlays/overlay_4_spiderlegs.png',
    },
    width = '100%',
    repeat_x = 'NoRepeat',

    vertical_offset = '50%',
    repeat_y_size = '150%',
    hsb = dimmer,
    attachment = { Parallax = 0.5 },
  },
}

tags:

  • appearance
  • font

bold_brightens_ansi_colors = true

When true (the default), PaletteIndex 0-7 are shifted to bright when the font intensity is bold.

This brightening effect doesn't occur when the text is set to the default foreground color!

This defaults to true for better compatibility with a wide range of mature software; for instance, a lot of software assumes that Black+Bold renders as a Dark Grey which is legible on a Black background, but if this option is set to false, it would render as Black on Black.

{{since('20230320-124340-559cb7b0')}}

This option can now have one of three values:

  • "No" - the bold attribute will not influence palette selection
  • "BrightAndBold" - the bold attribute will select a bright version of palette indices 0-7 and preserve the bold attribute on the text, using both a bold font and a brighter color
  • "BrightOnly" - the bold attribute will select a bright version of palette indices 0-7 but the intensity will be treated as normal and a non-bold font will be used for the text.

You may use true or false for backwards compatibility. true is equivalent to "BrightAndBold" and false is equivalent to "No".


tags:

  • mouse

bypass_mouse_reporting_modifiers = "SHIFT"

{{since('20210814-124438-54e29167')}}

If an application has enabled mouse reporting mode, mouse events are sent directly to the application, and do not get routed through the mouse assignment logic.

Holding down the bypass_mouse_reporting_modifiers modifier key(s) will prevent the event from being passed to the application.

The default value for bypass_mouse_reporting_modifiers is SHIFT, which means that holding down shift while clicking will not send the mouse event to eg: vim running in mouse mode and will instead treat the event as though SHIFT was not pressed and then match it against the mouse assignments.

-- Use ALT instead of SHIFT to bypass application mouse reporting
config.bypass_mouse_reporting_modifiers = 'ALT'

tags:

  • clipboard

canonicalize_pasted_newlines

{{since('20211204-082213-a66c61ee9')}}

Controls whether pasted text will have newlines normalized.

If bracketed paste mode is enabled by the application, the effective value of this configuration option is "None".

The following values are accepted:

valuemeaningversion
truesame as "CarriageReturnAndLineFeed"{{since('20211204-082213-a66c61ee9', inline=True)}}
falsesame as "None"{{since('20211204-082213-a66c61ee9', inline=True)}}
"None"The text is passed through unchanged{{since('20220319-142410-0fcdea07', inline=True)}}
"LineFeed"Newlines of any style are rewritten as LF{{since('20220319-142410-0fcdea07', inline=True)}}
"CarriageReturn"Newlines of any style are rewritten as CR{{since('20220319-142410-0fcdea07', inline=True)}}
"CarriageReturnAndLineFeed"Newlines of any style are rewritten as CRLF{{since('20220319-142410-0fcdea07', inline=True)}}

Note that the string forms of these values are accepted in 20220319-142410-0fcdea07, however, true in all prior versions behaves the same way as "CarriageReturnAndLineFeed" behaves in the nightly build.

The default value has changed in different versions of wezterm:

versionplatformdefault
20211204-082213-a66c61ee9Windows"CarriageReturnAndLineFeed"
20211204-082213-a66c61ee9NOT Windows"None"
20220319-142410-0fcdea07NOT Windows"CarriageReturn"

On Windows we're in a bit of a frustrating situation: pasting into Windows console programs requires CRLF otherwise there is no newline at all, but when in WSL, pasting with CRLF gives excess blank lines.

In practice, the default setting means that unix shells and vim will get the unix newlines in their pastes (which is the UX most users will want) and cmd.exe will get CRLF.


tags:

  • font

cell_width = 1.0

{{since('20220624-141144-bd1b7c5d')}}

Scales the computed cell width to adjust the spacing between successive cells of text.

If possible, you should prefer to specify the stretch parameter when selecting a font using wezterm.font or wezterm.font_with_fallback as that will generally look better and have fewer undesirable side effects.

If your preferred font doesn't have variations with different stretches, or if the font spacing still doesn't look right to you, then cell_width gives you a simple way to influence the spacing.

The default cell width is indirectly controlled by the font and font_size configuration options; the selected font and font size controls the height of the font, while the font designer controls the aspect ratio of the glyphs in the font. The base font (the first font resolved from your font configuration) defines the cell metrics for the terminal display grid, and those metrics are then used to place glyphs, regardless of which fallback font might be resolved for a given glyph.

If you feel that your chosen font feels too horizontally cramped then you can set cell_width = 1.2 to increase the horizontal spacing by 20%. Conversely, setting cell_width = 0.9 will decrease the horizontal spacing by 10%.

This option doesn't adjust the rasterized width of glyphs, it just changes what wezterm considers to be the cell boundaries. When rendering monospace, wezterm advances by the cell width to place successive glyphs.

If you set the scale less than 1.0 then the glyphs won't be truncated or squished, but will render over the top of each other. Conversely, if you set the scale to greater than 1.0, the glyphs won't be stretched but will render further apart from each other.

Changing cell_width doesn't adjust the positioning of the glyph within the cell: it remains at its usual x-position. It is not centered within the adjusted space.

Changing cell_width may have undesirable consequences, especially for fonts that use ligatures: depending on the font, you may find that some ligatured sequences are misaligned or render strangely. This is not a bug: the font is designed to be rendered with a cell_width = 1.0, so running with a different value will have this sort of side effect.

See also: line_height


tags:

  • appearance
  • char_select
  • color

char_select_bg_color = "#333333"

{{since('20230712-072601-f4abf8fd')}}

Specifies the background color used by CharSelect.


tags:

  • appearance
  • char_select
  • color

char_select_fg_color = rgba(0.75, 0.75, 0.75, 1.0)

{{since('20230712-072601-f4abf8fd')}}

Specifies the text color used by CharSelect.


tags:

  • appearance
  • char_select
  • font

char_select_font_size = 14.0

{{since('20220903-194523-3bb1ed61')}}

Specifies the size of the font used with CharSelect.


tags:

  • updates

check_for_updates & check_for_updates_interval_seconds

Wezterm checks regularly if there is a new stable version available on github, and shows a simple UI to let you know about the update (See show_update_window to control this UI).

By default it is checked once every 24 hours.

NOTE that it doesn't automatically download the release. No data are collected for the wezterm project as part of this.

Set check_for_updates to false to disable this completely or set check_for_updates_interval_seconds for an alternative update interval.

config.check_for_updates = true
config.check_for_updates_interval_seconds = 86400

tags:

  • exit_behavior

clean_exit_codes = { 0 }

{{since('20220624-141144-bd1b7c5d')}}

Defines the set of exit codes that are considered to be a "clean" exit by exit_behavior when the program running in the terminal completes.

Acceptable values are an array of integer exit codes that you wish to treat as successful.

For example, if you often CTRL-C a program and then CTRL-D, bash will typically exit with status 130 to indicate that a program was terminated with SIGINT, but that bash itself wasn't. In that situation you may wish to set this config to treat 130 as OK:

config.clean_exit_codes = { 130 }

Note that 0 is always treated as a clean exit code and can be omitted from the list.


tags:

  • color

color_schemes

Specifies various named color schemes in your configuration file.

Described in more detail in Colors & Appearance


tags:

  • color

colors

Specifies the color palette.

Described in more detail in Colors & Appearance


tags:

  • color
  • command_palette

command_palette_bg_color = "#333333"

{{since('20230320-124340-559cb7b0')}}

Specifies the background color used by ActivateCommandPalette.


tags:

  • color
  • command_palette

command_palette_fg_color = rgba(0.75, 0.75, 0.75, 1.0)

{{since('20230320-124340-559cb7b0')}}

Specifies the text color used by ActivateCommandPalette.


tags:

  • font
  • command_palette

command_palette_font_size = 14.0

{{since('20230320-124340-559cb7b0')}}

Specifies the size of the font used with ActivateCommandPalette.


tags:

  • appearance
  • command_palette

command_palette_rows = 14

{{since('20240127-113634-bbcac864')}}

Specifies the number of rows displayed by the command palette. ActivateCommandPalette. If unset or nil, a default value based on the terminal display will be used.


tags:

  • appearance
  • text_cursor

cursor_blink_ease_in = "Linear"

{{since('20220319-142410-0fcdea07')}}

Specifies the easing function to use when computing the color for the text cursor when it is set to a blinking style.

See visual_bell for more information about easing functions.


tags:

  • appearance
  • text_cursor

cursor_blink_ease_out = "Linear"

{{since('20220319-142410-0fcdea07')}}

Specifies the easing function to use when computing the color for the text cursor when it is set to a blinking style.

See visual_bell for more information about easing functions.


tags:

  • appearance
  • text_cursor

cursor_blink_rate

Specifies how often a blinking cursor transitions between visible and invisible, expressed in milliseconds. Setting this to 0 disables blinking.

Note that this value is approximate due to the way that the system event loop schedulers manage timers; non-zero values will be at least the interval specified with some degree of slop.

It is recommended to avoid blinking cursors when on battery power, as it is relatively costly to keep re-rendering for the blink!

config.cursor_blink_rate = 800

{{since('20220319-142410-0fcdea07')}}

The cursor blink is controlled by the easing functions specified by the cursor_blink_ease_in and cursor_blink_ease_out.


tags:

  • appearance
  • text_cursor

cursor_thickness

{{since('20221119-145034-49b9839f')}}

If specified, overrides the base thickness of the lines used to render the textual cursor glyph.

The default is to use the underline_thickness.

This config option accepts different units that have slightly different interpretations:

  • 2, 2.0 or "2px" all specify a thickness of 2 pixels
  • "2pt" specifies a thickness of 2 points, which scales according to the DPI of the window
  • "200%" takes the underline_thickness and multiplies it by 2 to arrive at a thickness double the normal size
  • "0.1cell" takes the cell height, scales it by 0.1 and uses that as the thickness

tags:

  • appearance
  • font

custom_block_glyphs = true

{{since('20210314-114017-04b7cedd')}}

When set to true (the default), WezTerm will compute its own idea of what the glyphs in the following unicode ranges should be, instead of using glyphs resolved from a font.

Ideally this option wouldn't exist, but it is present to work around a hinting issue in freetype.

BlockWhatSince
U2500Box Drawing20210814-124438-54e29167
U2580unicode block elements20210314-114017-04b7cedd
U1FB00Symbols for Legacy Computing (Sextants and Smooth mosaic graphics)20210814-124438-54e29167
U1CC00Symbols for Legacy Computing Supplement (Block mosaic terminal graphic characters)???
U2800Braille Patterns20210814-124438-54e29167
PowerlinePowerline triangle, curve and diagonal glyphs20210814-124438-54e29167

You can set this to false to use the block characters provided by your font selection.

See also anti_alias_custom_block_glyphs.


tags:

  • multiplexing

daemon_options

Allows configuring the multiplexer (mux) server and how it places itself into the background to run as a daemon process.

You should not normally need to configure this setting; the defaults should be sufficient in most cases.

There are three fields supported:

  • pid_file - specify the location of the pid and lock file. The default location is $XDG_RUNTIME_DIR/wezterm/pid on X11/Wayland systems, or $HOME/.local/share/wezterm/pid
  • stdout - specifies where a log of the stdout stream from the daemon will be placed. The default is $XDG_RUNTIME_DIR/wezterm/stdout on X11/Wayland systems, or $HOME/.local/share/wezterm/stdout.
  • stderr - specifies where a log of the stderr stream from the daemon will be placed. The default is $XDG_RUNTIME_DIR/wezterm/stderr on X11/Wayland systems, or $HOME/.local/share/wezterm/stderr.
config.daemon_options = {
  stdout = '/some/where/stdout',
  stderr = '/some/where/stderr',
  pid_file = '/some/where/pid_file',
}

tags:

  • keys
  • debug

debug_key_events = false

When set to true, each key event will be logged by the GUI layer as an INFO level log message on the stderr stream from wezterm. You will typically need to launch wezterm directly from another terminal to see this logging.

This can be helpful in figuring out how keys are being decoded on your system, or for discovering the system-dependent "raw" key code values.

config.debug_key_events = true

Produces logs like the following when typing ls: (artificially wrapped to make these docs more readable):

 2021-02-20T17:04:28.149Z INFO  wezterm_gui::gui::termwindow   > key_event 
   KeyEvent { key: Char('l'), modifiers: NONE, raw_key: None,
   raw_modifiers: NONE, raw_code: Some(46), repeat_count: 1, key_is_down: true }
 2021-02-20T17:04:28.605Z INFO  wezterm_gui::gui::termwindow   > key_event
   KeyEvent { key: Char('s'), modifiers: NONE, raw_key: None, raw_modifiers: NONE,
   raw_code: Some(39), repeat_count: 1, key_is_down: true }

The key event has a number of fields:

  • key is the decoded key after keymapping and composition effects. For example Char('l') occurs when typing the l key and Char('L') occurs when doing the same but with SHIFT held down. It could also be one of the keycode identifiers listed in the Configuring Key Assignments section.
  • modifiers indicates which modifiers are active after keymapping and composition effects. For example, typing l with SHIFT held down produces key: Char('L'), modifiers: NONE because the SHIFT key composed to produce the uppercase L.
  • raw_key represents the key press prior to any keymapping/composition events. If raw_key would be the same as key then raw_key will be printed as NONE.
  • raw_modifiers represents the state of the modifier keys prior to any keymapping or composition effects. For example, typeing l with SHIFT held down produces raw_modifiers: SHIFT.
  • raw_code is the hardware-and-or-windowing-system-dependent raw keycode value associated with the key press. This generally represents the physical location of the key independent of keymapping.
  • repeat_count is usually 1 but on some systems may be larger number to indicate that the key is being held down and that the system is synthesizing multiple key-presses based on the system key repeat settings.
  • key_is_down indicates whether the key is being pressed or released. This will always be true when debug logging, as logging and key press handling is only triggered on key press events in wezterm.

tags:

  • appearance
  • text_cursor

default_cursor_style = "SteadyBlock"

Specifies the default cursor style. Various escape sequences can override the default style in different situations (eg: an editor can change it depending on the mode), but this value controls how the cursor appears when it is reset to default. The default is SteadyBlock.

Acceptable values are SteadyBlock, BlinkingBlock, SteadyUnderline, BlinkingUnderline, SteadyBar, and BlinkingBar.

config.default_cursor_style = 'SteadyBlock'

Using a blinking style puts more load on the graphics subsystem. animation_fps can be used to tune the frame rate used for easing in the blink animation.


tags:

  • spawn

default_cwd

{{since('20210203-095643-70a364eb')}}

Sets the default current working directory used by the initial window.

The value is a string specifying the absolute path that should be used for the home directory. Using strings like ~ or ~username that are typically expanded by the shell is not supported. You can use wezterm.home_dir to explicitly refer to your home directory.

If wezterm start --cwd /some/path is used to specify the current working directory, that will take precedence.

Commands launched using SpawnCommand will use the cwd specified in the SpawnCommand, if any.

Panes/Tabs/Windows created after the first will generally try to resolve the current working directory of the current Pane, preferring a value set by OSC 7 and falling back to attempting to lookup the cwd of the current process group leader attached to a local Pane. If no cwd can be resolved, then the default_cwd will be used. If default_cwd is not specified, then the home directory of the user will be used.

{% raw %}

graph TD
    X[Determine current working directory for new pane] --> A{{Is initial window?}}
    A -->|Yes| B[Opened with CLI and --cwd flag?]
    A -->|No| C[New pane, tab or window.]
    C --> D{{Opened with a SpawnCommand<br/> that includes cwd?}}
    D -->|No| J{{Does current pane have same domain<br/>and have a value set by OSC 7?}}
    B -->|Yes| E[Use --cwd]
    B -->|No| F{{Is default_cwd defined?}}
    F -->|Yes| G[Use default_cwd]
    F -->|No| H[Use home directory]
    D -->|Yes| I[Use cwd specified<br/> by `SpawnCommand`]
    J -->|Yes| K[Use that OSC 7 value]
    J -->|No| L{{Can cwd be resolved via<br/> the process group leader?}}
    L -->|Yes| M[Use resolved cwd]
    L -->|No| F

{% endraw %}

On macOS and Linux, wezterm can attempt to resolve the process group leader and then attempt to resolve its current working directory. This is not guaranteed to succeed, and there are a number of potential edge cases (which is another reason for configuring your shell to use OSC 7 sequences).

On Windows, there isn't a process group leader concept, but wezterm will examine the process tree of the program that it started in the current pane and use some heuristics to determine an approximate equivalent.


tags:

  • multiplexing

default_domain = "local"

{{since('20220319-142410-0fcdea07')}}

!!! note This option only applies to the GUI. For the equivalent option in the standalone mux server, see default_mux_server_domain

When starting the GUI (not using the serial or connect subcommands), by default wezterm will set the built-in "local" domain as the default multiplexing domain.

The "local" domain represents processes that are spawned directly on the local system.

Windows users, particularly those who use WSL, may wish to override the default domain to instead use a particular WSL distribution so that wezterm launches directly into a Linux shell rather than having to manually invoke wsl.exe. Using a WslDomain for this has the advantage that wezterm can then use shell integration to track the current directory inside WSL and use it when splitting new panes or spawning new tabs.

For example, if:

; wsl -l -v
  NAME            STATE           VERSION
* Ubuntu-18.04    Running         1

then wezterm will by default create a WslDomain with the name "WSL:Ubuntu-18.04" and if I set my config like this:

config.default_domain = 'WSL:Ubuntu-18.04'

then when wezterm starts up, it will open with a shell running inside that Ubuntu distribution rather than using the default cmd or powershell.

While these examples are WSL-centric, default_domain will accept the name of any of the available multiplexing domains.


tags:

  • event

default_gui_startup_args = {"start"}

{{since('20220101-133340-7edc5b5a')}}

When launching the GUI using either wezterm or wezterm-gui (with no subcommand explicitly specified), wezterm will use the value of default_gui_startup_args to pick a default mode for running the GUI.

The default for this config is {"start"} which makes wezterm with no additional subcommand arguments equivalent to wezterm start.

If you know that you always want to use wezterm's ssh client to login to a particular host, then you might consider using this configuration:

config.default_gui_startup_args = { 'ssh', 'some-host' }

which will cause wezterm with no additional subcommand arguments to be equivalent to running wezterm ssh some-host.

Specifying subcommand arguments on the command line is NOT additive with this config; the command line arguments always take precedence.

Depending on your desktop environment, you may find it simpler to use your operating system shortcut or alias function to set up a shortcut that runs the subcommand you desire.


tags:

  • multiplexing

default_mux_server_domain = "local"

{{since('20230712-072601-f4abf8fd')}}

!!! note This option only applies to the standalone mux server. For the equivalent option in the GUI, see default_domain

When starting the mux server, by default wezterm will set the built-in "local" domain as the default multiplexing domain.

The "local" domain represents processes that are spawned directly on the local system.

This option allows you to change the default domain to some other domain, such as an ExecDomain.

It is not possible to configure a client multiplexing domain such as a TLS, SSH or Unix domain as the default for the multiplexer server. That is prohibited in order to prevent recursion when a client connects to the server.


tags:

  • spawn

default_prog

If no prog is specified on the command line, use this instead of running the user's shell.

For example, to have wezterm always run top by default, you'd use this:

config.default_prog = { 'top' }

default_prog is implemented as an array where the 0th element is the command to run and the rest of the elements are passed as the positional arguments to that command.

See also: Launching Programs


tags:

  • multiplexing
  • ssh

default_ssh_auth_sock

{{since('nightly')}}

Setting this value will cause wezterm to replace the the value of the SSH_AUTH_SOCK environment when it first starts up, and to use this value for the auth socket registered with the multiplexer server (visible via wezterm cli list-clients).

You won't normally need to set this, but if you are running with an alternative identity agent and want to replace the default on your system, this gives you that ability.

For example, @wez currently uses the 1Password SSH Auth Agent, but when running on Gnome the system default is Gnome's keyring agent.

While you can fix this up in your shell startup files, those are not involved when spawning the GUI directly from the desktop environment.

The following wezterm configuration snippet shows how to detect when gnome keyring is set and to selectively replace it with the 1Password agent:

local config = wezterm.config_builder()

-- Override gnome keyring with 1password's ssh agent
local SSH_AUTH_SOCK = os.getenv 'SSH_AUTH_SOCK'
if
  SSH_AUTH_SOCK
  == string.format('%s/keyring/ssh', os.getenv 'XDG_RUNTIME_DIR')
then
  local onep_auth =
    string.format('%s/.1password/agent.sock', wezterm.home_dir)
  -- Glob is being used here as an indirect way to check to see if
  -- the socket exists or not. If it didn't, the length of the result
  -- would be 0
  if #wezterm.glob(onep_auth) == 1 then
    config.default_ssh_auth_sock = onep_auth
  end
end

tags:

  • multiplexing
  • workspace

default_workspace = "default"

{{since('20220319-142410-0fcdea07')}}

Specifies the name of the default workspace. The default is "default".

detect_password_input = true

{{since('20220903-194523-3bb1ed61')}}

When set to true, on unix systems, for local panes, wezterm will query the termios associated with the PTY to see whether local echo is disabled and canonical input is enabled.

If those conditions are met, then the text cursor will be changed to a lock to give a visual cue that what you type will not be echoed to the screen.

This technique only works for local processes on unix systems, and will not work through other processes that themselves use PTYs. Most notably, this will not work with tmux or remote processes spawned via ssh.


tags:

  • mouse

disable_default_mouse_bindings = false

If set to true, the default mouse assignments will not be used, allowing you to tightly control those assignments.


tags:

  • quick_select

disable_default_quick_select_patterns = false

{{since('20210502-130208-bff6815d')}}

When set to true, the default set of quick select patterns are omitted, and your quick_select_patterns config specifies the total set of patterns used for quick select mode.

Defaults to false.


tags:

  • font
  • appearance

display_pixel_geometry = "RGB"

{{since('20230408-112425-69ae8472')}}

Configures whether subpixel anti-aliasing should produce either "RGB" or "BGR" ordered output.

If your display has a BGR pixel geometry then you will want to set this to "BGR" for the best results when using subpixel antialiasing.

The default value is "RGB".


tags:

  • font
  • appearance

dpi

Override the detected DPI (dots per inch) for the display.

This can be useful if the detected DPI is inaccurate and the text appears either blurry or too small (especially if you are using a 4K display on X11 or Wayland).

The default value is system specific:

OSStandard DensityHigh Density
macOS72.0144.0
WindowsProbed from the displayProbed from the display
X1196.096.0
X11 (version 20210314-114017-04b7cedd and later)Probed from Xft.dpi, fallback to 96.0Probed from Xft.dpi, fallback to 96.0
X11 (version 20210814-124438-54e29167 and later)Reads Xft/DPI via xsettings, fallback to Xft.dpi, then fallback to 96.0same as standard density
Wayland96.0192.0

In macOS and Wayland environments there isn't strictly a system DPI value that can be queried; instead standard density has a fixed value and the system will inform WezTerm when the display is high density by communicating a scaling factor for the display.

The Wayland protocol only allows for integer scaling factors, but some compositors support fractional scaling. That fractional scaling can result in blurry text and you may wish to specify a DPI value to compensate.

On macOS the scaling factor changes based on the monitor on which the window is displayed; dragging the window from a retina laptop display to an external standard DPI display causes the window to automatically adjust to the DPI scaling.

Microsoft Windows reports the true DPI for the monitor on which the window is displayed, and will similarly adjust as the window is dragged between monitors.

DPI is poorly supported by X11 itself; while it is possible to query the displays to determine their dimensions, the results are generally inaccurate. It is common for X11 environments to publish an Xft.dpi value as a property of the root window as a hint for the DPI of the display. While that is a reasonable workaround for a single-monitor system, it isn't ideal for a multi-monitor setup where the monitors have varying DPIs.


tags:

  • keys

enable_csi_u_key_encoding = false

When set to true, the keyboard encoding will be changed to use the scheme that is described here.

It is not recommended to enable this option as it does change the behavior of some keys in backwards incompatible ways and there isn't a way for applications to detect or request this behavior.

The default for this option is false.

Note that allow_win32_input_mode takes precedence over this option.


tags:

  • keys

enable_kitty_keyboard = false

{{since('20220624-141144-bd1b7c5d')}}

When set to true, wezterm will honor kitty keyboard protocol escape sequences that modify the keyboard encoding.


tags:

  • appearance
  • scroll_bar

enable_scroll_bar

Enable the scrollbar. This is currently disabled by default. It will occupy the right window padding space.

If right padding is set to 0 then it will be increased to a single cell width.

config.enable_scroll_bar = true

tags:

  • appearance
  • tab_bar

enable_tab_bar = true

Controls whether the tab bar is enabled. Set to false to disable it.

See also hide_tab_bar_if_only_one_tab

enable_wayland

If false, do not try to use a Wayland protocol connection when starting the gui frontend, and instead use X11.

This option is only considered on X11/Wayland systems and has no effect on macOS or Windows.

The default is true. In versions prior to 20220624-141144-bd1b7c5d it was disabled by default.

config.enable_wayland = true

tags:

  • exit_behavior

exit_behavior = "CloseOnCleanExit"

{{since('20210314-114017-04b7cedd')}}

Controls the behavior when the shell program spawned by the terminal exits. There are three possible values:

  • "Close" - close the corresponding pane as soon as the program exits.
  • "Hold" - keep the pane open after the program exits. The pane must be manually closed via CloseCurrentPane, CloseCurrentTab or closing the window.
  • "CloseOnCleanExit" - if the shell program exited with a successful status, behave like "Close", otherwise, behave like "Hold". This is the default setting.
console.exit_behavior = 'Hold'

Note that most unix shells will exit with the status of the last command that it ran if you don't specify an exit status.

For example, if you interrupt a command and then use exit (with no arguments), or CTRL-D to send EOF to the shell, the shell will return an unsuccessful exit status. The same thing holds if you were to run:

$ false
$ exit

With the default exit_behavior="CloseOnCleanExit" setting, that will cause the pane to remain open.

See also: clean_exit_codes for fine tuning what is considered to be a clean exit status.

{{since('20220624-141144-bd1b7c5d')}}

The default is now "Close".


tags:

  • exit_behavior

exit_behavior_messaging = "Verbose"

{{since('20230712-072601-f4abf8fd')}}

Controls how wezterm indicates the exit status of the spawned process in a pane when it terminates.

If exit_behavior is set to keep the pane open after the process has completed, wezterm will display a message to let you know that it has finished.

This option controls that message. It can have one of the following values:

  • "Verbose" - Shows 2-3 lines of explanation, including the process name, its exit status and a link to the exit_behavior documentation.
  • "Brief" - Like "Verbose", but the link to the documentation is not included.
  • "Terse" - A very short indication of the exit status is shown in square brackets.
  • "None" - No message is shown.

In earlier versions of wezterm, this was not configurable and behaved equivalently to the "Verbose" setting.

Example of a failing process with Verbose messaging

$ wezterm -n --config 'default_prog={"false"}' \
    --config 'exit_behavior="Hold"' \
    --config 'exit_behavior_messaging="Verbose"'

Produces:

⚠️  Process "false" in domain "local" didn't exit cleanly
Exited with code 1
This message is shown because exit_behavior="Hold"

Example of a failing process with Brief messaging

$ wezterm -n --config 'default_prog={"false"}' \
     --config 'exit_behavior="Hold"' \
     --config 'exit_behavior_messaging="Brief"'

Produces:

⚠️  Process "false" in domain "local" didn't exit cleanly
Exited with code 1

Example of a failing process with Terse messaging

$ wezterm -n --config 'default_prog={"false"}' \
     --config 'exit_behavior="Hold"' \
     --config 'exit_behavior_messaging="Terse"'

Produces:

[Exited with code 1]

Example of a successful process with Verbose messaging

$ wezterm -n --config 'default_prog={"true"}' \
     --config 'exit_behavior="Hold"' \
     --config 'exit_behavior_messaging="Verbose"'

Produces:

👍 Process "true" in domain "local" completed.
This message is shown because exit_behavior="Hold"

Example of a successful process with Brief messaging

$ wezterm -n --config 'default_prog={"true"}' \
     --config 'exit_behavior="Hold"' \
     --config 'exit_behavior_messaging="Brief"'

Produces:

👍 Process "true" in domain "local" completed.

Example of a successful process with Terse messaging

$ wezterm -n --config 'default_prog={"true"}' \
     --config 'exit_behavior="Hold"' \
     --config 'exit_behavior_messaging="Terse"'

Produces:

[done]

tags:

  • font

font

Configures the font to use by default. The font setting can specify a set of fallbacks and other options, and is described in more detail in the Fonts section.

You will typically use wezterm.font or wezterm.font_with_fallback to specify the font.


tags:

  • font

font_antialias = "Greyscale"

Deprecated starting in version 20210314-114017-04b7cedd; this option no longer does anything and will be removed in a future release. Use freetype_load_target instead

Adjusts the anti-aliasing portion of the font rasterizer.

Possible values are None, Greyscale, Subpixel.

The default value is Greyscale.


tags:

  • font

font_dirs

By default, wezterm will use an appropriate system-specific method for locating the fonts that you specify using the options below. In addition, if you configure the font_dirs option, wezterm will load fonts from that set of directories:

-- This tells wezterm to look first for fonts in the directory named
-- `fonts` that is found alongside your `wezterm.lua` file.
-- As this option is an array, you may list multiple locations if
-- you wish.
config.font_dirs = { 'fonts' }

wezterm will scan the font_dirs to build a database of available fonts. When resolving a font, wezterm will first use the configured font_locator which is typically the system specific font resolver. If the system doesn't resolve the requested font, the fonts from font_dirs are searched for a match.

If you want to only find fonts from your font_dirs, perhaps because you have a self-contained wezterm config that you carry around with you between multiple systems and don't want to install those fonts on every system that you use, then you can set:

config.font_locator = 'ConfigDirsOnly'

tags:

  • font

font_hinting = "Full"

Deprecated starting in version 20210314-114017-04b7cedd; this option no longer does anything and will be removed in a future release. Use freetype_load_target instead

Adjust the hinting portion of the font rasterizer.

Possible values are None, Vertical, VerticalSubpixel, Full.


tags:

  • font

font_locator

specifies the method by which system fonts are located and loaded. You may specify ConfigDirsOnly to disable loading system fonts and use only the fonts found in the directories that you specify in your font_dirs configuration option.

Otherwise, it is recommended to omit this setting.


tags:

  • font

font_rasterizer

Specifies the method by which fonts are rendered on screen. The only available implementation is FreeType.


tags:

  • font

font_rules

When textual output in the terminal is styled with bold, italic or other attributes, wezterm uses font_rules to decide how to render that text.

By default, unstyled text will use the font specified by the font configuration, and wezterm will use that as a base, and then automatically generate appropriate font_rules that use heavier weight fonts for bold text, lighter weight fonts for dim text and italic fonts for italic text.

Most users won't need to specify any explicit value for font_rules, as the defaults should be sufficient.

If you have some unusual fonts or mixtures of fonts that you'd like to use, such as using your favourite monospace font for the base and a fancy italic font from a different font family for italics, then font_rules will allow you to do so.

font_rules is comprised of a list of rule entries with fields that are split into matcher fields and action fields. Matcher fields specify which textual attributes you want to match on, while action fields specify how you want to render them.

The following fields are matcher fields:

NameAssociated AttributePossible Values
italicitalictrue (italic) or false (not italic)
intensitybold/bright or dim/half-bright"Normal" (neither bold nor dim), "Bold", "Half"
underlineunderline"None" (not underlined), "Single" (single underline), "Double" (double underline)
blinkblinking"None" (not blinking), "Rapid" (regular rapid blinking), "Slow" (slow blinking)
reversereverse/inversetrue (reversed) or false (not reversed)
strikethroughstrikethroughtrue (struck-through) or false (not struck-through)
invisibleinvisibletrue (invisible) or false (not invisible)

If a matcher field is omitted, then the associated attribute has no impact on the match: the rule doesn't care about that attribute and will match based on the attributes that were listed.

The following fields are action fields:

NameAction
fontSpecify the font that should be used

The way that font_rules are processed is:

  1. Take the list of font_rules from your configuration
  2. For each rule in the order listed in font_rules:
  3. Consider each matcher field explicitly specified in the entry. If the associated attribute does not match the value specified in the entry, move on to the next rule.
  4. If all of the matcher fields explicitly specified in the entry match the attributes of the text, then:
    • The font action field, if specified, will override the base font configuration
    • No further font_rules will be considered: the matching is complete
  5. If none of the rules you specify matched, then a set of default rules based on your base font will be used in the same way as above.

Here's an example from my configuration file, which I use with a variant of Operator Mono that is patched to add ligatures. This particular font has font-weights that are either too bold or too light for the default rules to produce great results, hence this set of rules.

config.font = wezterm.font_with_fallback 'Operator Mono SSm Lig Medium'
config.font_rules = {
  -- For Bold-but-not-italic text, use this relatively bold font, and override
  -- its color to a tomato-red color to make bold text really stand out.
  {
    intensity = 'Bold',
    italic = false,
    font = wezterm.font_with_fallback(
      'Operator Mono SSm Lig',
      -- Override the color specified by the terminal output and force
      -- it to be tomato-red.
      -- The color value you set here can be any CSS color name or
      -- RGB color string.
      { foreground = 'tomato' }
    ),
  },

  -- Bold-and-italic
  {
    intensity = 'Bold',
    italic = true,
    font = wezterm.font_with_fallback {
      family = 'Operator Mono SSm Lig',
      italic = true,
    },
  },

  -- normal-intensity-and-italic
  {
    intensity = 'Normal',
    italic = true,
    font = wezterm.font_with_fallback {
      family = 'Operator Mono SSm Lig',
      weight = 'DemiLight',
      italic = true,
    },
  },

  -- half-intensity-and-italic (half-bright or dim); use a lighter weight font
  {
    intensity = 'Half',
    italic = true,
    font = wezterm.font_with_fallback {
      family = 'Operator Mono SSm Lig',
      weight = 'Light',
      italic = true,
    },
  },

  -- half-intensity-and-not-italic
  {
    intensity = 'Half',
    italic = false,
    font = wezterm.font_with_fallback {
      family = 'Operator Mono SSm Lig',
      weight = 'Light',
    },
  },
}

Here's another example combining FiraCode with Victor Mono, using Victor Mono only for italics:

config.font = wezterm.font { family = 'FiraCode' }

config.font_rules = {
  {
    intensity = 'Bold',
    italic = true,
    font = wezterm.font {
      family = 'VictorMono',
      weight = 'Bold',
      style = 'Italic',
    },
  },
  {
    italic = true,
    intensity = 'Half',
    font = wezterm.font {
      family = 'VictorMono',
      weight = 'DemiBold',
      style = 'Italic',
    },
  },
  {
    italic = true,
    intensity = 'Normal',
    font = wezterm.font {
      family = 'VictorMono',
      style = 'Italic',
    },
  },
}

Debugging Font Rules

You can run wezterm ls-fonts to summarize the font rules and the fonts that match them:

$ wezterm ls-fonts
Primary font:
wezterm.font_with_fallback({
  -- <built-in>, BuiltIn
  "JetBrains Mono",

  -- /home/wez/.fonts/NotoColorEmoji.ttf, FontConfig
  "Noto Color Emoji",
})


When Intensity=Half Italic=true:
wezterm.font_with_fallback({
  -- <built-in>, BuiltIn
  {family="JetBrains Mono", weight="ExtraLight", italic=true},

  -- /home/wez/.fonts/NotoColorEmoji.ttf, FontConfig
  "Noto Color Emoji",

  -- <built-in>, BuiltIn
  "JetBrains Mono",
})


When Intensity=Half Italic=false:
wezterm.font_with_fallback({
  -- <built-in>, BuiltIn
  {family="JetBrains Mono", weight="ExtraLight"},

  -- /home/wez/.fonts/NotoColorEmoji.ttf, FontConfig
  "Noto Color Emoji",

  -- <built-in>, BuiltIn
  "JetBrains Mono",
})


When Intensity=Bold Italic=false:
wezterm.font_with_fallback({
  -- <built-in>, BuiltIn
  {family="JetBrains Mono", weight="Bold"},

  -- /home/wez/.fonts/NotoColorEmoji.ttf, FontConfig
  "Noto Color Emoji",

  -- <built-in>, BuiltIn
  "JetBrains Mono",
})


When Intensity=Bold Italic=true:
wezterm.font_with_fallback({
  -- <built-in>, BuiltIn
  {family="JetBrains Mono", weight="Bold", italic=true},

  -- /home/wez/.fonts/NotoColorEmoji.ttf, FontConfig
  "Noto Color Emoji",

  -- <built-in>, BuiltIn
  "JetBrains Mono",
})


When Intensity=Normal Italic=true:
wezterm.font_with_fallback({
  -- <built-in>, BuiltIn
  {family="JetBrains Mono", italic=true},

  -- /home/wez/.fonts/NotoColorEmoji.ttf, FontConfig
  "Noto Color Emoji",

  -- <built-in>, BuiltIn
  "JetBrains Mono",
})

tags:

  • font

font_shaper

specifies the method by which text is mapped to glyphs in the available fonts. The shaper is responsible for handling kerning, ligatures and emoji composition. The default is Harfbuzz and we have very preliminary support for Allsorts.

It is strongly recommended that you use the default Harfbuzz shaper.

{{since('20211204-082213-a66c61ee9')}}

The incomplete Allsorts shaper was removed.


tags:

  • font

font_size = 12.0

Specifies the size of the font, measured in points.

You may use fractional point sizes, such as 13.3, to fine tune the size.

The default font size is 12.0 points. In earlier versions prior to 20210314-114017-04b7cedd it was 10.0.


tags:

  • appearance
  • text_cursor

force_reverse_video_cursor = false

{{since('20210502-130208-bff6815d')}}

When force_reverse_video_cursor = true, override the cursor_fg, cursor_bg, cursor_border settings from the color scheme and force the cursor to use reverse video colors based on the foreground and background colors.

When force_reverse_video_cursor = false (the default), cursor_fg, cursor_bg and cursor_border color scheme settings are applied as normal.

{{since('20220319-142410-0fcdea07')}}

If escape sequences are used to change the cursor color, they will take precedence over force_reverse_video_cursor. In earlier releases, setting force_reverse_video_cursor = true always ignored the configured cursor color.


tags:

  • appearance

foreground_text_hsb

{{since('20210314-114017-04b7cedd')}}

Configures a Hue, Saturation, Brightness transformation that is applied to monochrome glyphs.

The transform works by converting the RGB colors to HSV values and then multiplying the HSV by the numbers specified in foreground_text_hsb.

Modifying the hue changes the hue of the color by rotating it through the color wheel. It is not as useful as the other components, but is available "for free" as part of the colorspace conversion.

Modifying the saturation can add or reduce the amount of "colorfulness". Making the value smaller can make it appear more washed out.

Modifying the brightness can be used to dim or increase the perceived amount of light.

The range of these values is 0.0 and up; they are used to multiply the existing values, so the default of 1.0 preserves the existing component, whilst 0.5 will reduce it by half, and 2.0 will double the value.

-- This increases color saturation by 50%
config.foreground_text_hsb = {
  hue = 1.0,
  saturation = 1.5,
  brightness = 1.0,
}

demonstrating the appearance of the default value demonstrating setting saturating to 1.5 demonstrating setting brightness to 1.5 demonstrating setting hue to 1.5


tags:

  • font

freetype_interpreter_version

Selects the freetype interpret version to use. Possible values are 35, 38 and 40 which have different characteristics with respective to subpixel hinting. See https://freetype.org/freetype2/docs/hinting/subpixel-hinting.html


tags:

  • font

freetype_load_flags = "DEFAULT"

{{since('20210314-114017-04b7cedd')}}

An advanced option to fine tune the freetype rasterizer. This is a bitfield, so you can combine one or more of these options together, separated by the | character, although not many of the available options necessarily make sense to be combined.

Available flags are:

  • DEFAULT - This is the default!
  • NO_HINTING - Disable hinting. The freetype documentation says that this generally generates ‘blurrier’ bitmap glyph when the glyph is rendered in any of the anti-aliased modes, but that was written for rasterizing direct to bitmaps. In the context of wezterm where we are rasterizing to a texture that is then sampled and applied to a framebuffer through vertices on the GPU, the hinting process can be counter-productive and result in unexpected visual artifacts.
  • NO_BITMAP - don't load any pre-rendered bitmap strikes
  • FORCE_AUTOHINT - Use the freetype auto-hinter rather than the font's native hinter.
  • MONOCHROME - instructs renderer to use 1-bit monochrome rendering. This option doesn't impact the hinter.
  • NO_AUTOHINT - don't use the freetype auto-hinter
-- You probably don't want to do this, but this demonstrates
-- that the flags can be combined
config.freetype_load_flags = 'NO_HINTING|MONOCHROME'

{{since('20240128-202157-1e552d76')}}

The default value has changed to NO_HINTING as that generally works more predictably and with fewer surprising artifacts.

In earlier versions, it is recommended that you configure this explicitly:

config.freetype_load_flags = 'NO_HINTING'

{{since('20240203-110809-5046fc22')}}

The default value depends on the effective dpi of the display. If the dpi is 100 or larger, the default value is NO_HINTING. Otherwise, the default value is DEFAULT.


tags:

  • font

freetype_load_target = "Normal"

{{since('20210314-114017-04b7cedd')}}

Configures the hinting and (potentially) the rendering mode used with the freetype rasterizer. The following values are possible:

  • "Normal" - This corresponds to the default hinting algorithm, optimized for standard gray-level rendering. This is the default setting.
  • "Light" - A lighter hinting algorithm for non-monochrome modes. Many generated glyphs are more fuzzy but better resemble its original shape. A bit like rendering on Mac OS X.
  • "Mono" - Strong hinting algorithm that should only be used for monochrome output. The result is probably unpleasant if the glyph is rendered in non-monochrome modes.
  • "HorizontalLcd" - A subpixel-rendering variant of Normal optimized for horizontally decimated LCD displays.

See also freetype_render_target and freetype_load_flags for more advanced flags that can be primarily used to influence font hinting.

Note: when using subpixel-rendering, it comes at the cost of the ability to explicitly set the alpha channel for the text foreground color. You will need to choose between using the alpha channel or using subpixel-rendering, and you must select subpixel-rendering in your main configuration in order for the correct render mode to activate: setting it only in a wezterm.font override is not sufficient.

{{since('20240127-113634-bbcac864')}}

It is now possible to select "VerticalLcd" to use a subpixel-rendering variant of Normal optimized for vertically decimated LCD displays.


tags:

  • font

freetype_pcf_long_family_names = false

{{since('20220624-141144-bd1b7c5d')}}

This option provides control over the no-long-family-names FreeType PCF font driver property.

The default is for this configuration to be false which sets the PCF driver to use the un-decorated font name. This corresponds to the default mode of operation of the freetype library.

Some Linux distributions build the freetype library in a way that causes the PCF driver to report font names differently; instead of reporting just Terminus it will prefix the font name with the foundry (xos4 in the case of Terminus) and potentially append Wide to the name if the font has wide glyphs. The purpose of that configuration option is to disambiguate fonts, as there are a number of fonts from different foundries that all have the name Fixed, and being presented with multiple items with the same Fixed label is a very ambiguous user experience.

When two different applications have differing values for this long family names property, they will face inconsistencies in resolving fonts by name as they will disagree on what the name of a given PCF font is.

When should you set this option to true?

If all of the following are true, then you should set this option to true:

  • You need to use PCF fonts and you need to use fontconfig to resolve their names to font files.
  • You are using a Linux distribution that builds their FreeType library with PCF_CONFIG_OPTION_LONG_FAMILY_NAMES defined.

Note that PCF fonts are a legacy font format and you will be better served by OTF, TTF or OTB (open type binary) file formats.

Why doesn't wezterm use the distro FreeType or match its configuration?

For the sake of consistency, wezterm vendors in its own copy of the latest version FreeType and builds that same version on all platforms. The result is that font-related behaviors in a given version of wezterm are the same on all platforms regardless of what (potentially old) version of FreeType may be provided by the distribution.

Not only does this provide consistency at runtime, but it is much simpler to reason about at build time, making it simpler to build wezterm on all systems.


tags:

  • font

freetype_render_target = "Normal"

{{since('20210502-130208-bff6815d')}}

Configures the rendering mode used with the freetype rasterizer.

The default is to use the value of freetype_load_target.

You may wish to override that value if you want very fine control over how freetype hints and then renders glyphs.

For example, this configuration uses light hinting but produces subpixel-antialiased glyph bitmaps:

config.freetype_load_target = 'Light'
config.freetype_render_target = 'HorizontalLcd'

tags:

  • gpu

front_end = "OpenGL"

Specifies which render front-end to use. This option used to have more scope in earlier versions of wezterm, but today it allows three possible values:

  • OpenGL - use GPU accelerated rasterization
  • Software - use CPU-based rasterization.
  • WebGpu - use GPU accelerated rasterization {{since('20221119-145034-49b9839f', inline=True)}}

{{since('20240127-113634-bbcac864', outline=true)}} The default is "WebGpu". In earlier versions it was "OpenGL"

{{since('20240128-202157-1e552d76', outline=true)}} The default has been reverted to "OpenGL".

You may wish (or need!) to select Software if there are issues with your GPU/OpenGL drivers.

WezTerm will automatically select Software if it detects that it is being started in a Remote Desktop environment on Windows.

WebGpu

{{since('20221119-145034-49b9839f')}}

The WebGpu front end allows wezterm to use GPU acceleration provided by a number of platform-specific backends:

  • Metal (on macOS)
  • Vulkan
  • DirectX 12 (on Windows)

See also:


tags:

  • font

harfbuzz_features

When font_shaper = "Harfbuzz", this setting affects how font shaping takes place.

See Font Shaping for more information and examples.


tags:

  • mouse_cursor
  • appearance

hide_mouse_cursor_when_typing

{{since('20230320-124340-559cb7b0')}}

If true, the mouse cursor will be hidden when typing, if your mouse cursor is hovering over the window.

The default is true. Set to false to disable this behavior.

config.hide_mouse_cursor_when_typing = true

tags:

  • tab_bar
  • appearance

hide_tab_bar_if_only_one_tab = false

If set to true, when there is only a single tab, the tab bar is hidden from the display. If a second tab is created, the tab will be shown.

See also enable_tab_bar


tags:

  • hyperlink

hyperlink_rules

Defines rules to match text from the terminal output and generate clickable links.

The value is a list of rule entries. Each entry has the following fields:

  • regex - the regular expression to match (see supported Regex syntax)
  • format - Controls which parts of the regex match will be used to form the link. Must have a prefix: signaling the protocol type (e.g., https:/mailto:), which can either come from the regex match or needs to be explicitly added. The format string can use placeholders like $0, $1, $2 etc. that will be replaced with that numbered capture group. So, $0 will take the entire region of text matched by the whole regex, while $1 matches out the first capture group. In the example below, mailto:$0 is used to prefix a protocol to the text to make it into an URL.

{{since('20230320-124340-559cb7b0', outline=True)}} * highlight - specifies the range of the matched text that should be highlighted/underlined when the mouse hovers over the link. The value is a number that corresponds to a capture group in the regex. The default is 0, highlighting the entire region of text matched by the regex. 1 would be the first capture group, and so on.

{{since('20230408-112425-69ae8472', outline=True)}} The regex syntax now supports backreferences and look around assertions. See Fancy Regex Syntax for the extended syntax, which builds atop the underlying Regex syntax. In prior versions, only the base Regex syntax was supported.

Assigning hyperlink_rules overrides the built-in default rules.

The default value for hyperlink_rules can be retrieved using wezterm.default_hyperlink_rules(), and is shown below:

config.hyperlink_rules = {
  -- Matches: a URL in parens: (URL)
  {
    regex = '\\((\\w+://\\S+)\\)',
    format = '$1',
    highlight = 1,
  },
  -- Matches: a URL in brackets: [URL]
  {
    regex = '\\[(\\w+://\\S+)\\]',
    format = '$1',
    highlight = 1,
  },
  -- Matches: a URL in curly braces: {URL}
  {
    regex = '\\{(\\w+://\\S+)\\}',
    format = '$1',
    highlight = 1,
  },
  -- Matches: a URL in angle brackets: <URL>
  {
    regex = '<(\\w+://\\S+)>',
    format = '$1',
    highlight = 1,
  },
  -- Then handle URLs not wrapped in brackets
  {
    regex = '\\b\\w+://\\S+[)/a-zA-Z0-9-]+',
    format = '$0',
  },
  -- implicit mailto link
  {
    regex = '\\b\\w+@[\\w-]+(\\.[\\w-]+)+\\b',
    format = 'mailto:$0',
  },
}

!!! note In quoted Lua string literals the backslash character must be quoted even if the following character isn't meaningful to Lua when quoted by a backslash. That means that you'll always want to double it up as \\ when using it in a regex string.

Alternatively, you can use the alternative string literal
syntax; the following two examples are equivalent:

```lua
regex = [[\b[tT](\d+)\b]]
```

```lua
regex = '\\b[tT](\\d+)\\b'
```

Some other examples include:

-- Use the defaults as a base
config.hyperlink_rules = wezterm.default_hyperlink_rules()

-- make task numbers clickable
-- the first matched regex group is captured in $1.
table.insert(config.hyperlink_rules, {
  regex = [[\b[tt](\d+)\b]],
  format = 'https://example.com/tasks/?t=$1',
})

-- make username/project paths clickable. this implies paths like the following are for github.
-- ( "nvim-treesitter/nvim-treesitter" | wbthomason/packer.nvim | wezterm/wezterm | "wezterm/wezterm.git" )
-- as long as a full url hyperlink regex exists above this it should not match a full url to
-- github or gitlab / bitbucket (i.e. https://gitlab.com/user/project.git is still a whole clickable url)
table.insert(config.hyperlink_rules, {
  regex = [[["]?([\w\d]{1}[-\w\d]+)(/){1}([-\w\d\.]+)["]?]],
  format = 'https://www.github.com/$1/$3',
})

tags:

  • keys
  • appearance

ime_preedit_rendering

{{since('20220624-141144-bd1b7c5d')}}

Control IME preedit rendering. IME preedit is an area that is used to display the string being preedited in IME. WezTerm supports the following IME preedit rendering.

  • "Builtin" - (Default) IME preedit is rendered by WezTerm itself

    "Builtin" rendering provides good look and feel for many IMEs, rendering the text using the same font as the terminal and works in concert with features like window:composition_status().

  • "System" - IME preedit is rendered by system

    "Builtin" rendering may truncate displaying of IME preedit at the end of window if IME preedit is very long because the rendering does not allow the IME preedit to overflow the window and does not wrap IME preedit to the next line. "System" rendering can be useful to avoid the truncated displaying of IME preedit but has a worse look and feel compared to "Builtin" rendering.

You can control IME preedit rendering in your configuration file:

config.ime_preedit_rendering = 'System'

Otherwise, the default is "Builtin".

Note:

  • Changing ime_preedit_rendering usually requires re-launching WezTerm to take full effect.
  • In macOS, ime_preedit_rendering has effected nothing yet. IME preedit is always rendered by WezTerm itself.

tags:

  • spawn

initial_cols = 80

Together with initial_rows, configures the window size (window width) for newly created windows.

Specifies the width of a new window, expressed in character cells.


tags:

  • spawn

initial_rows = 24

Together with initial_cols, configures the window size (window height) for newly created windows.

Specifies the height of a new window, expressed in character cells.


tags:

  • appearance

integrated_title_button_alignment = "Right"

{{since('20230408-112425-69ae8472')}}

Configures the alignment of the set of window management buttons when window_decorations = "INTEGRATED_BUTTONS|RESIZE".

Possible values are:

  • "Left" - the buttons are shown on the left side of the tab bar
  • "Right" - the buttons are shown on the right side of the tab bar

tags:

  • appearance

integrated_title_button_color = "Auto"

{{since('20230408-112425-69ae8472')}}

Configures the color of the set of window management buttons when window_decorations = "INTEGRATED_BUTTONS|RESIZE".

Possible values are:

  • config.integrated_title_button_color = "Auto" - automatically compute the color
  • config.integrated_title_button_color = "red" - Use a custom color

tags:

  • appearance

integrated_title_button_style = STYLE

{{since('20230408-112425-69ae8472')}}

Configures the visual style of the tabbar-integrated titlebar button replacements that are shown when window_decorations = "INTEGRATED_BUTTONS|RESIZE".

Possible styles are:

  • "Windows" - draw Windows-style buttons
  • "Gnome" - draw Adwaita-style buttons
  • "MacOsNative" - on macOS only, move the native macOS buttons into the tab bar.

The default value is "MacOsNative" on macOS systems, but "Windows" on other systems.


tags:

  • appearance

integrated_title_buttons = BUTTONS

{{since('20230408-112425-69ae8472')}}

Configures the ordering and set of window management buttons to show when window_decorations = "INTEGRATED_BUTTONS|RESIZE".

The value is a table listing the buttons. Each element can have one of the following values:

  • "Hide" - the window hide or minimize button
  • "Maximize" - the window maximize button
  • "Close" - the window close button

The default value is equivalent to:

config.integrated_title_buttons = { 'Hide', 'Maximize', 'Close' }

You can change the order by listing them in a different order:

config.integrated_title_buttons = { 'Close', 'Maximize', 'Hide' }

or remove buttons you don't want:

config.integrated_title_buttons = { 'Close' }

tags:

  • keys

key_map_preference = "Mapped"

{{since('20220408-101518-b908e2dd')}}

Controls how keys without an explicit phys: or mapped: prefix are treated.

If key_map_preference = "Mapped" (the default), then mapped: is assumed. If key_map_preference = "Physical" then phys: is assumed.

Default key assignments also respect key_map_preference.


tags:

  • keys

key_tables = {}

See the main Key Tables docs!


tags:

  • spawn
  • launch_menu

launch_menu

{{since('20200503-171512-b13ef15f')}}

You can define your own entries for the Launcher Menu using this configuration setting. The snippet below adds two new entries to the menu; one that runs the top program to monitor process activity and a second one that explicitly launches the bash shell.

Each entry in launch_menu is an instance of a SpawnCommand object.

config.launch_menu = {
  {
    args = { 'top' },
  },
  {
    -- Optional label to show in the launcher. If omitted, a label
    -- is derived from the `args`
    label = 'Bash',
    -- The argument array to spawn.  If omitted the default program
    -- will be used as described in the documentation above
    args = { 'bash', '-l' },

    -- You can specify an alternative current working directory;
    -- if you don't specify one then a default based on the OSC 7
    -- escape sequence will be used (see the Shell Integration
    -- docs), falling back to the home directory.
    -- cwd = "/some/path"

    -- You can override environment variables just for this command
    -- by setting this here.  It has the same semantics as the main
    -- set_environment_variables configuration option described above
    -- set_environment_variables = { FOO = "bar" },
  },
}

tags:

  • font

line_height = 1.0

Scales the computed line height to adjust the spacing between successive rows of text. The default line height is controlled by the font_size configuration option. If you feel that your chosen font feels too vertically cramped then you can set line_height = 1.2 to increase the vertical spacing by 20%. Conversely, setting line_height = 0.9 will decrease the vertical spacing by 10%.

See also: cell_width

log_unknown_escape_sequences = false

{{since('20230320-124340-559cb7b0')}}

When set to true, wezterm will log warnings when it receives escape sequences which it does not understand. Those warnings are harmless and are useful primarily by the maintainer to discover new and interesting escape sequences.

In previous versions, there was no option to control this, and wezterm would always log warnings for unknown escape sequences.


tags:

  • keys

macos_forward_to_ime_modifier_mask = "SHIFT"

{{since('20230408-112425-69ae8472')}}

On macOS systems, this option controls whether modified key presses are routed via the IME when use_ime = true.

When processing a key event, if any modifiers are held, if the modifiers intersect with the value of macos_forward_to_ime_modifier_mask, then the key event is routed to the IME, which may choose to swallow the key event as part of its own state management.

The behavior of wezterm has varied in the past:

VersionEffective Setting
20220905-102802-7d4b8249 and earlier"SHIFT"
20221119-145034-49b9839f"SHIFT
nightly"SHIFT"

Users of a Japanese IME may wish to set this to "SHIFT|CTRL", but should note that it will prevent certain CTRL key combinations that are commonly used in unix terminal programs from working as expected.


tags:

  • appearance

macos_window_background_blur = 0

{{since('20230326-111934-3666303c')}}

When combined with window_background_opacity, configures the blur radius amount used by macOS when compositing the window on the screen.

This can be used to produce a translucent window effect rather than a crystal clear transparent window effect.

The screenshot below was achieved using this configuration:

config.window_background_opacity = 0.3
config.macos_window_background_blur = 20

Screenshot

The default value for macos_window_background_blur is 0.

See also win32_system_backdrop for a similar effect on Windows.


tags:

  • tuning

max_fps = 60

Limits the maximum number of frames per second that wezterm will attempt to draw.

Defaults to 60.

EnvironmentSupported Since
WaylandIgnored; instead, uses information from the compositor to schedule painting frames
X11{{since('20211204-082213-a66c61ee9', inline=True)}}
macOS{{since('20220903-194523-3bb1ed61', inline=True)}}
Windows{{since('20220903-194523-3bb1ed61', inline=True)}}

tags:

  • appearance
  • scroll_bar

min_scroll_bar_height = "0.5cell"

{{since('20220624-141144-bd1b7c5d')}}

Controls the minimum size of the scroll bar "thumb".

The value can be a number to specify the number of pixels, or a string with a unit suffix:

  • "1px" - the px suffix indicates pixels, so this represents a 1 pixel value
  • "1pt" - the pt suffix indicates points. There are 72 points in 1 inch. The actual size this occupies on screen depends on the dpi of the display device.
  • "1cell" - the cell suffix indicates the height of the terminal cell, which in turn depends on the font size, font scaling and dpi.
  • "1%" - the % suffix indicates the size of the terminal portion of the display, which is computed based on the number of rows and the size of the cell.

You may use a fractional number such as "0.5cell" or numbers larger than one such as "72pt".


tags:

  • mouse

mouse_wheel_scrolls_tabs

{{since('20230326-111934-3666303c')}}

If true, the vertical mouse wheel will switch between tabs when the mouse cursor is over the tab bar.

The default is true. Set to false to disable this behavior.

config.mouse_wheel_scrolls_tabs = true

tags:

  • multiplexing
  • ssh

mux_enable_ssh_agent = true

{{since('nightly')}}

When set to true (the default), wezterm will configure the SSH_AUTH_SOCK environment variable for panes spawned in the local domain.

The auth sock will point to a symbolic link that will in turn be pointed to the authentication socket associated with the most recently active multiplexer client.

You can review the authentication socket that will be used for various clients by running wezterm cli list-clients and inspecting the SSH_AUTH_SOCK column.

The symlink is updated within (at the time of writing this documentation) 100ms of the active Mux client changing.

You can set mux_enable_ssh_agent = false to prevent wezterm from assigning SSH_AUTH_SOCK or updating the symlink.


tags:

  • multiplexing
  • spawn

mux_env_remove

{{since('20211204-082213-a66c61ee9')}}

Specifies a list of environment variables that should be removed from the environment in the multiplexer server.

The intent is to clean up environment variables that might give the wrong impression of their operating environment to the various terminal sessions spawned by the multiplexer server.

The default value for this is:

config.mux_env_remove = {
  'SSH_AUTH_SOCK',
  'SSH_CLIENT',
  'SSH_CONNECTION',
}

tags:

  • appearance

native_macos_fullscreen_mode = false

Specifies whether the ToggleFullScreen key assignment uses the native macOS full-screen application support or not.

The default is false which will simply (and very quickly!) toggle between a window that covers the full screen, with no decorations and a regularly sized window.

When true, transitioning to full screen will use the macOS native full screen mode, which in more recent versions of macOS, will allocate a separate Space for the wezterm application and then slowly animate the wezterm window moving into to that full screen Space on the monitor.

This option only has an effect when running on macOS.


tags:

  • unicode

normalize_output_to_unicode_nfc = false

{{since('20221119-145034-49b9839f')}}

When set to true, contiguous runs codepoints output to the terminal are normalized to Unicode Normalization Form C (NFC).

This can improve the display of text and in the terminal when portions of the output are in other normalization forms, particularly with Korean text where a given glyph can be comprised of several codepoints.

However, depending on the application running inside the terminal, enabling this option may introduce discrepancies in the understanding of text positioning: while it may fix some display glitches for some applications, it may trade them for other glitches.

As such, you should consider this configuration setting to be an imperfect option!

This option defaults to false as it introduces some additional text processing that is not necessary for most users.


tags:

  • notifications

notification_handling = "AlwaysShow"

{{since('20240127-113634-bbcac864')}}

This option controls how wezterm behaves when a toast notification escape sequence is received.

The following escape sequences will generate a toast notification:

$ printf "\e]777;notify;%s;%s\e\\" "title" "body"
$ printf "\e]9;%s\e\\" "hello there"

This configuration option can have one of the following values, which have the following effects:

  • AlwaysShow - Show the notification regardless of the current focus
  • NeverShow - Never show the notification
  • SuppressFromFocusedPane - Show the notification unless it was generated from the currently focused pane
  • SuppressFromFocusedTab - Show the notification unless it was generated from the currently focused tab
  • SuppressFromFocusedWindow - Show the notification unless it was generated from the currently focused window

tags:

  • mouse

pane_focus_follows_mouse = false

{{since('20210502-130208-bff6815d')}}

When pane_focus_follows_mouse = true, moving the mouse pointer over an inactive pane will cause that pane to activate; this behavior is known as "focus follows mouse".

When pane_focus_follows_mouse = false (the default), you need to click on an inactive pane to activate it.


tags:

  • tuning

prefer_egl = true

Depending on the OS and windowing environment, there are a number of different ways to access the GPU.

This option controls whether wezterm should attempt to use EGL to configure the GPU.

Environmentprefer_egl=trueprefer_egl=false
Waylanduse wayland-eglNo effect: EGL is the only way to use the GPU
X11Use libEGL.soNo effect: EGL is the only way to use the GPU
macOSUse MetalANGLE libEGL.dylib if installed alongside the wezterm-gui executable. Some versions of wezterm shipped with this configuration which translated OpenGL calls to MetalUse Core OpenGL API (CGL). Since BigSur, CGL uses Metal APIs.
WindowsUse ANGLE to translate OpenGL calls to Direct3D, which makes wezterm more robust if you upgrade your graphics card drivers.Use the OpenGL implementation provided by your graphics card vendor

The default is true.


tags:

  • spawn

prefer_to_spawn_tabs = false

{{since('20240203-110809-5046fc22')}}

If set to true, launching a new instance of wezterm will prefer to spawn a new tab when it is able to connect to your already-running GUI instance.

Otherwise, it will spawn a new window.

The default value for this option is false.


tags:

  • quick_select

quick_select_alphabet

{{since('20210502-130208-bff6815d')}}

Specify the alphabet used to produce labels for the items matched in quick select mode.

The default alphabet is "asdfqwerzxcvjklmiuopghtybn" which means that the first matching item from the bottom is labelled with an a, the second with s and so forth; these are easily accessible characters in a qwerty keyboard layout.

Keyboard LayoutSuggested Alphabet
qwerty"asdfqwerzxcvjklmiuopghtybn" (this is the default)
qwertz"asdfqweryxcvjkluiopmghtzbn"
azerty"qsdfazerwxcvjklmuiopghtybn"
dvorak"aoeuqjkxpyhtnsgcrlmwvzfidb"
colemak"arstqwfpzxcvneioluymdhgjbk"

The suggested alphabet in the above table uses the left 4 fingers on the home row, top row, bottom row, then the right 4 fingers on the home raw, top row, bottom row, followed by the characters in the middle of the keyboard that may be harder to reach.


tags:

  • quick_select

quick_select_patterns

{{since('20210502-130208-bff6815d')}}

Specify additional patterns to match when in quick select mode. This setting is a table listing out a set of regular expressions.

config.quick_select_patterns = {
  -- match things that look like sha1 hashes
  -- (this is actually one of the default patterns)
  '[0-9a-f]{7,40}',
}

!!! note If you want to use capture groups in your patterns, you must use non-capturing groups (?:) for them to work as you intend, as the overall list of quick_select_patterns is compiled into a larger alternation regex that itself uses capture groups.

{{since('20230408-112425-69ae8472', outline=True)}} The regex syntax now supports backreferences and look around assertions. See Fancy Regex Syntax for the extended syntax, which builds atop the underlying Regex syntax. In prior versions, only the base Regex syntax was supported.

This example matches the string `"bar"`, but only when not part of the string
`"foo:bar"`:

```lua
config.quick_select_patterns = {
    "(?<!foo:)bar"
}
```

quit_when_all_windows_are_closed = true

{{since('20230320-124340-559cb7b0')}}

When set to true, wezterm will terminate when all windows are closed. This is the default behavior.

When set to false, wezterm will continue running.

quote_dropped_files = "SpacesOnly"

{{since('20220624-141144-bd1b7c5d')}}

Controls how file names are quoted (or not) when dragging and dropping. There are five possible values:

  • "None" - no quoting is performed, the file name is passed through as-is.
  • "SpacesOnly" - backslash-escape only spaces, leaving all other characters as-is. This is the default for non-Windows platforms.
  • "Posix" - use POSIX style shell word escaping.
  • "Windows" - use Windows style shell word escaping: double-quote filename with space characters in it, and leaving others as-is. This is the default on Windows.
  • "WindowsAlwaysQuoted" - like "Windows", while always double-quote the filename.

For example:

quote_dropped_filesfile namequoted result
"None"hello ($world)hello ($world)
"SpacesOnly"hello ($world)hello\ ($world)
"Posix"hello ($world)"hello (\$world)"
"Windows"hello ($world)"hello ($world)"
"WindowsAlwaysQuoted"hello ($world)"hello ($world)"

Drag and drop support for files is a platform dependent feature

PlatformSupported since
macOS20220624-141144-bd1b7c5d
Windows20220624-141144-bd1b7c5d
X11{{since('nightly', inline=True)}}
Wayland20220624-141144-bd1b7c5d

tags:

  • keys

scroll_to_bottom_on_input

When true (the default), the viewport will automatically scroll to the bottom of the scrollback when there is input to the terminal so that you can see what you are typing.


tags:

  • scroll_bar

scrollback_lines = 3500

How many lines of scrollback you want to retain.

Learn more about scrollback


tags:

  • mouse

selection_word_boundary

{{since('20210203-095643-70a364eb')}}

Configures the boundaries of a word, thus what is selected when doing a word selection with the mouse. (See mouse actions SelectTextAtMouseCursor & ExtendSelectionToMouseCursor with the mode argument set to Word)

Defaults to " \t\n{}[]()\"'`".

For example, to always include spaces and newline when selecting a word, but stop on punctuations:

config.selection_word_boundary = '{}[]()"\'`.,;:'

tags:

  • serial

serial_ports = {}

{{since('20230408-112425-69ae8472')}}

Define a list of serial port(s) that you use regularly. Each entry defines a SerialDomain with the following fields:

  • name - the name to use for the serial domain. Must be unique across all multiplexer domains in your configuration.
  • port - the name of the serial device. On Windows systems this can be a name like COM0. On Posix systems this will be a device path something like /dev/ttyUSB0. If omitted, the name field be interpreted as the port name.
  • baud - the communication speed to assign to the port. If omitted, the default baud rate will be 9600.

This configuration defines a single port:

config.serial_ports = {
  {
    name = '/dev/tty.usbserial-10',
    baud = 115200,
  },
}

You can then use the port in one of the following ways:

  • wezterm connect /dev/tty.usbserial-10 - this behaves similarly to wezterm serial /dev/tty.usbserial-10 --baud 115200.
  • Start wezterm normally, then use the Command Palette or Launcher Menu to spawn a new tab in the /dev/tty.usbserial-10 domain to connect to the serial device
  • You can reference the serial domain by its name /dev/tty.usbserial-10 in the various tab/window spawning key assignments that include a SpawnCommand

You can define multiple ports if you require, and use friendly name for them:

config.serial_ports = {
  {
    name = 'Sensor 1',
    port = '/dev/tty.usbserial-10',
    baud = 115200,
  },
  {
    name = 'Sensor 2',
    port = '/dev/tty.usbserial-11',
    baud = 115200,
  },
}

tags:

  • spawn

set_environment_variables

Specifies a map of environment variables that should be set when spawning new commands in the "local" domain. This configuration is consulted at the time that a program is launched. It is not possible to update the environment of a running program on any Operating System.

This is not used when working with remote domains.

See also: Launching Programs


tags:

  • appearance
  • tab_bar

show_close_tab_button_in_tabs = true

{{since('nightly')}}

When set to false, the close-tab button will not be drawn in tabs when the fancy tab bar is in use. Default is true.

config.show_close_tab_button_in_tabs = false

tags:

  • tab_bar

show_new_tab_button_in_tab_bar = true

{{since('20221119-145034-49b9839f')}}

When set to true (the default), the tab bar will display the new-tab button, which can be left-clicked to create a new tab, or right-clicked to display the Launcher Menu.

When set to false, the new-tab button will not be drawn into the tab bar.

This example turns off the tabs and new-tab button, leaving just the left and right status areas:

wezterm.on('update-right-status', function(window, pane)
  window:set_left_status 'left'
  window:set_right_status 'right'
end)

config.use_fancy_tab_bar = false
config.show_tabs_in_tab_bar = false
config.show_new_tab_button_in_tab_bar = false

tags:

  • tab_bar

show_tab_index_in_tab_bar = true

When set to true (the default), tab titles show their tab number (tab index) with a prefix such as 1:. When false, no numeric prefix is shown.

The tab_and_split_indices_are_zero_based setting controls whether numbering starts with 0 or 1.


tags:

  • tab_bar

show_tabs_in_tab_bar = true

{{since('20221119-145034-49b9839f')}}

When set to true (the default), the tab bar will display the tabs associated with the current window.

When set to false, the tabs will not be drawn into the tab bar.

This example turns off the tabs and new-tab button, leaving just the left and right status areas:

wezterm.on('update-right-status', function(window, pane)
  window:set_left_status 'left'
  window:set_right_status 'right'
end)

config.use_fancy_tab_bar = false
config.show_tabs_in_tab_bar = false
config.show_new_tab_button_in_tab_bar = false

tags:

  • updates

show_update_window

When Wezterm checks for an update and detects a new version, this option controls whether a window is shown with information about the new available version and links to download/install it.

See check_for_updates for more information on the automatic update checks.

config.show_update_window = false

{{since('nightly')}}

This option no longer has any effect and will be removed in a future release.


tags:

  • exit_behavior

skip_close_confirmation_for_processes_named

{{since('20210404-112810-b63a949d')}}

This configuration specifies a list of process names that are considered to be "stateless" and that are safe to close without prompting when closing windows, panes or tabs.

When closing a pane wezterm will try to determine the processes that were spawned by the program that was started in the pane. If all of those process names match one of the names in the skip_close_confirmation_for_processes_named list then it will not prompt for closing that particular pane.

The default value for this setting is shown below:

config.skip_close_confirmation_for_processes_named = {
  'bash',
  'sh',
  'zsh',
  'fish',
  'tmux',
  'nu',
  'cmd.exe',
  'pwsh.exe',
  'powershell.exe',
}

More advanced control over this behavior can be achieved by defining a mux-is-process-stateful event handler.


tags:

  • ssh

ssh_backend = "Libssh"

{{since('20211204-082213-a66c61ee9')}}

Sets which ssh backend should be used by default for the integrated ssh client.

Possible values are:

  • "Ssh2" - use libssh2
  • "LibSsh" - use libssh

Despite the naming, libssh2 is not a newer version of libssh, they are completely separate ssh implementations.

In prior releases, "Ssh2" was the only option. "LibSsh" is the default as it has broader support for newer keys and cryptography, and has clearer feedback about authentication events that require entering a passphrase.


tags:

  • ssh
  • multiplexing

ssh_domains

Configures SSH multiplexing domains. Read more about SSH Domains.

This option accepts a list of SshDomain objects.

{{since('20230408-112425-69ae8472')}}

If you don't set ssh_domains in your config, wezterm will default to configuring it as if you had:

config.ssh_domains = wezterm.default_ssh_domains()

See also wezterm.default_ssh_domains().


tags:

  • status

status_update_interval = 1000

{{since('20210314-114017-04b7cedd')}}

Specifies the number of milliseconds that need to elapse between triggering the update-status and update-right-status hook.


tags:

  • font

strikethrough_position

{{since('20221119-145034-49b9839f')}}

If specified, overrides the position of strikethrough lines.

The default is derived from the underline position metric specified by the designer of the primary font.

This config option accepts different units that have slightly different interpretations:

  • 2, 2.0 or "2px" all specify a position of 2 pixels
  • "2pt" specifies a position of 2 points, which scales according to the DPI of the window
  • "200%" takes the font-specified underline_position and multiplies it by 2
  • "0.5cell" takes the cell height, scales it by 0.5 and uses that as the position

tags:

  • mouse

swallow_mouse_click_on_pane_focus = false

{{since('20210502-130208-bff6815d')}}

When set to true, clicking on a pane will focus it.

When set to false (the default), clicking on a pane will focus it and then pass the click through to the application in the terminal.


tags:

  • mouse

swallow_mouse_click_on_window_focus

{{since('20220319-142410-0fcdea07')}}

When set to true, clicking on a wezterm window will focus it.

When set to false, clicking on a wezterm window will focus it and then pass through the click to the pane where the swallow_mouse_click_on_pane_focus option will further modify mouse event processing.

The default is true on macOS but false on other systems.


tags:

  • keys

swap_backspace_and_delete = false

When set to true, switch the interpretation of the Backspace and Delete keys such that Backspace generates Delete and vice versa.


tags:

  • tab_bar

switch_to_last_active_tab_when_closing_tab = false

{{since('20220905-102802-7d4b8249')}}

If set to true, when the active tab is closed, the previously activated tab will be activated.

Otherwise, the tab to the left of the active tab will be activated.


tags:

  • tab_bar

tab_and_split_indices_are_zero_based = false

If true, show_tab_index_in_tab_bar uses a zero-based index. The default is false and the tab shows a one-based index.


tags:

  • tab_bar

tab_bar_at_bottom = false

{{since('20210502-130208-bff6815d')}}

When tab_bar_at_bottom = true, the tab bar will be rendered at the bottom of the window rather than the top of the window.

The default is false.


tags:

  • tab_bar

tab_bar_style

{{since('20210814-124438-54e29167')}}

new_tab_left, new_tab_right, new_tab_hover_left, new_tab_hover_right have been removed and replaced by the more flexible new_tab and new_tab_hover elements.

{{since('20210502-154244-3f7122cb')}}

active_tab_left, active_tab_right, inactive_tab_left, inactive_tab_right, inactive_tab_hover_left, inactive_tab_hover_right have been removed and replaced by the more flexible format-tab-title event.

{{since('20210314-114017-04b7cedd')}}

This config option allows styling the elements that appear in the tab bar. This configuration supplements the tab bar color options.

Styling in this context refers to how the edges of the tabs and the new tab button are rendered. The default is simply a space character but you can use any sequence of formatted text produced by the wezterm.format function.

The defaults for each of these styles is simply a space. For each element, the foreground and background colors are set as per the tab bar colors you've configured.

The available elements are:

  • active_tab_left, active_tab_right - the left and right sides of the active tab
  • inactive_tab_left, inactive_tab_right - the left and right sides of inactive tabs
  • inactive_tab_hover_left, inactive_tab_hover_right - the left and right sides of inactive tabs in the hover state
  • new_tab_left, new_tab_right - the left and right sides of the new tab + button
  • new_tab_hover_left, new_tab_hover_right - the left and right sides of the new tab + button in the hover state.

This example changes the tab edges to the PowerLine arrow symbols:

Demonstrating setting the styling of the left and right tab edges

local wezterm = require 'wezterm'

local config = wezterm.config_builder()

-- The filled in variant of the < symbol
local SOLID_LEFT_ARROW = wezterm.nerdfonts.pl_right_hard_divider

-- The filled in variant of the > symbol
local SOLID_RIGHT_ARROW = wezterm.nerdfonts.pl_left_hard_divider

config.tab_bar_style = {
  active_tab_left = wezterm.format {
    { Background = { Color = '#0b0022' } },
    { Foreground = { Color = '#2b2042' } },
    { Text = SOLID_LEFT_ARROW },
  },
  active_tab_right = wezterm.format {
    { Background = { Color = '#0b0022' } },
    { Foreground = { Color = '#2b2042' } },
    { Text = SOLID_RIGHT_ARROW },
  },
  inactive_tab_left = wezterm.format {
    { Background = { Color = '#0b0022' } },
    { Foreground = { Color = '#1b1032' } },
    { Text = SOLID_LEFT_ARROW },
  },
  inactive_tab_right = wezterm.format {
    { Background = { Color = '#0b0022' } },
    { Foreground = { Color = '#1b1032' } },
    { Text = SOLID_RIGHT_ARROW },
  },
}

Retro Tab Bar with Integrated Window Management Buttons

{{since('20230408-112425-69ae8472')}}

When using window_decorations = "INTEGRATED_BUTTONS|RESIZE", you can control how the different buttons are drawn for the retro tab bar:

  • window_hide, window_hide_hover - the minimize/hide button
  • window_maximize, window_maximize_hover - the maximize button
  • window_close, window_close_hover - the close button

tags:

  • tab_bar

tab_max_width

Specifies the maximum width that a tab can have in the tab bar when using retro tab mode. It is ignored when using fancy tab mode.

Defaults to 16 glyphs in width.

config.tab_max_width = 16

term = "xterm-256color"

What to set the TERM environment variable to. The default is xterm-256color, which should provide a good level of feature support without requiring the installation of additional terminfo data.

If you want to get the most application support out of wezterm, then you may wish to install a copy of the wezterm TERM definition:

$ tempfile=$(mktemp) \
  && curl -o $tempfile https://raw.githubusercontent.com/wezterm/wezterm/main/termwiz/data/wezterm.terminfo \
  && tic -x -o ~/.terminfo $tempfile \
  && rm $tempfile

You can then set term = "wezterm" in your .wezterm.lua config file.

Doing this will inform some software of newer, more advanced features such as colored underlines, styled underlines (eg: undercurl). If the system you are using has a relatively outdated ncurses installation, the wezterm terminfo will also enable italics and true color support.

If you are using WSL, wezterm will automatically populate WSLENV to properly set TERM, COLORTERM, TERM_PROGRAM and TERM_PROGRAM_VERSION in the environment when crossing between win32 and WSL environments. See this Microsoft blog post for more information on how WSLENV works.

If your package manager installed the terminfo data in a non-standard location, which will likely be the case if your are using nixpkgs/home-manager/NixOS, then you need to set TERMINFO_DIRS in the environment in order for applications to find it. The following snippet works if you installed wezterm.terminfo with nix into your user profile. Update the path to TERMINFO_DIRS to match the location on your system.

config.set_environment_variables = {
  TERMINFO_DIRS = '/home/user/.nix-profile/share/terminfo',
  WSLENV = 'TERMINFO_DIRS',
}
config.term = 'wezterm'

tags:

  • appearance

text_blink_ease_in = "Linear"

{{since('20220319-142410-0fcdea07')}}

Specifies the easing function to use when computing the color for text that has the blinking attribute in the fading-in phase--when the text is fading from the background color to the foreground color.

See visual_bell for more information about easing functions.

See cursor_blink_rate to control the rate at which the cursor blinks.


tags:

  • appearance

text_blink_ease_out = "Linear"

{{since('20220319-142410-0fcdea07')}}

Specifies the easing function to use when computing the color for text that has the blinking attribute in the fading-out phase--when the text is fading from the foreground color to the background color.

See visual_bell for more information about easing functions.


tags:

  • appearance

text_blink_rapid_ease_in = "Linear"

{{since('20220319-142410-0fcdea07')}}

Specifies the easing function to use when computing the color for text that has the rapid blinking attribute in the fading-in phase--when the text is fading from the background color to the foreground color.

See visual_bell for more information about easing functions.


tags:

  • appearance

text_blink_rapid_ease_out = "Linear"

{{since('20220319-142410-0fcdea07')}}

Specifies the easing function to use when computing the color for text that has the rapid blinking attribute in the fading-out phase--when the text is fading from the foreground color to the background color.

See visual_bell for more information about easing functions.


tags:

  • appearance

text_blink_rate

{{since('20210814-124438-54e29167')}}

Specifies how often blinking text (normal speed) transitions between visible and invisible, expressed in milliseconds. Setting this to 0 disables slow text blinking. Note that this value is approximate due to the way that the system event loop schedulers manage timers; non-zero values will be at least the interval specified with some degree of slop.

config.text_blink_rate = 500

{{since('20220319-142410-0fcdea07')}}

Blinking is no longer a binary blink, but interpolates between invisible and visible text using an easing function. See text_blink_ease_in and text_blink_ease_out for more information.


tags:

  • appearance

text_blink_rate_rapid

{{since('20210814-124438-54e29167')}}

Specifies how often blinking text (rapid speed) transitions between visible and invisible, expressed in milliseconds. Setting this to 0 disables rapid text blinking. Note that this value is approximate due to the way that the system event loop schedulers manage timers; non-zero values will be at least the interval specified with some degree of slop.

config.text_blink_rate_rapid = 250

{{since('20220319-142410-0fcdea07')}}

Blinking is no longer a binary blink, but interpolates between invisible and visible text using an easing function. See text_blink_rapid_ease_in and text_blink_rapid_ease_out for more information.

tiling_desktop_environments = {}

{{since('20230712-072601-f4abf8fd')}}

Contains a list of Window Environments that are known to be tiling window managers. A tiling window manager is one that automatically resizes windows according to some layout policy, rather than respecting the window size set by an application.

The default value for this option is:

config.tiling_desktop_environments = {
  'X11 LG3D',
  'X11 bspwm',
  'X11 i3',
  'X11 dwm',
}

{{since('dev')}}

The following additional entries are now part of the default value of tiling_desktop_environments:

  • '"X11 awesome"'

The environment name can be found in the debug overlay which you can show via the ShowDebugOverlay key assignment. The default key binding for it is Ctrl + Shift + L.

Look for the line beginning with Window Environment:. The text after the colon is the name to add to tiling_desktop_environments.

If your window environment is a tiling environment and is not listed here, please file an issue (or even a PR!) to add it to the default list.

This contents of this list are used to determine a reasonable default for adjust_window_size_when_changing_font_size.


tags:

  • multiplexing

tls_clients

Configures TLS multiplexing domains. Read more about TLS Domains.

This option accepts a list of TlsDomainClient objects.


tags:

  • multiplexing

tls_servers

Configures TLS multiplexing domains. Read more about TLS Domains.

This option accepts a list of TlsDomainServer objects.


tags:

  • unicode

treat_east_asian_ambiguous_width_as_wide = false

{{since('20220624-141144-bd1b7c5d')}}

Unicode defines a number of codepoints as having Ambiguous Width. These are characters whose width resolves differently according to context that is typically absent from the monospaced world of the terminal.

WezTerm will by default treat ambiguous width as occupying a single cell.

When treat_east_asian_ambiguous_width_as_wide = true WezTerm will treat them as being two cells wide.

Note that changing this setting may have consequences for layout in text UI applications if their expectation of width differs from your choice of configuration.


tags:

  • keys

treat_left_ctrlalt_as_altgr = false

{{since('20210314-114017-04b7cedd')}}

If you are using a layout with an AltGr key, you may experience issues when running inside a VNC session, because VNC emulates the AltGr keypresses by sending plain Ctrl-Alt keys, which won't be understood as AltGr.

To fix this behavior you can tell WezTerm to treat left Ctrl-Alt keys as AltGr with the option treat_left_ctrlalt_as_altgr. Note that the key bindings using separate Ctrl and Alt won't be triggered anymore.

config.treat_left_ctrlalt_as_altgr = true

tags:

  • appearance

ui_key_cap_rendering

{{since('20240203-110809-5046fc22')}}

Controls how keyboard shortcuts are rendered in the Command Palette.

Possible values are:

  • "UnixLong" - Super, Meta, Ctrl, Shift.
  • "Emacs" - Super, M, C, S.
  • "AppleSymbols" - use macOS style symbols for Command, Option and so on.
  • "WindowsLong" - Win, Alt, Ctrl, Shift.
  • "WindowsSymbols" - like WindowsLong but using a logo for the Win key.

The default is a platform-appropriate value.


tags:

  • tuning

ulimit_nofile = 2048

{{since('20230408-112425-69ae8472')}}

On Unix systems, specifies the minimum desirable value for the RLIMIT_NOFILE soft limit.

That system parameter controls the maximum number of file descriptors that a given process is permitted to open.

On startup, wezterm will inspect the soft and hard limits, and if the soft limit is below the value of the ulimit_nofile option, wezterm will attempt to raise it to min(ulimit_nofile, hard_limit).


tags:

  • tuning

ulimit_nproc = 2048

{{since('20230408-112425-69ae8472')}}

On Unix systems, specifies the minimum desirable value for the RLIMIT_NPROC soft limit.

That system parameter controls the maximum number of simultaneous processes that a given user is permitted to spawn.

On startup, wezterm will inspect the soft and hard limits, and if the soft limit is below the value of the ulimit_nproc option, wezterm will attempt to raise it to min(ulimit_nproc, hard_limit).


tags:

  • font

underline_position

{{since('20221119-145034-49b9839f')}}

If specified, overrides the position of underlines.

The default is to use the underline position metric specified by the designer of the primary font.

This config option accepts different units that have slightly different interpretations:

  • 2, 2.0 or "2px" all specify a position of 2 pixels
  • "2pt" specifies a position of 2 points, which scales according to the DPI of the window
  • "200%" takes the font-specified underline_position and multiplies it by 2
  • "0.1cell" takes the cell height, scales it by 0.1 and uses that as the position

Note that the underline_position is often a small negative number like -2 or -4 and specifies an offset from the baseline of the font.


tags:

  • font

underline_thickness

{{since('20221119-145034-49b9839f')}}

If specified, overrides the base thickness of underlines. The underline thickness is also used for rendering split pane dividers and a number of other lines in custom glyphs.

The default is to use the underline thickness metric specified by the designer of the primary font.

This config option accepts different units that have slightly different interpretations:

  • 2, 2.0 or "2px" all specify a thickness of 2 pixels
  • "2pt" specifies a thickness of 2 points, which scales according to the DPI of the window
  • "200%" takes the font-specified underline_thickness and multiplies it by 2 to arrive at a thickness double the normal size
  • "0.1cell" takes the cell height, scales it by 0.1 and uses that as the thickness

tags:

  • unicode

unicode_version = 9

{{since('20211204-082213-a66c61ee9')}}

Specifies the version of unicode that will be used when interpreting the width/presentation of text.

This option exists because Unicode is an evolving specification that introduces new features and that occasionally adjusts how existing features should be handled.

For example, there were a number of unicode code points that had their width changed between Unicode version 8 and version 9. This wouldn't be an issue if all software was simultaneously aware of the change, but the reality is that there is a lot of older software out there, and that even if your local system is fully up to date, you might connect to a remote system vis SSH that is running applications that use a different version of unicode than your local system.

The impact of mismatching expectations of unicode width for a terminal emulator is that text columns may no longer line up as the application author expected, and/or that the cursor may appear to be in the wrong place when editing lines or text in shells or text editors.

The unicode_version option defaults to unicode version 9 as that is the most widely used version (from the perspective of width) at the time of writing, which means that the default experience has the lowest chance of mismatched expectations.

Unicode VersionImpact
8 (or lower)Some characters will be narrower than later versions
9-13Some characters will be wider than in Unicode 8
14 (or higher)Explicit Emoji or Text presentation selectors will be respected and make some characters wider or narrower than earlier versions, depending on the context

If you aggressively maintain all of your software to the latest possible versions then you may wish to set unicode_version = 14 to match the current (at the time of writing) version of Unicode. This will enable Emoji Presentation selectors to affect the presentation of certain emoji characters and alter their width in the terminal display.

If you'd like to use a higher default version but switch to a lower version when launching an older application, or when SSH'ing into a remote host, then you may be pleased to learn that wezterm also provides an escape sequence that allows the unicode version to be changed on the fly.

Unicode Version Escape sequence

This escape sequence is was originally defined by iTerm2. It supports setting the value as well as pushing and popping the value on a stack, which is helpful when temporarily adjusting the value.

OSC 1337 ; UnicodeVersion=N ST

The above sets the unicode version to N, where N is the integer version number.

OSC 1337 ; UnicodeVersion=push ST

Pushes the current version onto a stack.

OSC 1337 ; UnicodeVersion=pop ST

Pops the last-pushed version from the stack and sets the unicode version to that value. If there were no entries on the stack, the unicode version is left unchanged.

OSC 1337 ; UnicodeVersion=push LABEL ST

Pushes the current version onto a stack, labeling it with LABEL.

OSC 1337 ; UnicodeVersion=pop LABEL ST

Pops entries from the stack stopping after an entry labelled with LABEL is popped.

The labels are helpful when writing a wrapper alias, for example:

function run_with_unicode_version_9() {
  local label=$(uuidgen)
  printf "\e]1337;UnicodeVersion=push %s\e\\" $label
  printf "\e]1337;UnicodeVersion=9\e\\"
  eval $@
  local result=${PIPESTATUS[0]}
  printf "\e]1337;UnicodeVersion=pop %s\e\\" $label
  return $result
}

# Connect to a remote machine with an older version of unicode
run_with_unicode_version_9 ssh remote.machine

Will save the current version on the stack with a unique label, then set the version to 9 and spawn the requested command. When the command returns it will restore the saved version, even if the command itself set or pushed other values.


tags:

  • multiplexing

unix_domains

Defines a list of multiplexer domains for both the multiplexer server and multiplexer client.

Read more about multiplexing

unzoom_on_switch_pane = true

{{since('20211204-082213-a66c61ee9')}}

If set to false, the ActivatePaneDirection command will have no effect if the active pane is zoomed.

If true, the active pane will be unzoomed first and then switched.

See also: TogglePaneZoomState


tags:

  • font

use_cap_height_to_scale_fallback_fonts = false

{{since('20210502-130208-bff6815d')}}

When set to true, use the cap-height font metrics of the base and the current font to adjust the size of secondary fonts (such as bold or italic faces) to visually match the size of the base font.

The default is false.


tags:

  • tab_bar

use_fancy_tab_bar = true

{{since('20220101-133340-7edc5b5a')}}

When set to true (the default), the tab bar is rendered in a native style with proportional fonts.

When set to false, the tab bar is rendered using a retro aesthetic using the main terminal font.


tags:

  • keys

use_ime

Controls whether the Input Method Editor (IME) will be used to process keyboard input. The IME is useful for inputting kanji or other text that is not natively supported by the attached keyboard hardware.

IME support is a platform dependent feature

PlatformSupported sinceNotes
WindowsForeverAlways enabled, cannot be disabled
macOS20200113-214446-bb6251fdefaults to enabled starting in 20220319-142410-0fcdea07. Earlier versions had problems with key repeat when enabled
X1120211204-082213-a66c61ee9XIM based. Your system needs to have a running input method engine (such as ibus or fcitx) that support the XIM protocol in order for wezterm to use it.
Wayland20220807-113146-c2fee766Your compositor must support zwp_text_input_v3

You can control whether the IME is enabled in your configuration file:

config.use_ime = false

Changing use_ime usually requires re-launching WezTerm to take full effect.

{{since('20200620-160318-e00b076c')}}

The default for use_ime is false. The default in earlier releases was true.

{{since('20220101-133340-7edc5b5a')}}

The default for X11 systems is now true. Please ensure that the XMODIFIERS environment variable or the new xim_im_name configuration option is set appropriately before wezterm is launched! For example, Gnome users will probably want to set XMODIFIERS=@im=ibus.

{{since('20220319-142410-0fcdea07')}}

The default for all systems is now true

use_resize_increments = false

{{since('20211204-082213-a66c61ee9')}}

When set to true, prefer to snap the window size to a multiple of the terminal cell size. The default is false, which allows sizing the window to an arbitrary size.

This option is only respected on X11, Wayland and macOS systems.

Note that if you have configured window_padding then the resize increments don't take the padding into account.

{{since('20240127-113634-bbcac864')}}

Window padding is now accounted for.


tags:

  • appearance
  • bell

visual_bell

{{since('20211204-082213-a66c61ee9')}}

When the BEL ascii sequence is sent to a pane, the bell is "rung" in that pane.

You may choose to configure the visual_bell option so show a visible representation of the bell event, by having the background color of the pane briefly change color.

There are four fields to the visual_bell config option:

  • fade_in_duration_ms - how long it should take for the bell color to fade in, in milliseconds. The default is 0.
  • fade_out_duration_ms - how long it should take for the bell color to fade out, in milliseconds. The default is 0.
  • fade_in_function - an easing function, similar to CSS easing functions, that affects how the bell color is faded in.
  • fade_out_function - an easing function that affects how the bell color is faded out.
  • target - can be "BackgroundColor" (the default) to have the background color of the terminal change when the bell is rung, or "CursorColor" to have the cursor color change when the bell is rung.

If the total fade in and out durations are 0, then there will be no visual bell indication.

The bell color is itself specified in your color settings; if not specified, the text foreground color will be used.

The following easing functions are supported:

  • Linear - the fade happens at a constant rate.
  • Ease - The fade starts slowly, accelerates sharply, and then slows gradually towards the end. This is the default.
  • EaseIn - The fade starts slowly, and then progressively speeds up until the end, at which point it stops abruptly.
  • EaseInOut - The fade starts slowly, speeds up, and then slows down towards the end.
  • EaseOut - The fade starts abruptly, and then progressively slows down towards the end.
  • {CubicBezier={0.0, 0.0, 0.58, 1.0}} - an arbitrary cubic bezier with the specified parameters.
  • Constant - Evaluates as 0 regardless of time. Useful to implement a step transition at the end of the duration. {{since('20220408-101518-b908e2dd', inline=True)}}

The following configuration enables a low intensity visual bell that takes a total of 300ms to "flash" the screen:

config.visual_bell = {
  fade_in_function = 'EaseIn',
  fade_in_duration_ms = 150,
  fade_out_function = 'EaseOut',
  fade_out_duration_ms = 150,
}
config.colors = {
  visual_bell = '#202020',
}

The follow configuration make the cursor briefly flare when the bell is run:

config.visual_bell = {
  fade_in_duration_ms = 75,
  fade_out_duration_ms = 75,
  target = 'CursorColor',
}

See also audible_bell and bell event.


tags:

  • font

warn_about_missing_glyphs = true

{{since('20210502-130208-bff6815d')}}

When set to true, if a glyph cannot be found for a given codepoint, then the configuration error window will be shown with a pointer to the font configuration docs.

You can set warn_about_missing_glyphs = false to prevent the configuration error window from being displayed.

The default is warn_about_missing_glyphs = true.


tags:

  • gpu

webgpu_force_fallback_adapter = false

{{since('20221119-145034-49b9839f')}}

If set to true, forces the use of a fallback software (CPU based) rendering backend. The performance will not be as good as using a GPU.

This option is only applicable when you have configured front_end = "WebGpu".

You can have more fine grained control over which GPU is selected using webgpu_preferred_adapter.


tags:

  • gpu

webgpu_power_preference = "LowPower"

{{since('20221119-145034-49b9839f')}}

Specifies the power preference when selecting a webgpu GPU instance. This option is only applicable when you have configured front_end = "WebGpu".

The possible values are:

  • "LowPower" - use an integrated GPU
  • "HighPerformance" - use a discrete GPU

You can have more fine grained control over which GPU is selected using webgpu_preferred_adapter.


tags:

  • gpu

webgpu_preferred_adapter

{{since('20221119-145034-49b9839f')}}

Specifies which WebGpu adapter should be used.

This option is only applicable when you have configured front_end = "WebGpu".

You can use the wezterm.gui.enumerate_gpus() function to return a list of GPUs.

If you open the Debug Overlay (default: CTRL + SHIFT + L) you can interactively review the list:

> wezterm.gui.enumerate_gpus()
[
    {
        "backend": "Vulkan",
        "device": 29730,
        "device_type": "DiscreteGpu",
        "driver": "radv",
        "driver_info": "Mesa 22.3.4",
        "name": "AMD Radeon Pro W6400 (RADV NAVI24)",
        "vendor": 4098,
    },
    {
        "backend": "Vulkan",
        "device": 0,
        "device_type": "Cpu",
        "driver": "llvmpipe",
        "driver_info": "Mesa 22.3.4 (LLVM 15.0.7)",
        "name": "llvmpipe (LLVM 15.0.7, 256 bits)",
        "vendor": 65541,
    },
    {
        "backend": "Gl",
        "device": 0,
        "device_type": "Other",
        "name": "AMD Radeon Pro W6400 (navi24, LLVM 15.0.7, DRM 3.49, 6.1.9-200.fc37.x86_64)",
        "vendor": 4098,
    },
]

Based on that list, I might choose to explicitly target the discrete Gpu like this (but note that this would be the default selection anyway):

config.webgpu_preferred_adapter = {
  backend = 'Vulkan',
  device = 29730,
  device_type = 'DiscreteGpu',
  driver = 'radv',
  driver_info = 'Mesa 22.3.4',
  name = 'AMD Radeon Pro W6400 (RADV NAVI24)',
  vendor = 4098,
}
config.front_end = 'WebGpu'

alternatively, I might use:

local wezterm = require 'wezterm'
local config = {}
local gpus = wezterm.gui.enumerate_gpus()

config.webgpu_preferred_adapter = gpus[1]
config.front_end = 'WebGpu'
return config

If you have a more complex situation you can get a bit more elaborate; this example will only enable WebGpu if there is an integrated GPU available with Vulkan drivers:

local wezterm = require 'wezterm'
local config = {}

for _, gpu in ipairs(wezterm.gui.enumerate_gpus()) do
  if gpu.backend == 'Vulkan' and gpu.device_type == 'IntegratedGpu' then
    config.webgpu_preferred_adapter = gpu
    config.front_end = 'WebGpu'
    break
  end
end

return config

See also webgpu_power_preference, webgpu_force_fallback_adapter.


tags:

  • appearance

win32_acrylic_accent_color = COLOR

{{since('20230712-072601-f4abf8fd')}}

When combined with win32_system_backdrop = "Acrylic" on Windows systems earlier than build 22621, this option specifies the accent color used with the Acrylic composition effect.

See also win32_system_backdrop.


tags:

  • appearance

win32_system_backdrop = SETTING

{{since('20230712-072601-f4abf8fd')}}

When combined with window_background_opacity, chooses from available window background effects provided by Windows.

The possible values for win32_system_backdrop are:

  • "Auto" - the system chooses. In practice, this is the same as "Disable". This is the default value.
  • "Disable" - disable backdrop effects.
  • "Acrylic" - enable the Acrylic blur-behind-window effect. Available on Windows 10 and 11.
  • "Mica" - enable the Mica effect, available on Windows 11 build 22621 and later.
  • "Tabbed" - enable the Tabbed effect, available on Windows 11 build 22621 and later.

On Windows systems earlier than build 22621, the Acrylic affect can be adjusted using win32_acrylic_accent_color. More recent versions of Windows do not permit configuring the accent color for Acrylic, so that option has no effect there.

The Acrylic setting uses more resources than the others.

You need to reduce the window_background_opacity to a value lower than 1.0 for the backdrop effect to work. For best results with both "Mica" and "Tabbed", setting window_background_opacity = 0 is recommended.

See also macos_window_background_blur for a similar effect on macOS.

Acrylic

config.window_background_opacity = 0
config.win32_system_backdrop = 'Acrylic'

Acrylic Effect

Mica

config.window_background_opacity = 0
config.win32_system_backdrop = 'Mica'

Mica Effect

Tabbed

config.window_background_opacity = 0
config.win32_system_backdrop = 'Tabbed'

Tabbed Effect


tags:

  • appearance
  • background

window_background_gradient

{{since('20210814-124438-54e29167')}}

Dynamically generates a window_background_image from the provided gradient specification. When window_background_gradient is configured, the value for window_background_image is ignored.

Linear gradients with vertical or horizontal orientation are supported:

config.window_background_gradient = {
  -- Can be "Vertical" or "Horizontal".  Specifies the direction
  -- in which the color gradient varies.  The default is "Horizontal",
  -- with the gradient going from left-to-right.
  -- Linear and Radial gradients are also supported; see the other
  -- examples below
  orientation = 'Vertical',

  -- Specifies the set of colors that are interpolated in the gradient.
  -- Accepts CSS style color specs, from named colors, through rgb
  -- strings and more
  colors = {
    '#0f0c29',
    '#302b63',
    '#24243e',
  },

  -- Instead of specifying `colors`, you can use one of a number of
  -- predefined, preset gradients.
  -- A list of presets is shown in a section below.
  -- preset = "Warm",

  -- Specifies the interpolation style to be used.
  -- "Linear", "Basis" and "CatmullRom" as supported.
  -- The default is "Linear".
  interpolation = 'Linear',

  -- How the colors are blended in the gradient.
  -- "Rgb", "LinearRgb", "Hsv" and "Oklab" are supported.
  -- The default is "Rgb".
  blend = 'Rgb',

  -- To avoid vertical color banding for horizontal gradients, the
  -- gradient position is randomly shifted by up to the `noise` value
  -- for each pixel.
  -- Smaller values, or 0, will make bands more prominent.
  -- The default value is 64 which gives decent looking results
  -- on a retina macbook pro display.
  -- noise = 64,

  -- By default, the gradient smoothly transitions between the colors.
  -- You can adjust the sharpness by specifying the segment_size and
  -- segment_smoothness parameters.
  -- segment_size configures how many segments are present.
  -- segment_smoothness is how hard the edge is; 0.0 is a hard edge,
  -- 1.0 is a soft edge.

  -- segment_size = 11,
  -- segment_smoothness = 0.0,
}

Vertical Gradient

Gradients are implemented using the colorgrad crate. Take a look at https://github.com/mazznoer/colorgrad-rs#using-web-color-format for some usage examples and additional information about gradients.

Linear gradient:

{{since('20220624-141144-bd1b7c5d')}}

A linear gradient follows a linear path across the window. It can be rotated around the window center. The angle is described in degrees and moves counter clockwise in the positive direction.

So 0 degrees is equivalent to Horizontal with the gradient moving from left to right. 90 degrees is equivalent to Vertical with the gradient moving from bottom to top. 180 degrees is equivalent to Horizontal but with the gradient moving from right to left. 270 degrees is equivalent to Vertical but with the gradient going from top to bottom. Negative degrees are equivalent to going clockwise, so -45 is equivalent to 315 degrees and results in a gradient that is moving from the top left corner down to the bottom right corner.

config.window_background_gradient = {
  colors = { '#EEBD89', '#D13ABD' },
  -- Specifies a Linear gradient starting in the top left corner.
  orientation = { Linear = { angle = -45.0 } },
}

Linear Gradient

Radial gradient:

Radial gradients are implemented using a notional perfect circle that is subsequently stretched to fill the dimensions of the window.

config.color_scheme = 'Github'
config.window_background_gradient = {
  colors = { 'deeppink', 'gold' },
  orientation = {
    Radial = {
      -- Specifies the x coordinate of the center of the circle,
      -- in the range 0.0 through 1.0.  The default is 0.5 which
      -- is centered in the X dimension.
      cx = 0.75,

      -- Specifies the y coordinate of the center of the circle,
      -- in the range 0.0 through 1.0.  The default is 0.5 which
      -- is centered in the Y dimension.
      cy = 0.75,

      -- Specifies the radius of the notional circle.
      -- The default is 0.5, which combined with the default cx
      -- and cy values places the circle in the center of the
      -- window, with the edges touching the window edges.
      -- Values larger than 1 are possible.
      radius = 1.25,
    },
  },
}

Radial Gradient

Presets

The following presets are available:

PresetGradient
Blues
BrBg
BuGn
BuPu
Cividis
Cool
CubeHelixDefault
GnBu
Greens
Greys
Inferno
Magma
OrRd
Oranges
PiYg
Plasma
PrGn
PuBu
PuBuGn
PuOr
PuRd
Purples
Rainbow
RdBu
RdGy
RdPu
RdYlBu
RdYlGn
Reds
Sinebow
Spectral
Turbo
Viridis
Warm
YlGn
YlGnBu
YlOrBr
YlOrRd

tags:

  • exit_behavior

window_close_confirmation

Whether to display a confirmation prompt when the window is closed by the windowing environment, either because the user closed it with the window decorations, or instructed their window manager to close it.

Set this to "NeverPrompt" if you don't like confirming closing windows every time.

config.window_close_confirmation = 'AlwaysPrompt'

See also skip_close_confirmation_for_processes_named.

Note that this window_close_confirmation option doesn't apply to the default CTRL-SHIFT-W or CMD-w key assignments; if you want to change prompts for those, you will need to override the key shortcut as shown in the CloseCurrentTab documentation.


tags:

  • appearance

window_content_alignment

{{since('nightly')}}

Controls the alignment of the terminal cells inside the window.

When window size is not a multiple of terminal cell size, terminal cells will be slightly smaller than the window, and leave a small gap between the two. You can use this option to control where the additional gap will be.

The lua table has two fields and following possible values:

  • horizontal
    • "Left" (the default)
    • "Center"
    • "Right"
  • vertical
    • "Top" (the default)
    • "Center"
    • "Bottom"

For example, to center the terminal cells:

config.window_content_alignment = {
  horizontal = 'Center',
  vertical = 'Center',
}

tags:

  • appearance

window_decorations = "TITLE | RESIZE"

{{since('20210314-114017-04b7cedd')}}

Configures whether the window has a title bar and/or resizable border.

The value is a set of flags:

  • window_decorations = "NONE" - disables titlebar and border (borderless mode), but causes problems with resizing and minimizing the window, so you probably want to use RESIZE instead of NONE if you just want to remove the title bar.
  • window_decorations = "TITLE" - disable the resizable border and enable only the title bar
  • window_decorations = "RESIZE" - disable the title bar but enable the resizable border
  • window_decorations = "TITLE | RESIZE" - Enable titlebar and border. This is the default.

{{since('20230320-124340-559cb7b0', outline=true)}} The following flags are also supported on macOS:

* `MACOS_FORCE_DISABLE_SHADOW` - disable the window shadow effect
* `MACOS_FORCE_ENABLE_SHADOW` - enable the window shadow effect.

The window shadow effect is normally disabled by wezterm when the
[window_background_opacity](../../appearance.md#window-background-opacity) is set
to less than `1.0`.

{{since('20230408-112425-69ae8472', outline=true)}} * window_decorations = "INTEGRATED_BUTTONS|RESIZE" - place window management buttons (minimize, maximize, close) into the tab bar instead of showing a title bar.

  See also [integrated_title_button_style](integrated_title_button_style.md),
  [integrated_title_buttons](integrated_title_buttons.md),
  [integrated_title_button_alignment](integrated_title_button_alignment.md)
  [integrated_title_button_color](integrated_title_button_color.md) and,
  if you are using the retro tab bar, [tab_bar_style](tab_bar_style.md).

{{since('nightly', outline=true)}} The following flag is also supported:

* `MACOS_FORCE_SQUARE_CORNERS` - on macOS, force the window to have square
  rather than rounded corners. It is not compatible with `TITLE` or
  `INTEGRATED_BUTTONS`

On X11 and Wayland, the windowing system may override the window decorations.

When the titlebar is disabled you can drag the window using the tab bar if it is enabled, or by holding down SUPER and dragging the window (on Windows: CTRL-SHIFT and drag the window). You can map this dragging function for yourself via the StartWindowDrag key assignment. Note that if the pane is running an application that has enabled mouse reporting you will need to hold down the SHIFT modifier in order for StartWindowDrag to be recognized.

When the resizable border is disabled you will need to use features of your desktop environment to resize the window. Windows users may wish to consider AltSnap.

!!! warning Think twice before removing RESIZE from the set of decorations as it causes problems with resizing and minimizing the window. You usually want to keep RESIZE enabled.

!!! danger If you just want to remove the title bar, set window_decorations = "RESIZE" as you will run into problems if you remove RESIZE from the set of decorations.

!!! tip You probably always want RESIZE to be listed in your window_decorations.


tags:

  • appearance

window_frame

{{since('20210814-124438-54e29167')}}

This setting is applicable primarily on Wayland systems when client side decorations are in use.

It allows you to customize the colors of the window frame.

Some of these colors are used by the fancy tab bar.

config.window_frame = {
  inactive_titlebar_bg = '#353535',
  active_titlebar_bg = '#2b2042',
  inactive_titlebar_fg = '#cccccc',
  active_titlebar_fg = '#ffffff',
  inactive_titlebar_border_bottom = '#2b2042',
  active_titlebar_border_bottom = '#2b2042',
  button_fg = '#cccccc',
  button_bg = '#2b2042',
  button_hover_fg = '#ffffff',
  button_hover_bg = '#3b3052',
}

{{since('20220903-194523-3bb1ed61')}}

You may explicitly add a border around the window area:

config.window_frame = {
  border_left_width = '0.5cell',
  border_right_width = '0.5cell',
  border_bottom_height = '0.25cell',
  border_top_height = '0.25cell',
  border_left_color = 'purple',
  border_right_color = 'purple',
  border_bottom_color = 'purple',
  border_top_color = 'purple',
}

You may specify the font and font size for the tabbar:

config.window_frame = {
  font = require('wezterm').font 'Roboto',
  font_size = 12,
}

The default font is Roboto. The default font_size is 10pt on Windows and 12pt on other systems.


tags:

  • appearance

window_padding

Controls the amount of padding between the window border and the terminal cells.

Padding is measured in pixels.

If enable_scroll_bar is true, then the value you set for right will control the width of the scrollbar. If you have enabled the scrollbar and have set right to 0 then the right padding (and thus the scrollbar width) will instead match the width of a cell.

config.window_padding = {
  left = 2,
  right = 2,
  top = 0,
  bottom = 0,
}

{{since('20211204-082213-a66c61ee9')}}

You may now express padding using a number of different units by specifying a string value with a unit suffix:

  • "1px" - the px suffix indicates pixels, so this represents a 1 pixel value
  • "1pt" - the pt suffix indicates points. There are 72 points in 1 inch. The actual size this occupies on screen depends on the dpi of the display device.
  • "1cell" - the cell suffix indicates the size of the terminal cell, which in turn depends on the font size, font scaling and dpi. When used for width, the width of the cell is used. When used for height, the height of the cell is used.
  • "1%" - the % suffix indicates the size of the terminal portion of the display, which is computed based on the number of rows/columns and the size of the cell. While it is possible to specify percentage, there are some resize scenarios where the percentage value may not be 100% stable/deterministic, as the size of the padding is used to compute the number of rows/columns.

You may use a fractional number such as "0.5cell" or numbers larger than one such as "72pt".

The default padding is shown below. In earlier releases, the default padding was 0 for each of the possible edges.

config.window_padding = {
  left = '1cell',
  right = '1cell',
  top = '0.5cell',
  bottom = '0.5cell',
}

tags:

  • multiplexing
  • wsl

wsl_domains

{{since('20220319-142410-0fcdea07')}}

Configures WSL domains.

This option accepts a list of WslDomain objects.

The default is a list derived from parsing the output of wsl -l -v. See wezterm.default_wsl_domains() for more about that list, and on how to override it.


tags:

  • keys

xim_im_name

{{since('20220101-133340-7edc5b5a')}}

Explicitly set the name of the IME server to which wezterm will connect via the XIM protocol when using X11 and use_ime is true.

By default, this option is not set which means that wezterm will consider the value of the XMODIFIERS environment variable.

If for some reason the environment isn't set up correctly, or you want to quickly evaluate a different input method server, then you could update your config to specify it explicitly:

config.xim_im_name = 'fcitx'

will cause wezterm to connect to fcitx regardless of the value of XMODIFIERS.

wezterm module

The wezterm module is the primary module that exposes wezterm configuration and control to your config file.

You will typically place:

local wezterm = require 'wezterm'

at the top of your configuration file to enable it.

Available functions, constants


title: wezterm.GLOBAL tags:

  • utility

wezterm.GLOBAL

{{since('20220624-141144-bd1b7c5d')}}

Provides global, in-process, in-memory, data storage for json-like variables that persists across config reloads.

wezterm's lua files may be re-loaded and re-evaluated multiple times in different contexts or in different threads. If you'd like to keep track of state that lasts for the lifetime of your wezterm process then you cannot simply use global variables in the lua script.

wezterm.GLOBAL is a special userdata value that acts like a table. Writing to keys will copy the data that you assign into a global in-memory table and allow it to be read back later.

Reads and writes from/to wezterm.GLOBAL are thread-safe but don't currently provide synchronization primitives for managing read-modify-write operations.

The following example shows the number of times that the config has been loaded in the right status bar. Watch it increase when you press the ReloadConfiguration key assignment (CTRL-SHIFT-R):

local wezterm = require 'wezterm'

-- Count how many times the lua config has been loaded
wezterm.GLOBAL.parse_count = (wezterm.GLOBAL.parse_count or 0) + 1

wezterm.on('update-right-status', function(window, pane)
  window:set_right_status('Reloads=' .. tostring(wezterm.GLOBAL.parse_count))
end)

return {}

Note that the reload counter goes up by more than 1 when you reload: that is because the config is evaluated multiple times in different threads as part of safely validating and setting up the configuration.

You may store values with the following types:

  • string
  • number
  • table
  • boolean

Attempting to assign other types will raise an error.

Note about referencing table values

Accessing wezterm.GLOBAL returns a copy of the data that you'd read, making it cumbersome to perform read/modify/write updates; for example this:

wezterm.GLOBAL.tab_titles['T0'] = 'Test'

will not result in wezterm.GLOBAL.tab_titles.T0 being set, and you need to explicitly break it apart into:

local tab_titles = wezterm.GLOBAL.tab_titles
tab_titles['T0'] = 'Test'
wezterm.GLOBAL.tab_titles = tab_titles

{{since('20230320-124340-559cb7b0')}}

You no longer need to split apart read/modify/write and the simple assignment now works as you would expect:

wezterm.GLOBAL.tab_titles['T0'] = 'Test'

title: wezterm.action tags:

  • keys

wezterm.action

Helper for defining key assignment actions in your configuration file. This is really just sugar for the underlying Lua -> Rust deserialation mapping that makes it a bit easier to identify where syntax errors may exist in your configuration file.

Constructor Syntax

{{since('20220624-141144-bd1b7c5d')}}

wezterm.action is a special enum constructor type that makes it bit more ergonomic to express the various actions than in earlier releases. The older syntax is still supported, so you needn't scramble to update your configuration files.

Indexing wezterm.action with a valid KeyAssignment name will act as a constructor for that key assignment type. For example, the lua expression:

wezterm.action.QuickSelectArgs

is a constructor for QuickSelectArgs.

If the key assignment type is a unit variant (has no parameters) such as Copy, or can be constructed with default values such as QuickSelectArgs then you can reference the constructor directly to have it evaluate as that value without having to add any extra punctuation:

local wezterm = require 'wezterm'
return {
  keys = {
    {
      key = ' ',
      mods = 'CTRL|SHIFT',
      action = wezterm.action.QuickSelectArgs,
    },
  },
}

You may pass the optional parameters to QuickSelectArgs as you need them, like this:

local wezterm = require 'wezterm'
return {
  keys = {
    {
      key = ' ',
      mods = 'CTRL|SHIFT',
      action = wezterm.action.QuickSelectArgs {
        alphabet = 'abc',
      },
    },
  },
}

If the key assignment type is a tuple variant (has positional parameters) such as ActivatePaneByIndex, then you can pass those by calling the constructor:

local wezterm = require 'wezterm'
-- shortcut to save typing below
local act = wezterm.action

return {
  keys = {
    { key = 'F1', mods = 'ALT', action = act.ActivatePaneByIndex(0) },
    { key = 'F2', mods = 'ALT', action = act.ActivatePaneByIndex(1) },
    { key = 'F3', mods = 'ALT', action = act.ActivatePaneByIndex(2) },
    { key = 'F4', mods = 'ALT', action = act.ActivatePaneByIndex(3) },
    { key = 'F5', mods = 'ALT', action = act.ActivatePaneByIndex(4) },
    { key = 'F6', mods = 'ALT', action = act.ActivatePaneByIndex(5) },
    { key = 'F7', mods = 'ALT', action = act.ActivatePaneByIndex(6) },
    { key = 'F8', mods = 'ALT', action = act.ActivatePaneByIndex(7) },
    { key = 'F9', mods = 'ALT', action = act.ActivatePaneByIndex(8) },
    { key = 'F10', mods = 'ALT', action = act.ActivatePaneByIndex(9) },

    -- Compare this with the older syntax shown in the section below
    { key = '{', mods = 'CTRL', action = act.ActivateTabRelative(-1) },
    { key = '}', mods = 'CTRL', action = act.ActivateTabRelative(1) },
  },
}

Older versions

For versions before 20220624-141144-bd1b7c5d, usage looks like this:

local wezterm = require 'wezterm'
return {
  keys = {
    {
      key = '{',
      mods = 'CTRL',
      action = wezterm.action {
        ActivateTabRelative = -1,
      },
    },
    {
      key = '}',
      mods = 'CTRL',
      action = wezterm.action {
        ActivateTabRelative = 1,
      },
    },
  },
}

The parameter is a lua representation of the underlying KeyAssignment enum from the configuration code. These docs aim to spell out sufficient examples that you shouldn't need to learn to read Rust code, but there are occasions where newly developed features are not yet documented and an enterprising user may wish to go spelunking to figure them out!

You can find the reference for available KeyAssignment values here.


title: wezterm.action_callback tags:

  • keys
  • event

wezterm.action_callback(callback)

{{since('20211204-082213-a66c61ee9')}}

This function is a helper to register a custom event and return an action triggering it.

It is helpful to write custom key bindings directly, without having to declare the event and use it in a different place.

The implementation is essentially the same as:

function wezterm.action_callback(callback)
  local event_id = '...' -- the function generates a unique event id
  wezterm.on(event_id, callback)
  return wezterm.action.EmitEvent(event_id)
end

See wezterm.on and wezterm.action for more info on what you can do with these.

Usage

local wezterm = require 'wezterm'

return {
  keys = {
    {
      mods = 'CTRL|SHIFT',
      key = 'i',
      action = wezterm.action_callback(function(win, pane)
        wezterm.log_info 'Hello from callback!'
        wezterm.log_info(
          'WindowID:',
          win:window_id(),
          'PaneID:',
          pane:pane_id()
        )
      end),
    },
  },
}

title: wezterm.add_to_config_reload_watch_list tags:

  • reload

wezterm.add_to_config_reload_watch_list(path)

{{since('20210814-124438-54e29167')}}

Adds path to the list of files that are watched for config changes. If automatically_reload_config is enabled, then the config will be reloaded when any of the files that have been added to the watch list have changed.

{{since('20220807-113146-c2fee766')}}

This function is now called implicitly when you require a lua file.


title: wezterm.background_child_process tags:

  • utility
  • open
  • spawn

wezterm.background_child_process(args)

{{since('20211204-082213-a66c61ee9')}}

This function accepts an argument list; it will attempt to spawn that command in the background.

May generate an error if the command is not able to be spawned (eg: perhaps the executable doesn't exist), but not all operating systems/environments report all types of spawn failures immediately upon spawn.

This function doesn't return any value.

This example shows how you might set up a custom key assignment that opens the terminal background image in a separate image viewer process:

local wezterm = require 'wezterm'

return {
  window_background_image = '/home/wez/Downloads/sunset-american-fork-canyon.jpg',
  keys = {
    {
      mods = 'CTRL|SHIFT',
      key = 'm',
      action = wezterm.action_callback(function(win, pane)
        wezterm.background_child_process {
          'xdg-open',
          win:effective_config().window_background_image,
        }
      end),
    },
  },
}

See also run_child_process


title: wezterm.battery_info tags:

  • utility

wezterm.battery_info()

{{since('20210314-114017-04b7cedd')}}

This function returns battery information for each of the installed batteries on the system. This is useful for example to assemble status information for the status bar.

The return value is an array of objects with the following fields:

  • state_of_charge - the battery level expressed as a number between 0.0 (empty) and 1.0 (full)
  • vendor - battery manufacturer name, or "unknown" if not known.
  • model - the battery model string, or "unknown" if not known.
  • serial - the battery serial number, or "unknown" if not known.
  • time_to_full - if charging, how long until the battery is full (in seconds). May be nil.
  • time_to_empty - if discharing, how long until the battery is empty (in seconds). May be nil.
  • state - "Charging", "Discharging", "Empty", "Full", "Unknown"

This example shows the battery status for each battery, along with the date and time in the status bar:

local wezterm = require 'wezterm'

wezterm.on('update-right-status', function(window, pane)
  -- "Wed Mar 3 08:14"
  local date = wezterm.strftime '%a %b %-d %H:%M '

  local bat = ''
  for _, b in ipairs(wezterm.battery_info()) do
    bat = '🔋 ' .. string.format('%.0f%%', b.state_of_charge * 100)
  end

  window:set_right_status(wezterm.format {
    { Text = bat .. '   ' .. date },
  })
end)

title: wezterm.column_width tags:

  • utility
  • string

wezterm.column_width(string)

{{since('20210502-130208-bff6815d')}}

Given a string parameter, returns the number of columns that that text occupies in the terminal, which is useful together with format-tab-title and update-right-status to compute/layout tabs and status information.

This is different from string.len which returns the number of bytes that comprise the string.


title: wezterm.config_builder tags:

  • utility

wezterm.config_builder()

{{since('20230320-124340-559cb7b0')}}

Returns a config builder object that can be used to define your configuration:

local wezterm = require 'wezterm'

local config = wezterm.config_builder()

config.color_scheme = 'Batman'

return config

The config builder may look like a regular lua table but it is really a special userdata type that knows how to log warnings or generate errors if you attempt to define an invalid configuration option.

For example, with this erroneous config:

local wezterm = require 'wezterm'

-- Allow working with both the current release and the nightly
local config = {}
if wezterm.config_builder then
  config = wezterm.config_builder()
end

function helper(config)
  config.wrong = true
end

function another_layer(config)
  helper(config)
end

config.color_scheme = 'Batman'

another_layer(config)

return config

When evaluated by earlier versions of wezterm, this config will produce the following warning, which is terse and doesn't provide any context on where the mistake was made, requiring you to hunt around and find where wrong was referenced:

11:44:11.668  WARN   wezterm_dynamic::error > `wrong` is not a valid Config field.  There are too many alternatives to list here; consult the documentation!

When using the config builder, the warning message is improved:

11:45:23.774  WARN   wezterm_dynamic::error > `wrong` is not a valid Config field.  There are too many alternatives to list here; consult the documentation!
11:45:23.787  WARN   config::lua            > Attempted to set invalid config option `wrong` at:
    [1] /tmp/wat.lua:10 global helper
    [2] /tmp/wat.lua:14 global another_layer
    [3] /tmp/wat.lua:19

The config builder provides a method that allows you to promote the warning to a lua error:

config:set_strict_mode(true)

The consequence of an error is that wezterm will show a configuration error window and use the default config until you have resolved the error and reloaded the configuration. When not using strict mode, the warning will not prevent the rest of your configuration from being used.


title: wezterm.config_dir tags:

  • filesystem

wezterm.config_dir

This constant is set to the path to the directory in which your wezterm.lua configuration file was found.

local wezterm = require 'wezterm'
wezterm.log_error('Config Dir ' .. wezterm.config_dir)

title: wezterm.config_file tags:

  • filesystem

wezterm.config_file

{{since('20210502-130208-bff6815d')}}

This constant is set to the path to the wezterm.lua that is in use.

local wezterm = require 'wezterm'
wezterm.log_info('Config file ' .. wezterm.config_file)

title: wezterm.default_hyperlink_rules tags:

  • hyperlink

wezterm.default_hyperlink_rules()

{{since('20230320-124340-559cb7b0')}}

Returns the compiled-in default values for hyperlink_rules.


title: wezterm.default_ssh_domains tags:

  • ssh
  • multiplexing

wezterm.default_ssh_domains()

{{since('20230408-112425-69ae8472')}}

Computes a list of SshDomain objects based on the set of hosts discovered in your ~/.ssh/config.

Each host will have both a plain SSH and a multiplexing SSH domain generated and returned in the list of domains. The former don't require wezterm to be installed on the remote host, while the latter do require it.

The intended purpose of this function is to allow you the opportunity to edit/adjust the returned information before assigning it to your config.

For example, if all of the hosts referenced by your ssh config are unix machines, you might want to inform wezterm of that so that features like spawning a tab in the same directory as an existing tab work even for a plain SSH session:

config.ssh_domains = wezterm.default_ssh_domains()
for _, dom in ipairs(config.ssh_domains) do
  dom.assume_shell = 'Posix'
end

title: wezterm.default_wsl_domains tags:

  • wsl
  • multiplexing

wezterm.default_wsl_domains()

{{since('20220319-142410-0fcdea07')}}

Computes a list of WslDomain objects, each one representing an installed WSL distribution on your system.

This list is the same as the default value for the wsl_domains configuration option, which is to make a WslDomain with the distribution field set to the name of WSL distro and the name field set to name of the distro but with "WSL:" prefixed to it.

For example, if:

; wsl -l -v
  NAME            STATE           VERSION
* Ubuntu-18.04    Running         1

then this function will return:

{
  {
    name: "WSL:Ubuntu-18.04",
    distribution: "Ubuntu-18.04",
  },
}

The purpose of this function is to aid in situations where you might want set default_prog for the WSL distributions:

local wezterm = require 'wezterm'

local wsl_domains = wezterm.default_wsl_domains()

for idx, dom in ipairs(wsl_domains) do
  if dom.name == 'WSL:Ubuntu-18.04' then
    dom.default_prog = { 'fish' }
  end
end

return {
  wsl_domains = wsl_domains,
}

However, wez strongly recommends that you use chsh inside the WSL domain to make that the default shell if possible, so that you can avoid this additional configuration!

{{since('20230320-124340-559cb7b0')}}

The default_cwd field is now automatically set to "~" to make it more convenient to launch a WSL instance in the home directory of the configured distribution.


title: wezterm.emit tags:

  • event

wezterm.emit(event_name, args...)

{{since('20201031-154415-9614e117')}}

wezterm.emit resolves the registered callback(s) for the specified event name and calls each of them in turn, passing the additional arguments through to the callback.

If a callback returns false then it prevents later callbacks from being called for this particular call to wezterm.emit, and wezterm.emit will return false to indicate that no additional/default processing should take place.

If none of the callbacks returned false then wezterm.emit will itself return true to indicate that default processing should take place.

This function has no special knowledge of which events are defined by wezterm, or what their required arguments might be.

See wezterm.on for more information about event handling.


title: wezterm.enumerate_ssh_hosts tags:

  • ssh

wezterm.enumerate_ssh_hosts([ssh_config_file_name, ...])

{{since('20220319-142410-0fcdea07')}}

This function will parse your ssh configuration file(s) and extract from them the set of literal (non-pattern, non-negated) host names that are specified in Host and Match stanzas contained in those configuration files and return a mapping from the hostname to the effective ssh config options for that host.

You may optionally pass a list of ssh configuration files that should be read, in case you have a special configuration.

The files you specify (if any) will be parsed first, and then the default locations for your system will be parsed.

All files read by a call to this function, and any include statements processed from those ssh config files, will be added to the config reload watch list as though wezterm.add_to_config_reload_watch_list() was called on them. Note that only concrete path names are watched: if your config uses include to include glob patterns in a directory then, for example, newly created files in that directory will not cause a config reload event in wezterm.

This example shows how to use this function to automatically configure ssh multiplexing domains for the hosts configured in your ~/.ssh/config file:

local wezterm = require 'wezterm'

local ssh_domains = {}

for host, config in pairs(wezterm.enumerate_ssh_hosts()) do
  table.insert(ssh_domains, {
    -- the name can be anything you want; we're just using the hostname
    name = host,
    -- remote_address must be set to `host` for the ssh config to apply to it
    remote_address = host,

    -- if you don't have wezterm's mux server installed on the remote
    -- host, you may wish to set multiplexing = "None" to use a direct
    -- ssh connection that supports multiple panes/tabs which will close
    -- when the connection is dropped.

    -- multiplexing = "None",

    -- if you know that the remote host has a posix/unix environment,
    -- setting assume_shell = "Posix" will result in new panes respecting
    -- the remote current directory when multiplexing = "None".
    assume_shell = 'Posix',
  })
end

return {
  ssh_domains = ssh_domains,
}

This shows the structure of the returned data, by evaluating the function in the debug overlay (CTRL-SHIFT-L):

> wezterm.enumerate_ssh_hosts()
{
    "aur.archlinux.org": {
        "hostname": "aur.archlinux.org",
        "identityagent": "/run/user/1000/keyring/ssh",
        "identityfile": "/home/wez/.ssh/aur",
        "port": "22",
        "user": "aur",
        "userknownhostsfile": "/home/wez/.ssh/known_hosts /home/wez/.ssh/known_hosts2",
    },
    "woot": {
        "hostname": "localhost",
        "identityagent": "/run/user/1000/keyring/ssh",
        "identityfile": "/home/wez/.ssh/id_dsa /home/wez/.ssh/id_ecdsa /home/wez/.ssh/id_ed25519 /home/wez/.ssh/id_rsa",
        "port": "22",
        "user": "someone",
        "userknownhostsfile": "/home/wez/.ssh/known_hosts /home/wez/.ssh/known_hosts2",
    },
}

the corresponding ~/.ssh/config file for the above is shown below: note host the Host group with a wildcard is not returned by the function because it doesn't have a concrete host name:

Host aur.archlinux.org
  IdentityFile ~/.ssh/aur
  User aur

Host 192.168.1.*
  ForwardAgent yes
  ForwardX11 yes

Host woot
  User someone
  Hostname localhost

title: wezterm.executable_dir tags:

  • filesystem
  • utility

wezterm.executable_dir

This constant is set to the directory containing the wezterm executable file.

local wezterm = require 'wezterm'
wezterm.log_error('Exe dir ' .. wezterm.executable_dir)

search: boost: 10 keywords: font tags:

  • font title: wezterm.font

wezterm.font(family [, attributes])

This function constructs a lua table that corresponds to the internal FontAttributes struct that is used to select a single named font:

local wezterm = require 'wezterm'

return {
  font = wezterm.font 'JetBrains Mono',
}

The first parameter is the name of the font; the name can be one of the following types of names:

  • The font family name, eg: "JetBrains Mono". The family name doesn't include any style information (such as weight, stretch or italic), which can be specified via the attributes parameter. This is the recommended name to use for the font, as it the most compatible way to resolve an installed font.
  • The computed full name, which is the family name with the sub-family (which incorporates style information) appended, eg: "JetBrains Mono Regular".
  • (Since 20210502-154244-3f7122cb) The postscript name, which is an ostensibly unique name identifying a given font and style that is encoded into the font by the font designer.

When specifying a font using its family name, the second attributes parameter is an optional table that can be used to specify style attributes; the following keys are allowed:

  • weight - specifies the weight of the font. The default value is "Regular", and possible values are:

    • "Thin"
    • "ExtraLight"
    • "Light"
    • "DemiLight"
    • "Book"
    • "Regular" (this is the default)
    • "Medium"
    • "DemiBold"
    • "Bold"
    • "ExtraBold"
    • "Black"
    • "ExtraBlack".

    weight has been supported since version 20210502-130208-bff6815d, In earlier versions you could use bold=true to get a bold font variant.

  • stretch - specifies the font stretch to select. The default value is "Normal", and possible values are:

    • "UltraCondensed"
    • "ExtraCondensed"
    • "Condensed"
    • "SemiCondensed"
    • "Normal" (this is the default)
    • "SemiExpanded"
    • "Expanded"
    • "ExtraExpanded"
    • "UltraExpanded".

    stretch has been supported since version 20210502-130208-bff6815d.

  • style - specifies the font style to select. The default is "Normal", and possible values are:

    • "Normal" (this is the default)
    • "Italic"
    • "Oblique"

    "Oblique" and "Italic" fonts are similar in the sense that the glyphs are presented at an angle. "Italic" fonts usually have a distinctive design difference from the "Normal" style in a given font family, whereas "Oblique" usually looks very similar to "Normal", but skewed at an angle.

    style has been supported since version 20220319-142410-0fcdea07. In earlier versions you could use italic=true to get an italic font variant.

When attributes are specified, the font must match both the family name and attributes in order to be selected.

With the exception of being able to synthesize basic bold and italics (really, oblique) for non-bitmap fonts, wezterm can only select and use fonts that you have installed on your system. The attributes that you specify are used to match a font from those that are available, so if you'd like to use a condensed font, for example, then you must install the condensed variant of that family.

local wezterm = require 'wezterm'

return {
  font = wezterm.font('JetBrains Mono', { weight = 'Bold' }),
}

When resolving fonts from font_dirs, wezterm follows CSS Fonts Level 3 compatible font matching, which tries to exactly match the specified attributes, but allows for locating a close match within the specified font family.

local wezterm = require 'wezterm'

return {
  font = wezterm.font(
    'Iosevka Term',
    { stretch = 'Expanded', weight = 'Regular' }
  ),
}

An alternative form of specifying the font can be used, where the family and the attributes are combined in the same lua table. This form is most useful when used together with wezterm.font_with_fallback when you want to specify precise weights for the different fallback fonts:

local wezterm = require 'wezterm'

return {
  font = wezterm.font {
    family = 'Iosevka Term',
    stretch = 'Expanded',
    weight = 'Regular',
  },
}

{{since('20220101-133340-7edc5b5a')}}

You can use the expanded form mentioned above to override freetype and harfbuzz settings just for the specified font; this examples shows how to disable the default ligature feature just for this particular font:

local wezterm = require 'wezterm'
return {
  font = wezterm.font {
    family = 'JetBrains Mono',
    harfbuzz_features = { 'calt=0', 'clig=0', 'liga=0' },
  },
}

The following options can be specified in the same way:


title: wezterm.font_with_fallback tags:

  • font

wezterm.font_with_fallback(families [, attributes])

This function constructs a lua table that configures a font with fallback processing. Glyphs are looked up in the first font in the list but if missing the next font is checked and so on.

The first parameter is a table listing the fonts in their preferred order:

local wezterm = require 'wezterm'

return {
  font = wezterm.font_with_fallback { 'JetBrains Mono', 'Noto Color Emoji' },
}

WezTerm implicitly adds its default fallback to the list that you specify.

The attributes parameter behaves the same as that of wezterm.font in that it allows you to specify font weight and style attributes that you want to match.

{{since('20210502-130208-bff6815d')}}

The attributes can now be specified per fallback font using this alternative form where the family and attributes are specified as part of the same lua table:

local wezterm = require 'wezterm'

return {
  font = wezterm.font_with_fallback {
    { family = 'JetBrains Mono', weight = 'Medium' },
    { family = 'Terminus', weight = 'Bold' },
    'Noto Color Emoji',
  },
}

{{since('20220101-133340-7edc5b5a')}}

You can use the expanded form mentioned above to override freetype and harfbuzz settings just for the specified font; this examples shows how to disable the default ligature feature just for JetBrains Mono, but leave it on for the other fonts in the fallback:

local wezterm = require 'wezterm'

return {
  font = wezterm.font_with_fallback {
    {
      family = 'JetBrains Mono',
      harfbuzz_features = { 'calt=0', 'clig=0', 'liga=0' },
    },
    { family = 'Terminus', weight = 'Bold' },
    'Noto Color Emoji',
  },
}

The following options can be specified in the same way:

Dealing with different fallback font heights

When mixing different font families there is a chance that glyphs from one font don't appear to be the same height as the glyphs from your primary font.

For "Roman" fonts there exists a font metric known as cap-height which indicates the nominal size of a capital (uppercase) letter that can be used to compute a scaling factor that can be used to make the fallback font appear to have the same size.

Setting use_cap_height_to_scale_fallback_fonts = true will cause wezterm to try to automatically scale using the cap-height metric (or to compute its own idea of the cap-height based on the size of glyph(s)).

Manual fallback scaling

{{since('20220408-101518-b908e2dd')}}

CJK fonts typically won't have a useful cap-height metric so it may be desirable to manually configure the fallback scaling factor to boost the size of the CJK font so that the glyphs are more readable.

The example below shows how to boost the effective size of the "Microsoft YaHei" fallback font to 1.5 times the normal size. The boost cannot influence font metrics so it may be desirable to also specify line_height to produce a more pleasing display.

local wezterm = require 'wezterm'

return {
  line_height = 1.2,
  font = wezterm.font_with_fallback {
    'JetBrains Mono',
    { family = 'Microsoft YaHei', scale = 1.5 },
  },
}

title: wezterm.format tags:

  • utility
  • string

wezterm.format({})

{{since('20210314-114017-04b7cedd')}}

wezterm.format can be used to produce a formatted string with terminal graphic attributes such as bold, italic and colors. The resultant string is rendered into a string with wezterm compatible escape sequences embedded.

wezterm.format accepts a single array argument, where each element is a FormatItem.

This example logs the text Hello, then the date/time, underlined, in purple text on a blue background to the stderr of the wezterm process:

local wezterm = require 'wezterm'

local success, date, stderr = wezterm.run_child_process { 'date' }

wezterm.log_info(wezterm.format {
  { Attribute = { Underline = 'Single' } },
  { Foreground = { AnsiColor = 'Fuchsia' } },
  { Background = { Color = 'blue' } },
  { Text = 'Hello ' .. date .. ' ' },
  'ResetAttributes',
  { Text = 'this text has default attributes' },
})

Possible values for the FormatItem elements are:

  • {Text="Hello"} - the text Hello. The string can be any string expression, including escape sequences that are not supported directly by wezterm.format.
  • {Attribute={Underline="None"}} - disable underline
  • {Attribute={Underline="Single"}} - enable single underline
  • {Attribute={Underline="Double"}} - enable double underline
  • {Attribute={Underline="Curly"}} - enable curly underline
  • {Attribute={Underline="Dotted"}} - enable dotted underline
  • {Attribute={Underline="Dashed"}} - enable dashed underline
  • {Attribute={Intensity="Normal"}} - set normal intensity
  • {Attribute={Intensity="Bold"}} - set bold intensity
  • {Attribute={Intensity="Half"}} - set half intensity
  • {Attribute={Italic=true}} - enable italics
  • {Attribute={Italic=false}} - disable italics
  • {Foreground={AnsiColor="Black"}} - set foreground color to one of the ansi color palette values (index 0-15) using one of the names Black, Maroon, Green, Olive, Navy, Purple, Teal, Silver, Grey, Red, Lime, Yellow, Blue, Fuchsia, Aqua or White.
  • {Foreground={Color="yellow"}} - set foreground color to a named color or rgb value like #ffffff.
  • {Background={AnsiColor="Black"}} - set the background color to an ansi color as per Foreground above.
  • {Background={Color="blue"}} - set the background color to a named color or rgb value as per Foreground above.
  • "ResetAttributes" - reset all attributes to default. {{since('20220807-113146-c2fee766', inline=True)}}

This example shows how to use arbitrary escape sequences to change the underline color:

local wezterm = require 'wezterm'
wezterm.log_info(wezterm.format {
  -- turn on underlines
  { Attribute = { Underline = 'Single' } },
  -- make the underline red
  { Text = '\x1b[58:2::255:0:0m' },
  -- and say hello
  { Text = 'hello' },
})

title: wezterm.get_builtin_color_schemes tags:

  • color
  • scheme
  • theme

wezterm.get_builtin_color_schemes()

{{since('20220101-133340-7edc5b5a')}}

Returns a lua table keyed by color scheme name and whose values are the color scheme definition of the builtin color schemes.

This is useful for programmatically deciding things about the scheme to use based on its color, or for taking a scheme and overriding a couple of entries just from your wezterm.lua configuration file.

This example shows how to make wezterm pick a random color scheme for each newly created window:

local wezterm = require 'wezterm'

-- The set of schemes that we like and want to put in our rotation
local schemes = {}
for name, scheme in pairs(wezterm.get_builtin_color_schemes()) do
  table.insert(schemes, name)
end

wezterm.on('window-config-reloaded', function(window, pane)
  -- If there are no overrides, this is our first time seeing
  -- this window, so we can pick a random scheme.
  if not window:get_config_overrides() then
    -- Pick a random scheme name
    local scheme = schemes[math.random(#schemes)]
    window:set_config_overrides {
      color_scheme = scheme,
    }
  end
end)

return {}

This example shows how to take an existing scheme, modify a color, and then use that new scheme to override the default:

local wezterm = require 'wezterm'

local scheme = wezterm.get_builtin_color_schemes()['Gruvbox Light']
scheme.background = 'red'

return {
  color_schemes = {
    -- Override the builtin Gruvbox Light scheme with our modification.
    ['Gruvbox Light'] = scheme,

    -- We can also give it a different name if we don't want to override
    -- the default
    ['Gruvbox Red'] = scheme,
  },
  color_scheme = 'Gruvbox Light',
}

This example shows how to analyze the colors in the builtin schemes and use that to select just the dark schemes and then randomly pick one of those for each new window:

local wezterm = require 'wezterm'

local function dark_schemes()
  local schemes = wezterm.get_builtin_color_schemes()
  local dark = {}
  for name, scheme in pairs(schemes) do
    -- parse into a color object
    local bg = wezterm.color.parse(scheme.background)
    -- and extract HSLA information
    local h, s, l, a = bg:hsla()

    -- `l` is the "lightness" of the color where 0 is darkest
    -- and 1 is lightest.
    if l < 0.4 then
      table.insert(dark, name)
    end
  end

  table.sort(dark)
  return dark
end

local dark = dark_schemes()

wezterm.on('window-config-reloaded', function(window, pane)
  -- If there are no overrides, this is our first time seeing
  -- this window, so we can pick a random scheme.
  if not window:get_config_overrides() then
    -- Pick a random scheme name

    local scheme = dark[math.random(#dark)]
    window:set_config_overrides {
      color_scheme = scheme,
    }
  end
end)

return {}

{{since('20220807-113146-c2fee766')}}

This function moved to wezterm.color.get_builtin_schemes() but can still be called as wezterm.get_builtin_color_schemes(). See that page for more examples.


title: wezterm.glob tags:

  • utility
  • filesystem

wezterm.glob(pattern [, relative_to])

{{since('20200503-171512-b13ef15f')}}

This function evaluates the glob pattern and returns an array containing the absolute file names of the matching results. Due to limitations in the lua bindings, all of the paths must be able to be represented as UTF-8 or this function will generate an error.

The optional relative_to parameter can be used to make the results relative to a path. If the results have the same prefix as relative_to then it will be removed from the returned path.

local wezterm = require 'wezterm'

-- logs the names of all of the conf files under `/etc`
for _, v in ipairs(wezterm.glob '/etc/*.conf') do
  wezterm.log_error('entry: ' .. v)
end

title: wezterm.gradient_colors tags:

  • color

wezterm.gradient_colors(gradient, num_colors)

{{since('20210814-124438-54e29167')}}

Given a gradient spec and a number of colors, returns a table holding that many colors spaced evenly across the range of the gradient.

This is useful for example to generate colors for tabs, or to do something fancy like interpolate colors across a gradient based on the time of the day.

gradient is any gradient allowed by the window_background_gradient option.

This example is what you'd see if you opened up the debug overlay to try this out in the repl:

> wezterm.gradient_colors({preset="Rainbow"}, 4)
["#6e40aa", "#ff8c38", "#5dea8d", "#6e40aa"]

{{since('20220807-113146-c2fee766')}}

This function has moved to wezterm.color.gradient and that name should be used instead of this name.

In addition, the returned colors are now Color objects.


title: wezterm.has_action tags:

  • utility
  • version

wezterm.has_action(NAME)

{{since('20230408-112425-69ae8472')}}

Returns true if the string NAME is a valid key assignment action variant that can be used with wezterm.action.

This is useful when you want to use a wezterm configuration across multiple different versions of wezterm.

if wezterm.has_action 'PromptInputLine' then
  table.insert(config.keys, {
    key = 'p',
    mods = 'LEADER',
    action = wezterm.action.PromptInputLine {
      -- other parameters here
    },
  })
end

title: wezterm.home_dir tags:

  • utility
  • filesystem

wezterm.home_dir

This constant is set to the home directory of the user running wezterm.

local wezterm = require 'wezterm'
wezterm.log_error('Home ' .. wezterm.home_dir)

title: wezterm.hostname tags:

  • utility

wezterm.hostname()

This function returns the current hostname of the system that is running wezterm. This can be useful to adjust configuration based on the host.

Note that environments that use DHCP and have many clients and short leases may make it harder to rely on the hostname for this purpose.

local wezterm = require 'wezterm'
local hostname = wezterm.hostname()

local font_size
if hostname == 'pixelbookgo-localdomain' then
  -- Use a bigger font on the smaller screen of my PixelBook Go
  font_size = 12.0
else
  font_size = 10.0
end

return {
  font_size = font_size,
}

title: wezterm.json_encode tags:

  • utility
  • json

wezterm.json_encode(value)

{{since('20220807-113146-c2fee766')}}

Encodes the supplied lua value as json:

> wezterm.json_encode({foo = "bar"})
"{\"foo\":\"bar\"}"

title: wezterm.json_parse tags:

  • utility
  • json

wezterm.json_parse(string)

{{since('20220807-113146-c2fee766')}}

Parses the supplied string as json and returns the equivalent lua values:

> wezterm.json_parse('{"foo":"bar"}')
{
    "foo": "bar",
}

title: wezterm.log_error tags:

  • utility
  • log
  • debug

wezterm.log_error(arg, ..)

This function logs the provided message string through wezterm's logging layer at 'ERROR' level, which can be displayed via ShowDebugOverlay action. If you started wezterm from a terminal that text will print to the stdout of that terminal. If running as a daemon for the multiplexer server then it will be logged to the daemon output path.

local wezterm = require 'wezterm'
wezterm.log_error 'Hello!'

{{since('20210814-124438-54e29167')}}

Now accepts multiple arguments, and those arguments can be of any type.

See also log_info and log_warn.


title: wezterm.log_info tags:

  • utility
  • log
  • debug

wezterm.log_info(arg, ..)

{{since('20210314-114017-04b7cedd')}}

This function logs the provided message string through wezterm's logging layer at 'INFO' level, which can be displayed via ShowDebugOverlay action. If you started wezterm from a terminal that text will print to the stdout of that terminal. If running as a daemon for the multiplexer server then it will be logged to the daemon output path.

local wezterm = require 'wezterm'
wezterm.log_info 'Hello!'

{{since('20210814-124438-54e29167')}}

Now accepts multiple arguments, and those arguments can be of any type.

See also log_error and log_warn.


title: wezterm.log_warn tags:

  • utility
  • log
  • debug

wezterm.log_warn(arg, ..)

{{since('20210314-114017-04b7cedd')}}

This function logs the provided message string through wezterm's logging layer at 'WARN' level, which can be displayed via ShowDebugOverlay action. If you started wezterm from a terminal that text will print to the stdout of that terminal. If running as a daemon for the multiplexer server then it will be logged to the daemon output path.

local wezterm = require 'wezterm'
wezterm.log_warn 'Hello!'

{{since('20210814-124438-54e29167')}}

Now accepts multiple arguments, and those arguments can be of any type.

See also log_info and log_error.


title: wezterm.nerdfonts tags:

  • utility
  • font
  • string

wezterm.nerdfonts

{{since('20220319-142410-0fcdea07')}}

A special userdata value that can be used to resolve the symbolic name of a glyph from the Nerd Fonts font set into a string that can be used for example when formatting status lines and titles in your wezterm configuration.

WezTerm includes Nerd Font Symbols Font as a default font fallback which means that these special symbols are available even without requiring you to use a patched font.

This example shows how to lookup wezterm.nerdfonts.fa_clock_o, the Font Awesome glyph representing a clock, and use that together with the current date/time in the status area:

local wezterm = require 'wezterm'

wezterm.on('update-right-status', function(window, pane)
  -- "Wed Mar 3 08:14"
  local date = wezterm.strftime '%a %b %-d %H:%M '

  window:set_right_status(wezterm.format {
    { Text = wezterm.nerdfonts.fa_clock_o .. ' ' .. date },
  })
end)

{{since('20230712-072601-f4abf8fd')}}

The bundled Nerd Font Symbols Font was updated to version 3.0 which, unfortunately, makes breaking changes to a number of symbol assignments, and renames all of the Material Design Icons so that they no longer have an mdi_ prefix and instead have an md_ prefix.

The following symbols are defined:

cod_account
cod_activate_breakpoints
cod_add
cod_archive
cod_arrow_both
cod_arrow_circle_down
cod_arrow_circle_left
cod_arrow_circle_right
cod_arrow_circle_up
cod_arrow_down
cod_arrow_left
cod_arrow_right
cod_arrow_small_down
cod_arrow_small_left
cod_arrow_small_right
cod_arrow_small_up
cod_arrow_swap
cod_arrow_up
cod_azure
cod_azure_devops
cod_beaker
cod_beaker_stop
cod_bell
cod_bell_dot
cod_bell_slash
cod_bell_slash_dot
cod_blank
cod_bold
cod_book
cod_bookmark
cod_bracket_dot
cod_bracket_error
cod_briefcase
cod_broadcast
cod_browser
cod_bug
cod_calendar
cod_call_incoming
cod_call_outgoing
cod_case_sensitive
cod_check
cod_check_all
cod_checklist
cod_chevron_down
cod_chevron_left
cod_chevron_right
cod_chevron_up
cod_chip
cod_chrome_close
cod_chrome_maximize
cod_chrome_minimize
cod_chrome_restore
cod_circle
cod_circle_filled
cod_circle_large
cod_circle_large_filled
cod_circle_slash
cod_circle_small
cod_circle_small_filled
cod_circuit_board
cod_clear_all
cod_clippy
cod_close
cod_close_all
cod_cloud
cod_cloud_download
cod_cloud_upload
cod_code
cod_coffee
cod_collapse_all
cod_color_mode
cod_combine
cod_comment
cod_comment_discussion
cod_comment_draft
cod_comment_unresolved
cod_compass
cod_compass_active
cod_compass_dot
cod_copilot
cod_copy
cod_credit_card
cod_dash
cod_dashboard
cod_database
cod_debug
cod_debug_all
cod_debug_alt
cod_debug_alt_small
cod_debug_breakpoint_conditional
cod_debug_breakpoint_conditional_unverified
cod_debug_breakpoint_data
cod_debug_breakpoint_data_unverified
cod_debug_breakpoint_function
cod_debug_breakpoint_function_unverified
cod_debug_breakpoint_log
cod_debug_breakpoint_log_unverified
cod_debug_breakpoint_unsupported
cod_debug_console
cod_debug_continue
cod_debug_continue_small
cod_debug_coverage
cod_debug_disconnect
cod_debug_line_by_line
cod_debug_pause
cod_debug_rerun
cod_debug_restart
cod_debug_restart_frame
cod_debug_reverse_continue
cod_debug_stackframe
cod_debug_stackframe_active
cod_debug_start
cod_debug_step_back
cod_debug_step_into
cod_debug_step_out
cod_debug_step_over
cod_debug_stop
cod_desktop_download
cod_device_camera
cod_device_camera_video
cod_device_mobile
cod_diff
cod_diff_added
cod_diff_ignored
cod_diff_modified
cod_diff_removed
cod_diff_renamed
cod_discard
cod_edit
cod_editor_layout
cod_ellipsis
cod_empty_window
cod_error
cod_error_small
cod_exclude
cod_expand_all
cod_export
cod_extensions
cod_eye
cod_eye_closed
cod_feedback
cod_file
cod_file_binary
cod_file_code
cod_file_media
cod_file_pdf
cod_file_submodule
cod_file_symlink_directory
cod_file_symlink_file
cod_file_zip
cod_files
cod_filter
cod_filter_filled
cod_flame
cod_fold
cod_fold_down
cod_fold_up
cod_folder
cod_folder_active
cod_folder_library
cod_folder_opened
cod_game
cod_gear
cod_gift
cod_gist_secret
cod_git_commit
cod_git_compare
cod_git_fetch
cod_git_merge
cod_git_pull_request
cod_git_pull_request_closed
cod_git_pull_request_create
cod_git_pull_request_draft
cod_git_pull_request_go_to_changes
cod_git_pull_request_new_changes
cod_github
cod_github_action
cod_github_alt
cod_github_inverted
cod_globe
cod_go_to_file
cod_grabber
cod_graph
cod_graph_left
cod_graph_line
cod_graph_scatter
cod_gripper
cod_group_by_ref_type
cod_heart
cod_heart_filled
cod_history
cod_home
cod_horizontal_rule
cod_hubot
cod_inbox
cod_indent
cod_info
cod_insert
cod_inspect
cod_issue_draft
cod_issue_reopened
cod_issues
cod_italic
cod_jersey
cod_json
cod_kebab_vertical
cod_key
cod_law
cod_layers
cod_layers_active
cod_layers_dot
cod_layout
cod_layout_activitybar_left
cod_layout_activitybar_right
cod_layout_centered
cod_layout_menubar
cod_layout_panel
cod_layout_panel_center
cod_layout_panel_justify
cod_layout_panel_left
cod_layout_panel_off
cod_layout_panel_right
cod_layout_sidebar_left
cod_layout_sidebar_left_off
cod_layout_sidebar_right
cod_layout_sidebar_right_off
cod_layout_statusbar
cod_library
cod_lightbulb
cod_lightbulb_autofix
cod_link
cod_link_external
cod_list_filter
cod_list_flat
cod_list_ordered
cod_list_selection
cod_list_tree
cod_list_unordered
cod_live_share
cod_loading
cod_location
cod_lock
cod_lock_small
cod_magnet
cod_mail
cod_mail_read
cod_map
cod_map_filled
cod_markdown
cod_megaphone
cod_mention
cod_menu
cod_merge
cod_mic
cod_mic_filled
cod_milestone
cod_mirror
cod_mortar_board
cod_move
cod_multiple_windows
cod_music
cod_mute
cod_new_file
cod_new_folder
cod_newline
cod_no_newline
cod_note
cod_notebook
cod_notebook_template
cod_octoface
cod_open_preview
cod_organization
cod_output
cod_package
cod_paintcan
cod_pass
cod_pass_filled
cod_person
cod_person_add
cod_piano
cod_pie_chart
cod_pin
cod_pinned
cod_pinned_dirty
cod_play
cod_play_circle
cod_plug
cod_preserve_case
cod_preview
cod_primitive_square
cod_project
cod_pulse
cod_question
cod_quote
cod_radio_tower
cod_reactions
cod_record
cod_record_keys
cod_record_small
cod_redo
cod_references
cod_refresh
cod_regex
cod_remote
cod_remote_explorer
cod_remove
cod_replace
cod_replace_all
cod_reply
cod_repo
cod_repo_clone
cod_repo_force_push
cod_repo_forked
cod_repo_pull
cod_repo_push
cod_report
cod_request_changes
cod_rocket
cod_root_folder
cod_root_folder_opened
cod_rss
cod_ruby
cod_run_above
cod_run_all
cod_run_below
cod_run_errors
cod_save
cod_save_all
cod_save_as
cod_screen_full
cod_screen_normal
cod_search
cod_search_fuzzy
cod_search_stop
cod_send
cod_server
cod_server_environment
cod_server_process
cod_settings
cod_settings_gear
cod_shield
cod_sign_in
cod_sign_out
cod_smiley
cod_snake
cod_sort_precedence
cod_source_control
cod_sparkle
cod_split_horizontal
cod_split_vertical
cod_squirrel
cod_star_empty
cod_star_full
cod_star_half
cod_stop_circle
cod_symbol_array
cod_symbol_boolean
cod_symbol_class
cod_symbol_color
cod_symbol_constant
cod_symbol_enum
cod_symbol_enum_member
cod_symbol_event
cod_symbol_field
cod_symbol_file
cod_symbol_interface
cod_symbol_key
cod_symbol_keyword
cod_symbol_method
cod_symbol_misc
cod_symbol_namespace
cod_symbol_numeric
cod_symbol_operator
cod_symbol_parameter
cod_symbol_property
cod_symbol_ruler
cod_symbol_snippet
cod_symbol_string
cod_symbol_structure
cod_symbol_variable
cod_sync
cod_sync_ignored
cod_table
cod_tag
cod_target
cod_tasklist
cod_telescope
cod_terminal
cod_terminal_bash
cod_terminal_cmd
cod_terminal_debian
cod_terminal_linux
cod_terminal_powershell
cod_terminal_tmux
cod_terminal_ubuntu
cod_text_size
cod_three_bars
cod_thumbsdown
cod_thumbsdown_filled
cod_thumbsup
cod_thumbsup_filled
cod_tools
cod_trash
cod_triangle_down
cod_triangle_left
cod_triangle_right
cod_triangle_up
cod_twitter
cod_type_hierarchy
cod_type_hierarchy_sub
cod_type_hierarchy_super
cod_unfold
cod_ungroup_by_ref_type
cod_unlock
cod_unmute
cod_unverified
cod_variable_group
cod_verified
cod_verified_filled
cod_versions
cod_vm
cod_vm_active
cod_vm_connect
cod_vm_outline
cod_vm_running
cod_vr
cod_wand
cod_warning
cod_watch
cod_whitespace
cod_whole_word
cod_window
cod_word_wrap
cod_workspace_trusted
cod_workspace_unknown
cod_workspace_untrusted
cod_zoom_in
cod_zoom_out
custom_ada
custom_asm
custom_astro
custom_bazel
custom_c
custom_chuck
custom_common_lisp
custom_cpp
custom_crystal
custom_default
custom_electron
custom_elixir
custom_elm
custom_emacs
custom_fennel
custom_firebase
custom_folder
custom_folder_config
custom_folder_git
custom_folder_git_branch
custom_folder_github
custom_folder_npm
custom_folder_oct
custom_folder_open
custom_go
custom_home
custom_kotlin
custom_msdos
custom_neovim
custom_orgmode
custom_play_arrow
custom_prettier
custom_puppet
custom_purescript
custom_ruby
custom_scheme
custom_toml
custom_v_lang
custom_vim
custom_vitruvian
custom_windows
dev_aarch64
dev_adonisjs
dev_aftereffects
dev_akka
dev_algolia
dev_alpinejs
dev_amazonwebservices
dev_anaconda
dev_android
dev_androidstudio
dev_angular
dev_angularjs
dev_angularmaterial
dev_ansible
dev_antdesign
dev_apache
dev_apacheairflow
dev_apachekafka
dev_apachespark
dev_apl
dev_appcelerator
dev_apple
dev_appwrite
dev_archlinux
dev_arduino
dev_argocd
dev_astro
dev_atom
dev_awk
dev_aws
dev_axios
dev_azure
dev_azuredevops
dev_azuresqldatabase
dev_babel
dev_backbone
dev_backbonejs
dev_ballerina
dev_bamboo
dev_bash
dev_beats
dev_behance
dev_bitbucket
dev_blazor
dev_blender
dev_bootstrap
dev_bower
dev_browserstack
dev_bulma
dev_bun
dev_c
dev_c_lang
dev_cairo
dev_cakephp
dev_canva
dev_capacitor
dev_carbon
dev_cassandra
dev_centos
dev_ceylon
dev_chrome
dev_circleci
dev_clarity
dev_clion
dev_clojure
dev_clojure_alt
dev_clojurescript
dev_cloudflare
dev_cloudflareworkers
dev_cmake
dev_codeac
dev_codecov
dev_codeigniter
dev_codepen
dev_coffeescript
dev_composer
dev_confluence
dev_consul
dev_contao
dev_corejs
dev_cosmosdb
dev_couchbase
dev_couchdb
dev_cplusplus
dev_crystal
dev_csharp
dev_css3
dev_css3_full
dev_cucumber
dev_cypressio
dev_d3js
dev_dart
dev_database
dev_datagrip
dev_dataspell
dev_dbeaver
dev_debian
dev_denojs
dev_devicon
dev_digital_ocean
dev_digitalocean
dev_discordjs
dev_django
dev_djangorest
dev_dlang
dev_docker
dev_doctrine
dev_dotnet
dev_dotnetcore
dev_dreamweaver
dev_dropbox
dev_dropwizard
dev_drupal
dev_dynamodb
dev_eclipse
dev_ecto
dev_elasticsearch
dev_electron
dev_eleventy
dev_elixir
dev_elm
dev_emacs
dev_embeddedc
dev_ember
dev_envoy
dev_erlang
dev_eslint
dev_express
dev_facebook
dev_fastapi
dev_fastify
dev_faunadb
dev_feathersjs
dev_fedora
dev_figma
dev_filezilla
dev_firebase
dev_firefox
dev_flask
dev_flutter
dev_fortran
dev_foundation
dev_framermotion
dev_framework7
dev_fsharp
dev_gatling
dev_gatsby
dev_gazebo
dev_gcc
dev_gentoo
dev_ghost
dev_ghost_small
dev_gimp
dev_git
dev_git_branch
dev_git_commit
dev_git_compare
dev_git_merge
dev_git_pull_request
dev_gitbook
dev_github
dev_github_badge
dev_github_full
dev_githubactions
dev_githubcodespaces
dev_gitlab
dev_gitpod
dev_gitter
dev_gnu
dev_go
dev_godot
dev_goland
dev_google
dev_googlecloud
dev_gradle
dev_grafana
dev_grails
dev_graphql
dev_groovy
dev_grpc
dev_grunt
dev_gulp
dev_hadoop
dev_handlebars
dev_hardhat
dev_harvester
dev_haskell
dev_haxe
dev_helm
dev_heroku
dev_hibernate
dev_homebrew
dev_html5
dev_hugo
dev_ie
dev_ifttt
dev_illustrator
dev_influxdb
dev_inkscape
dev_insomnia
dev_intellij
dev_ionic
dev_jaegertracing
dev_jamstack
dev_jasmine
dev_java
dev_javascript
dev_javascript_alt
dev_javascript_badge
dev_jeet
dev_jekyll
dev_jekyll_small
dev_jenkins
dev_jest
dev_jetbrains
dev_jetpackcompose
dev_jira
dev_jiraalign
dev_jquery
dev_json
dev_jule
dev_julia
dev_junit
dev_jupyter
dev_k3os
dev_k3s
dev_k6
dev_kaggle
dev_karatelabs
dev_karma
dev_kdeneon
dev_keras
dev_kibana
dev_knexjs
dev_knockout
dev_kotlin
dev_krakenjs
dev_krakenjs_badge
dev_ktor
dev_kubernetes
dev_labview
dev_laravel
dev_latex
dev_less
dev_linkedin
dev_linux
dev_liquibase
dev_livewire
dev_llvm
dev_lodash
dev_logstash
dev_lua
dev_lumen
dev_magento
dev_mariadb
dev_markdown
dev_materializecss
dev_materialui
dev_matlab
dev_matplotlib
dev_maven
dev_maya
dev_meteor
dev_meteorfull
dev_microsoftsqlserver
dev_minitab
dev_mithril
dev_mobx
dev_mocha
dev_modx
dev_moleculer
dev_mongodb
dev_mongoose
dev_moodle
dev_mootools_badge
dev_mozilla
dev_msdos
dev_mysql
dev_nano
dev_neo4j
dev_neovim
dev_nestjs
dev_netlify
dev_networkx
dev_nextjs
dev_nginx
dev_ngrx
dev_nhibernate
dev_nim
dev_nimble
dev_nixos
dev_nodejs
dev_nodejs_small
dev_nodemon
dev_nodewebkit
dev_nomad
dev_norg
dev_notion
dev_npm
dev_nuget
dev_numpy
dev_nuxtjs
dev_oauth
dev_objectivec
dev_ocaml
dev_ohmyzsh
dev_okta
dev_openal
dev_openapi
dev_opencl
dev_opencv
dev_opengl
dev_openstack
dev_opensuse
dev_opentelemetry
dev_opera
dev_oracle
dev_ory
dev_p5js
dev_packer
dev_pandas
dev_perl
dev_pfsense
dev_phalcon
dev_phoenix
dev_photonengine
dev_photoshop
dev_php
dev_phpstorm
dev_playwright
dev_plotly
dev_pnpm
dev_podman
dev_poetry
dev_polygon
dev_portainer
dev_postcss
dev_postgresql
dev_postman
dev_powershell
dev_premierepro
dev_prisma
dev_processing
dev_prolog
dev_prometheus
dev_protractor
dev_pulsar
dev_pulumi
dev_puppeteer
dev_purescript
dev_putty
dev_pycharm
dev_pypi
dev_pyscript
dev_pytest
dev_python
dev_pytorch
dev_qodana
dev_qt
dev_quarkus
dev_quasar
dev_qwik
dev_r
dev_rabbitmq
dev_rails
dev_railway
dev_rancher
dev_raspberry_pi
dev_reach
dev_react
dev_reactbootstrap
dev_reactnavigation
dev_reactrouter
dev_readthedocs
dev_realm
dev_rect
dev_redhat
dev_redis
dev_redux
dev_renpy
dev_replit
dev_requirejs
dev_rider
dev_rocksdb
dev_rockylinux
dev_rollup
dev_ros
dev_rspec
dev_rstudio
dev_ruby
dev_ruby_on_rails
dev_ruby_rough
dev_rubymine
dev_rust
dev_rxjs
dev_safari
dev_salesforce
dev_sanity
dev_sass
dev_scala
dev_scalingo
dev_scikitlearn
dev_sdl
dev_selenium
dev_sema
dev_sentry
dev_sequelize
dev_shopware
dev_shotgrid
dev_sketch
dev_slack
dev_smashing_magazine
dev_socketio
dev_solidity
dev_solidjs
dev_sonarqube
dev_sourcetree
dev_spack
dev_splunk
dev_spring
dev_spss
dev_spyder
dev_sqlalchemy
dev_sqldeveloper
dev_sqlite
dev_ssh
dev_stackoverflow
dev_stata
dev_storybook
dev_streamlit
dev_stylus
dev_sublime
dev_subversion
dev_supabase
dev_svelte
dev_swagger
dev_swift
dev_swiper
dev_symfony
dev_symfony_badge
dev_tailwindcss
dev_tauri
dev_tensorflow
dev_terminal
dev_terraform
dev_tex
dev_thealgorithms
dev_threedsmax
dev_threejs
dev_titaniumsdk
dev_tomcat
dev_tortoisegit
dev_towergit
dev_traefikmesh
dev_traefikproxy
dev_travis
dev_trello
dev_trpc
dev_twitter
dev_typescript
dev_typo3
dev_ubuntu
dev_uml
dev_unifiedmodelinglanguage
dev_unity
dev_unity_small
dev_unix
dev_unrealengine
dev_uwsgi
dev_v8
dev_vagrant
dev_vala
dev_vault
dev_vercel
dev_vertx
dev_vim
dev_visualbasic
dev_visualstudio
dev_vite
dev_vitejs
dev_vitess
dev_vitest
dev_vscode
dev_vsphere
dev_vuejs
dev_vuestorefront
dev_vuetify
dev_vyper
dev_wasm
dev_webflow
dev_weblate
dev_webpack
dev_webstorm
dev_windows
dev_windows11
dev_woocommerce
dev_wordpress
dev_xamarin
dev_xcode
dev_xd
dev_xml
dev_yaml
dev_yarn
dev_yii
dev_yugabytedb
dev_yunohost
dev_zend
dev_zig
fa_500px
fa_accessible_icon
fa_accusoft
fa_address_book
fa_address_book_o
fa_address_card
fa_address_card_o
fa_adjust
fa_adn
fa_adversal
fa_affiliatetheme
fa_airbnb
fa_algolia
fa_align_center
fa_align_justify
fa_align_left
fa_align_right
fa_alipay
fa_amazon
fa_amazon_pay
fa_ambulance
fa_american_sign_language_interpreting
fa_amilia
fa_anchor
fa_android
fa_angellist
fa_angle_double_down
fa_angle_double_left
fa_angle_double_right
fa_angle_double_up
fa_angle_down
fa_angle_left
fa_angle_right
fa_angle_up
fa_angles_down
fa_angles_left
fa_angles_right
fa_angles_up
fa_angrycreative
fa_angular
fa_ankh
fa_app_store
fa_app_store_ios
fa_apper
fa_apple
fa_apple_pay
fa_apple_whole
fa_archive
fa_archway
fa_area_chart
fa_arrow_circle_down
fa_arrow_circle_left
fa_arrow_circle_o_down
fa_arrow_circle_o_left
fa_arrow_circle_o_right
fa_arrow_circle_o_up
fa_arrow_circle_right
fa_arrow_circle_up
fa_arrow_down
fa_arrow_down_1_9
fa_arrow_down_9_1
fa_arrow_down_a_z
fa_arrow_down_long
fa_arrow_down_short_wide
fa_arrow_down_wide_short
fa_arrow_down_z_a
fa_arrow_left
fa_arrow_left_long
fa_arrow_pointer
fa_arrow_right
fa_arrow_right_arrow_left
fa_arrow_right_from_bracket
fa_arrow_right_long
fa_arrow_right_to_bracket
fa_arrow_rotate_left
fa_arrow_rotate_right
fa_arrow_turn_down
fa_arrow_turn_up
fa_arrow_up
fa_arrow_up_1_9
fa_arrow_up_9_1
fa_arrow_up_a_z
fa_arrow_up_long
fa_arrow_up_right_from_square
fa_arrow_up_short_wide
fa_arrow_up_wide_short
fa_arrow_up_z_a
fa_arrows
fa_arrows_alt
fa_arrows_h
fa_arrows_left_right
fa_arrows_rotate
fa_arrows_up_down
fa_arrows_up_down_left_right
fa_arrows_v
fa_artstation
fa_asl_interpreting
fa_assistive_listening_systems
fa_asterisk
fa_asymmetrik
fa_at
fa_atlassian
fa_atom
fa_audible
fa_audio_description
fa_automobile
fa_autoprefixer
fa_avianex
fa_aviato
fa_award
fa_aws
fa_baby
fa_baby_carriage
fa_backward
fa_backward_fast
fa_backward_step
fa_bacon
fa_bag_shopping
fa_bahai
fa_balance_scale
fa_ban
fa_ban_smoking
fa_bandage
fa_bandcamp
fa_bank
fa_bar_chart
fa_bar_chart_o
fa_barcode
fa_bars
fa_bars_progress
fa_bars_staggered
fa_baseball
fa_baseball_bat_ball
fa_basket_shopping
fa_basketball
fa_bath
fa_bathtub
fa_battery
fa_battery_0
fa_battery_1
fa_battery_2
fa_battery_3
fa_battery_4
fa_battery_empty
fa_battery_full
fa_battery_half
fa_battery_quarter
fa_battery_three_quarters
fa_battle_net
fa_bed
fa_bed_pulse
fa_beer
fa_beer_mug_empty
fa_behance
fa_behance_square
fa_bell
fa_bell_concierge
fa_bell_o
fa_bell_slash
fa_bell_slash_o
fa_bezier_curve
fa_bicycle
fa_bimobject
fa_binoculars
fa_biohazard
fa_birthday_cake
fa_bitbucket
fa_bitbucket_square
fa_bitcoin
fa_bity
fa_black_tie
fa_blackberry
fa_blender
fa_blender_phone
fa_blind
fa_blog
fa_blogger
fa_blogger_b
fa_bluetooth
fa_bluetooth_b
fa_bold
fa_bolt
fa_bomb
fa_bone
fa_bong
fa_book
fa_book_atlas
fa_book_bible
fa_book_journal_whills
fa_book_medical
fa_book_open
fa_book_open_reader
fa_book_quran
fa_book_skull
fa_book_tanakh
fa_bookmark
fa_bookmark_o
fa_bootstrap
fa_border_all
fa_border_none
fa_border_top_left
fa_bowling_ball
fa_box
fa_box_archive
fa_box_open
fa_boxes_stacked
fa_braille
fa_brain
fa_bread_slice
fa_briefcase
fa_briefcase_medical
fa_broom
fa_broom_ball
fa_brush
fa_btc
fa_buffer
fa_bug
fa_building
fa_building_columns
fa_building_o
fa_bullhorn
fa_bullseye
fa_burger
fa_buromobelexperte
fa_bus
fa_bus_simple
fa_business_time
fa_buy_n_large
fa_buysellads
fa_cab
fa_cable_car
fa_cake_candles
fa_calculator
fa_calendar
fa_calendar_check
fa_calendar_check_o
fa_calendar_day
fa_calendar_days
fa_calendar_minus
fa_calendar_minus_o
fa_calendar_o
fa_calendar_plus
fa_calendar_plus_o
fa_calendar_times_o
fa_calendar_week
fa_calendar_xmark
fa_camera
fa_camera_retro
fa_campground
fa_canadian_maple_leaf
fa_candy_cane
fa_cannabis
fa_capsules
fa_car
fa_car_battery
fa_car_burst
fa_car_rear
fa_car_side
fa_caravan
fa_caret_down
fa_caret_left
fa_caret_right
fa_caret_square_o_down
fa_caret_square_o_left
fa_caret_square_o_right
fa_caret_square_o_up
fa_caret_up
fa_carrot
fa_cart_arrow_down
fa_cart_flatbed
fa_cart_flatbed_suitcase
fa_cart_plus
fa_cart_shopping
fa_cash_register
fa_cat
fa_cc
fa_cc_amazon_pay
fa_cc_amex
fa_cc_apple_pay
fa_cc_diners_club
fa_cc_discover
fa_cc_jcb
fa_cc_mastercard
fa_cc_paypal
fa_cc_stripe
fa_cc_visa
fa_centercode
fa_centos
fa_certificate
fa_chain
fa_chain_broken
fa_chair
fa_chalkboard
fa_chalkboard_user
fa_champagne_glasses
fa_charging_station
fa_chart_area
fa_chart_bar
fa_chart_line
fa_chart_pie
fa_check
fa_check_circle
fa_check_circle_o
fa_check_double
fa_check_square
fa_check_square_o
fa_check_to_slot
fa_cheese
fa_chess
fa_chess_bishop
fa_chess_board
fa_chess_king
fa_chess_knight
fa_chess_pawn
fa_chess_queen
fa_chess_rook
fa_chevron_circle_down
fa_chevron_circle_left
fa_chevron_circle_right
fa_chevron_circle_up
fa_chevron_down
fa_chevron_left
fa_chevron_right
fa_chevron_up
fa_child
fa_chrome
fa_chromecast
fa_church
fa_circle
fa_circle_arrow_down
fa_circle_arrow_left
fa_circle_arrow_right
fa_circle_arrow_up
fa_circle_check
fa_circle_chevron_down
fa_circle_chevron_left
fa_circle_chevron_right
fa_circle_chevron_up
fa_circle_dollar_to_slot
fa_circle_dot
fa_circle_down
fa_circle_exclamation
fa_circle_h
fa_circle_half_stroke
fa_circle_info
fa_circle_left
fa_circle_minus
fa_circle_notch
fa_circle_o
fa_circle_o_notch
fa_circle_pause
fa_circle_play
fa_circle_plus
fa_circle_question
fa_circle_radiation
fa_circle_right
fa_circle_stop
fa_circle_thin
fa_circle_up
fa_circle_user
fa_circle_xmark
fa_city
fa_clipboard
fa_clipboard_alt
fa_clipboard_check
fa_clipboard_list
fa_clipboard_user
fa_clock
fa_clock_o
fa_clock_rotate_left
fa_clone
fa_close
fa_closed_captioning
fa_cloud
fa_cloud_arrow_down
fa_cloud_arrow_up
fa_cloud_bolt
fa_cloud_download
fa_cloud_meatball
fa_cloud_moon
fa_cloud_moon_rain
fa_cloud_rain
fa_cloud_showers_heavy
fa_cloud_sun
fa_cloud_sun_rain
fa_cloud_upload
fa_cloudscale
fa_cloudsmith
fa_cloudversify
fa_cny
fa_code
fa_code_branch
fa_code_commit
fa_code_fork
fa_code_merge
fa_codepen
fa_codiepie
fa_coffee
fa_cog
fa_cogs
fa_coins
fa_columns
fa_comment
fa_comment_dollar
fa_comment_dots
fa_comment_medical
fa_comment_o
fa_comment_slash
fa_comment_sms
fa_commenting
fa_commenting_o
fa_comments
fa_comments_dollar
fa_comments_o
fa_compact_disc
fa_compass
fa_compass_drafting
fa_compress
fa_computer_mouse
fa_confluence
fa_connectdevelop
fa_contao
fa_cookie
fa_cookie_bite
fa_copy
fa_copyright
fa_cotton_bureau
fa_couch
fa_cow
fa_cpanel
fa_creative_commons
fa_creative_commons_by
fa_creative_commons_nc
fa_creative_commons_nc_eu
fa_creative_commons_nc_jp
fa_creative_commons_nd
fa_creative_commons_pd
fa_creative_commons_pd_alt
fa_creative_commons_remix
fa_creative_commons_sa
fa_creative_commons_sampling
fa_creative_commons_sampling_plus
fa_creative_commons_share
fa_creative_commons_zero
fa_credit_card
fa_credit_card_alt
fa_critical_role
fa_crop
fa_crop_simple
fa_cross
fa_crosshairs
fa_crow
fa_crown
fa_crutch
fa_css3
fa_css3_alt
fa_cube
fa_cubes
fa_cut
fa_cutlery
fa_cuttlefish
fa_d_and_d
fa_d_and_d_beyond
fa_dashboard
fa_dashcube
fa_database
fa_deaf
fa_deafness
fa_dedent
fa_delete_left
fa_delicious
fa_democrat
fa_deploydog
fa_deskpro
fa_desktop
fa_dev
fa_deviantart
fa_dharmachakra
fa_dhl
fa_diagram_project
fa_diamond
fa_diamond_turn_right
fa_diaspora
fa_dice
fa_dice_d6
fa_dice_d20
fa_dice_five
fa_dice_four
fa_dice_one
fa_dice_six
fa_dice_three
fa_dice_two
fa_digg
fa_digital_ocean
fa_discord
fa_discourse
fa_disease
fa_divide
fa_dna
fa_dochub
fa_docker
fa_dog
fa_dollar
fa_dollar_sign
fa_dolly
fa_door_closed
fa_door_open
fa_dot_circle_o
fa_dove
fa_down_left_and_up_right_to_center
fa_down_long
fa_download
fa_draft2digital
fa_dragon
fa_draw_polygon
fa_dribbble
fa_drivers_license
fa_drivers_license_o
fa_dropbox
fa_droplet
fa_droplet_slash
fa_drum
fa_drum_steelpan
fa_drumstick_bite
fa_drupal
fa_dumbbell
fa_dumpster
fa_dumpster_fire
fa_dungeon
fa_dyalog
fa_ear_deaf
fa_ear_listen
fa_earlybirds
fa_earth_africa
fa_earth_americas
fa_earth_asia
fa_earth_europe
fa_ebay
fa_edge
fa_edit
fa_eercast
fa_egg
fa_eject
fa_elementor
fa_ellipsis
fa_ellipsis_h
fa_ellipsis_v
fa_ellipsis_vertical
fa_ello
fa_ember
fa_empire
fa_envelope
fa_envelope_o
fa_envelope_open
fa_envelope_open_o
fa_envelope_open_text
fa_envelope_square
fa_envelopes_bulk
fa_envira
fa_equals
fa_eraser
fa_erlang
fa_ethereum
fa_ethernet
fa_etsy
fa_eur
fa_euro
fa_euro_sign
fa_evernote
fa_exchange
fa_exclamation
fa_exclamation_circle
fa_exclamation_triangle
fa_expand
fa_expeditedssl
fa_external_link
fa_external_link_square
fa_eye
fa_eye_dropper
fa_eye_low_vision
fa_eye_slash
fa_eyedropper
fa_fa
fa_face_angry
fa_face_dizzy
fa_face_flushed
fa_face_frown
fa_face_frown_open
fa_face_grimace
fa_face_grin
fa_face_grin_beam
fa_face_grin_beam_sweat
fa_face_grin_hearts
fa_face_grin_squint
fa_face_grin_squint_tears
fa_face_grin_stars
fa_face_grin_tears
fa_face_grin_tongue
fa_face_grin_tongue_squint
fa_face_grin_tongue_wink
fa_face_grin_wide
fa_face_grin_wink
fa_face_kiss
fa_face_kiss_beam
fa_face_kiss_wink_heart
fa_face_laugh
fa_face_laugh_beam
fa_face_laugh_squint
fa_face_laugh_wink
fa_face_meh
fa_face_meh_blank
fa_face_rolling_eyes
fa_face_sad_cry
fa_face_sad_tear
fa_face_smile
fa_face_smile_beam
fa_face_smile_wink
fa_face_surprise
fa_face_tired
fa_facebook
fa_facebook_f
fa_facebook_messenger
fa_facebook_official
fa_facebook_square
fa_fan
fa_fantasy_flight_games
fa_fast_backward
fa_fast_forward
fa_fax
fa_feather
fa_feather_pointed
fa_fedex
fa_fedora
fa_feed
fa_female
fa_fighter_jet
fa_figma
fa_file
fa_file_archive_o
fa_file_arrow_down
fa_file_arrow_up
fa_file_audio
fa_file_audio_o
fa_file_code
fa_file_code_o
fa_file_contract
fa_file_csv
fa_file_excel
fa_file_excel_o
fa_file_export
fa_file_image
fa_file_image_o
fa_file_import
fa_file_invoice
fa_file_invoice_dollar
fa_file_lines
fa_file_medical
fa_file_movie_o
fa_file_o
fa_file_pdf
fa_file_pdf_o
fa_file_pen
fa_file_photo_o
fa_file_picture_o
fa_file_powerpoint
fa_file_powerpoint_o
fa_file_prescription
fa_file_signature
fa_file_sound_o
fa_file_text
fa_file_text_o
fa_file_video
fa_file_video_o
fa_file_waveform
fa_file_word
fa_file_word_o
fa_file_zip_o
fa_file_zipper
fa_files_o
fa_fill
fa_fill_drip
fa_film
fa_filter
fa_filter_circle_dollar
fa_fingerprint
fa_fire
fa_fire_extinguisher
fa_fire_flame_curved
fa_fire_flame_simple
fa_firefox
fa_first_order
fa_first_order_alt
fa_firstdraft
fa_fish
fa_flag
fa_flag_checkered
fa_flag_o
fa_flag_usa
fa_flash
fa_flask
fa_flickr
fa_flipboard
fa_floppy_disk
fa_floppy_o
fa_fly
fa_folder
fa_folder_minus
fa_folder_o
fa_folder_open
fa_folder_open_o
fa_folder_plus
fa_folder_tree
fa_font
fa_font_awesome
fa_fonticons
fa_fonticons_fi
fa_football
fa_fort_awesome
fa_fort_awesome_alt
fa_forumbee
fa_forward
fa_forward_fast
fa_forward_step
fa_foursquare
fa_free_code_camp
fa_freebsd
fa_frog
fa_frown_o
fa_fulcrum
fa_futbol
fa_futbol_o
fa_galactic_republic
fa_galactic_senate
fa_gamepad
fa_gas_pump
fa_gauge
fa_gauge_high
fa_gauge_simple
fa_gauge_simple_high
fa_gavel
fa_gbp
fa_ge
fa_gear
fa_gears
fa_gem
fa_genderless
fa_get_pocket
fa_gg
fa_gg_circle
fa_ghost
fa_gift
fa_gifts
fa_git
fa_git_alt
fa_git_square
fa_github
fa_github_alt
fa_github_square
fa_gitkraken
fa_gitlab
fa_gitter
fa_gittip
fa_glass
fa_glasses
fa_glide
fa_glide_g
fa_globe
fa_gofore
fa_golf_ball_tee
fa_goodreads
fa_goodreads_g
fa_google
fa_google_drive
fa_google_play
fa_google_plus
fa_google_plus_circle
fa_google_plus_official
fa_google_plus_square
fa_google_wallet
fa_gopuram
fa_graduation_cap
fa_gratipay
fa_grav
fa_greater_than
fa_greater_than_equal
fa_grip
fa_grip_lines
fa_grip_lines_vertical
fa_grip_vertical
fa_gripfire
fa_group
fa_grunt
fa_guitar
fa_gulp
fa_h_square
fa_hacker_news
fa_hackerrank
fa_hammer
fa_hamsa
fa_hand
fa_hand_back_fist
fa_hand_dots
fa_hand_fist
fa_hand_grab_o
fa_hand_holding
fa_hand_holding_dollar
fa_hand_holding_droplet
fa_hand_holding_heart
fa_hand_lizard
fa_hand_lizard_o
fa_hand_middle_finger
fa_hand_o_down
fa_hand_o_left
fa_hand_o_right
fa_hand_o_up
fa_hand_paper_o
fa_hand_peace
fa_hand_peace_o
fa_hand_point_down
fa_hand_point_left
fa_hand_point_right
fa_hand_point_up
fa_hand_pointer
fa_hand_pointer_o
fa_hand_rock_o
fa_hand_scissors
fa_hand_scissors_o
fa_hand_spock
fa_hand_spock_o
fa_hand_stop_o
fa_hands
fa_hands_asl_interpreting
fa_hands_holding
fa_hands_praying
fa_handshake
fa_handshake_angle
fa_handshake_o
fa_handshake_simple
fa_hanukiah
fa_hard_drive
fa_hard_of_hearing
fa_hashtag
fa_hat_cowboy
fa_hat_cowboy_side
fa_hat_wizard
fa_hdd_o
fa_header
fa_heading
fa_headphones
fa_headphones_simple
fa_headset
fa_heard_o
fa_heart
fa_heart_crack
fa_heart_o
fa_heart_pulse
fa_heartbeat
fa_helicopter
fa_helmet_safety
fa_highlighter
fa_hippo
fa_hips
fa_hire_a_helper
fa_history
fa_hockey_puck
fa_holly_berry
fa_home
fa_hooli
fa_hornbill
fa_horse
fa_horse_head
fa_hospital
fa_hospital_o
fa_hospital_user
fa_hot_tub_person
fa_hotdog
fa_hotel
fa_hotel_building
fa_hotjar
fa_hourglass
fa_hourglass_1
fa_hourglass_2
fa_hourglass_3
fa_hourglass_end
fa_hourglass_half
fa_hourglass_o
fa_hourglass_start
fa_house
fa_house_chimney
fa_house_chimney_crack
fa_house_chimney_medical
fa_houzz
fa_hryvnia_sign
fa_html5
fa_hubspot
fa_hurricane
fa_i_cursor
fa_ice_cream
fa_icicles
fa_icons
fa_id_badge
fa_id_card
fa_id_card_clip
fa_id_card_o
fa_igloo
fa_ils
fa_image
fa_image_portrait
fa_images
fa_imdb
fa_inbox
fa_indent
fa_industry
fa_infinity
fa_info
fa_info_circle
fa_inr
fa_instagram
fa_institution
fa_intercom
fa_internet_explorer
fa_intersex
fa_invision
fa_ioxhost
fa_italic
fa_itch_io
fa_itunes
fa_itunes_note
fa_java
fa_jedi
fa_jedi_order
fa_jenkins
fa_jet_fighter
fa_jira
fa_joget
fa_joint
fa_joomla
fa_jpy
fa_js
fa_jsfiddle
fa_kaaba
fa_kaggle
fa_key
fa_keybase
fa_keyboard
fa_keyboard_o
fa_keycdn
fa_khanda
fa_kickstarter
fa_kickstarter_k
fa_kit_medical
fa_kiwi_bird
fa_korvue
fa_krw
fa_landmark
fa_landmark_dome
fa_language
fa_laptop
fa_laptop_code
fa_laptop_medical
fa_laravel
fa_lastfm
fa_lastfm_square
fa_layer_group
fa_leaf
fa_leanpub
fa_left_long
fa_left_right
fa_legal
fa_lemon
fa_lemon_o
fa_less
fa_less_than
fa_less_than_equal
fa_level_down
fa_level_up
fa_life_bouy
fa_life_buoy
fa_life_ring
fa_life_saver
fa_lightbulb
fa_lightbulb_o
fa_line
fa_line_chart
fa_link
fa_link_slash
fa_linkedin
fa_linkedin_in
fa_linkedin_square
fa_linode
fa_linux
fa_lira_sign
fa_list
fa_list_alt
fa_list_check
fa_list_ol
fa_list_ul
fa_location_arrow
fa_location_crosshairs
fa_location_dot
fa_location_pin
fa_lock
fa_lock_open
fa_long_arrow_down
fa_long_arrow_left
fa_long_arrow_right
fa_long_arrow_up
fa_low_vision
fa_lungs
fa_lyft
fa_magento
fa_magic
fa_magnet
fa_magnifying_glass
fa_magnifying_glass_dollar
fa_magnifying_glass_location
fa_magnifying_glass_minus
fa_magnifying_glass_plus
fa_mail_forward
fa_mail_reply
fa_mail_reply_all
fa_mailchimp
fa_male
fa_mandalorian
fa_map
fa_map_location
fa_map_location_dot
fa_map_marker
fa_map_o
fa_map_pin
fa_map_signs
fa_markdown
fa_marker
fa_mars
fa_mars_double
fa_mars_stroke
fa_mars_stroke_h
fa_mars_stroke_right
fa_mars_stroke_up
fa_mars_stroke_v
fa_martini_glass
fa_martini_glass_citrus
fa_martini_glass_empty
fa_mask
fa_masks_theater
fa_mastodon
fa_maxcdn
fa_maximize
fa_mdb
fa_meanpath
fa_medal
fa_medapps
fa_medium
fa_medkit
fa_medrt
fa_meetup
fa_megaport
fa_meh_o
fa_memory
fa_mendeley
fa_menorah
fa_mercury
fa_message
fa_meteor
fa_microchip
fa_microphone
fa_microphone_lines
fa_microphone_lines_slash
fa_microphone_slash
fa_microscope
fa_microsoft
fa_minimize
fa_minus
fa_minus_circle
fa_minus_square
fa_minus_square_o
fa_mitten
fa_mix
fa_mixcloud
fa_mizuni
fa_mobile
fa_mobile_button
fa_mobile_phone
fa_mobile_screen
fa_mobile_screen_button
fa_modx
fa_monero
fa_money
fa_money_bill
fa_money_bill_1
fa_money_bill_1_wave
fa_money_bill_wave
fa_money_check
fa_money_check_dollar
fa_monument
fa_moon
fa_moon_o
fa_mortar_board
fa_mortar_pestle
fa_mosque
fa_motorcycle
fa_mountain
fa_mouse_pointer
fa_mug_hot
fa_mug_saucer
fa_music
fa_napster
fa_navicon
fa_neos
fa_network_wired
fa_neuter
fa_newspaper
fa_newspaper_o
fa_nimblr
fa_node
fa_node_js
fa_not_equal
fa_note_sticky
fa_notes_medical
fa_npm
fa_ns8
fa_nutritionix
fa_object_group
fa_object_ungroup
fa_odnoklassniki
fa_odnoklassniki_square
fa_oil_can
fa_ok_sign
fa_old_republic
fa_om
fa_opencart
fa_openid
fa_opera
fa_optin_monster
fa_orcid
fa_osi
fa_otter
fa_outdent
fa_page4
fa_pagelines
fa_pager
fa_paint_brush
fa_paint_roller
fa_paintbrush
fa_palette
fa_palfed
fa_pallet
fa_paper_plane
fa_paper_plane_o
fa_paperclip
fa_parachute_box
fa_paragraph
fa_passport
fa_paste
fa_patreon
fa_pause
fa_pause_circle
fa_pause_circle_o
fa_paw
fa_paypal
fa_peace
fa_pen
fa_pen_clip
fa_pen_fancy
fa_pen_nib
fa_pen_ruler
fa_pen_to_square
fa_pencil
fa_pencil_square
fa_pencil_square_o
fa_people_carry_box
fa_pepper_hot
fa_percent
fa_periscope
fa_person
fa_person_biking
fa_person_booth
fa_person_digging
fa_person_dots_from_line
fa_person_dress
fa_person_hiking
fa_person_praying
fa_person_running
fa_person_skating
fa_person_skiing
fa_person_skiing_nordic
fa_person_snowboarding
fa_person_swimming
fa_person_walking
fa_person_walking_with_cane
fa_phabricator
fa_phoenix_framework
fa_phoenix_squadron
fa_phone
fa_phone_flip
fa_phone_slash
fa_phone_square
fa_phone_volume
fa_photo
fa_photo_film
fa_php
fa_picture_o
fa_pie_chart
fa_pied_piper
fa_pied_piper_alt
fa_pied_piper_hat
fa_pied_piper_pp
fa_piggy_bank
fa_pills
fa_pinterest
fa_pinterest_p
fa_pinterest_square
fa_pizza_slice
fa_place_of_worship
fa_plane
fa_plane_arrival
fa_plane_departure
fa_play
fa_play_circle
fa_play_circle_o
fa_playstation
fa_plug
fa_plus
fa_plus_circle
fa_plus_square
fa_plus_square_o
fa_podcast
fa_poo
fa_poo_storm
fa_poop
fa_power_off
fa_prescription
fa_prescription_bottle
fa_prescription_bottle_medical
fa_print
fa_product_hunt
fa_pushed
fa_puzzle_piece
fa_python
fa_qq
fa_qrcode
fa_question
fa_question_circle
fa_question_circle_o
fa_quinscape
fa_quora
fa_quote_left
fa_quote_right
fa_r_project
fa_ra
fa_radiation
fa_radio
fa_rainbow
fa_random
fa_raspberry_pi
fa_ravelry
fa_react
fa_reacteurope
fa_readme
fa_rebel
fa_receipt
fa_record_vinyl
fa_rectangle_ad
fa_rectangle_list
fa_rectangle_xmark
fa_recycle
fa_red_river
fa_reddit
fa_reddit_alien
fa_reddit_square
fa_redhat
fa_refresh
fa_registered
fa_remove
fa_remove_sign
fa_renren
fa_reorder
fa_repeat
fa_repeat_alt
fa_reply
fa_reply_all
fa_replyd
fa_republican
fa_researchgate
fa_resistance
fa_resolving
fa_restroom
fa_retweet
fa_rev
fa_ribbon
fa_right_from_bracket
fa_right_left
fa_right_to_bracket
fa_ring
fa_rmb
fa_road
fa_robot
fa_rocket
fa_rocketchat
fa_rockrms
fa_rotate
fa_rotate_left
fa_rotate_right
fa_rouble
fa_route
fa_rss
fa_rss_square
fa_rub
fa_ruble
fa_ruble_sign
fa_ruler
fa_ruler_combined
fa_ruler_horizontal
fa_ruler_vertical
fa_rupee
fa_rupee_sign
fa_s15
fa_sack_dollar
fa_safari
fa_salesforce
fa_sass
fa_satellite
fa_satellite_dish
fa_save
fa_scale_balanced
fa_scale_unbalanced
fa_scale_unbalanced_flip
fa_schlix
fa_school
fa_scissors
fa_screwdriver
fa_screwdriver_wrench
fa_scribd
fa_scroll
fa_scroll_torah
fa_sd_card
fa_search
fa_search_minus
fa_search_plus
fa_searchengin
fa_seedling
fa_sellcast
fa_sellsy
fa_send
fa_send_o
fa_server
fa_servicestack
fa_shapes
fa_share
fa_share_alt
fa_share_alt_square
fa_share_from_square
fa_share_nodes
fa_share_square
fa_share_square_o
fa_shekel
fa_shekel_sign
fa_sheqel
fa_shield
fa_shield_halved
fa_ship
fa_shirt
fa_shirtsinbulk
fa_shoe_prints
fa_shop
fa_shopping_bag
fa_shopping_basket
fa_shopping_cart
fa_shopware
fa_shower
fa_shuffle
fa_shuttle_space
fa_sign_hanging
fa_sign_in
fa_sign_language
fa_sign_out
fa_signal
fa_signature
fa_signing
fa_signs_post
fa_sim_card
fa_simplybuilt
fa_sistrix
fa_sitemap
fa_sith
fa_sketch
fa_skull
fa_skull_crossbones
fa_skyatlas
fa_skype
fa_slack
fa_slash
fa_sleigh
fa_sliders
fa_slideshare
fa_smile_o
fa_smog
fa_smoking
fa_snapchat
fa_snapchat_ghost
fa_snapchat_square
fa_snowflake
fa_snowflake_o
fa_snowman
fa_snowplow
fa_soccer_ball_o
fa_socks
fa_solar_panel
fa_sort
fa_sort_alpha_asc
fa_sort_alpha_desc
fa_sort_amount_asc
fa_sort_amount_desc
fa_sort_asc
fa_sort_desc
fa_sort_down
fa_sort_numeric_asc
fa_sort_numeric_desc
fa_sort_up
fa_soundcloud
fa_sourcetree
fa_spa
fa_space_shuttle
fa_spaghetti_monster_flying
fa_speakap
fa_speaker_deck
fa_spell_check
fa_spider
fa_spinner
fa_splotch
fa_spoon
fa_spotify
fa_spray_can
fa_spray_can_sparkles
fa_square
fa_square_arrow_up_right
fa_square_behance
fa_square_caret_down
fa_square_caret_left
fa_square_caret_right
fa_square_caret_up
fa_square_check
fa_square_dribbble
fa_square_envelope
fa_square_facebook
fa_square_font_awesome_stroke
fa_square_full
fa_square_git
fa_square_github
fa_square_google_plus
fa_square_h
fa_square_hacker_news
fa_square_js
fa_square_lastfm
fa_square_minus
fa_square_o
fa_square_odnoklassniki
fa_square_parking
fa_square_pen
fa_square_phone
fa_square_phone_flip
fa_square_pinterest
fa_square_plus
fa_square_poll_horizontal
fa_square_poll_vertical
fa_square_reddit
fa_square_root_variable
fa_square_rss
fa_square_share_nodes
fa_square_snapchat
fa_square_steam
fa_square_tumblr
fa_square_twitter
fa_square_up_right
fa_square_viadeo
fa_square_vimeo
fa_square_whatsapp
fa_square_xing
fa_square_xmark
fa_square_youtube
fa_squarespace
fa_stack_exchange
fa_stack_overflow
fa_stackpath
fa_stamp
fa_star
fa_star_and_crescent
fa_star_half
fa_star_half_empty
fa_star_half_full
fa_star_half_o
fa_star_half_stroke
fa_star_o
fa_star_of_david
fa_star_of_life
fa_staylinked
fa_steam
fa_steam_square
fa_steam_symbol
fa_step_backward
fa_step_forward
fa_sterling_sign
fa_stethoscope
fa_sticker_mule
fa_sticky_note
fa_sticky_note_o
fa_stop
fa_stop_circle
fa_stop_circle_o
fa_stopwatch
fa_store
fa_strava
fa_street_view
fa_strikethrough
fa_stripe
fa_stripe_s
fa_stroopwafel
fa_studiovinari
fa_stumbleupon
fa_stumbleupon_circle
fa_subscript
fa_subway
fa_suitcase
fa_suitcase_medical
fa_suitcase_rolling
fa_sun
fa_sun_o
fa_superpowers
fa_superscript
fa_supple
fa_support
fa_suse
fa_swatchbook
fa_swift
fa_symfony
fa_synagogue
fa_syringe
fa_table
fa_table_cells
fa_table_cells_large
fa_table_columns
fa_table_list
fa_table_tennis_paddle_ball
fa_tablet
fa_tablet_button
fa_tablet_screen_button
fa_tablets
fa_tachograph_digital
fa_tachometer
fa_tag
fa_tags
fa_tape
fa_tasks
fa_taxi
fa_teamspeak
fa_teeth
fa_teeth_open
fa_telegram
fa_television
fa_temperature_empty
fa_temperature_full
fa_temperature_half
fa_temperature_high
fa_temperature_low
fa_temperature_quarter
fa_temperature_three_quarters
fa_tencent_weibo
fa_tenge_sign
fa_terminal
fa_text_height
fa_text_slash
fa_text_width
fa_th
fa_th_large
fa_th_list
fa_the_red_yeti
fa_themeco
fa_themeisle
fa_thermometer
fa_thermometer_0
fa_thermometer_1
fa_thermometer_2
fa_thermometer_3
fa_thermometer_4
fa_thermometer_alt
fa_thermometer_empty
fa_thermometer_full
fa_thermometer_half
fa_thermometer_quarter
fa_thermometer_three_quarters
fa_think_peaks
fa_thumb_tack
fa_thumbs_down
fa_thumbs_o_down
fa_thumbs_o_up
fa_thumbs_up
fa_thumbtack
fa_ticket
fa_ticket_simple
fa_times
fa_times_circle
fa_times_circle_o
fa_times_rectangle
fa_times_rectangle_o
fa_tint
fa_toggle_down
fa_toggle_left
fa_toggle_off
fa_toggle_on
fa_toggle_right
fa_toggle_up
fa_toilet
fa_toilet_paper
fa_toolbox
fa_tooth
fa_torii_gate
fa_tornado
fa_tower_broadcast
fa_tractor
fa_trade_federation
fa_trademark
fa_traffic_light
fa_train
fa_train_subway
fa_transgender
fa_transgender_alt
fa_trash
fa_trash_arrow_up
fa_trash_can
fa_trash_can_arrow_up
fa_trash_o
fa_tree
fa_trello
fa_triangle_exclamation
fa_tripadvisor
fa_trophy
fa_truck
fa_truck_fast
fa_truck_medical
fa_truck_monster
fa_truck_moving
fa_truck_pickup
fa_truck_ramp_box
fa_try
fa_tty
fa_tumblr
fa_tumblr_square
fa_turkish_lira
fa_turn_down
fa_turn_up
fa_tv
fa_twitch
fa_twitter
fa_twitter_square
fa_typo3
fa_uber
fa_ubuntu
fa_uikit
fa_umbraco
fa_umbrella
fa_umbrella_beach
fa_underline
fa_undo
fa_uniregistry
fa_universal_access
fa_university
fa_unlink
fa_unlock
fa_unlock_alt
fa_unlock_keyhole
fa_unsorted
fa_untappd
fa_up_down
fa_up_down_left_right
fa_up_right_and_down_left_from_center
fa_up_right_from_square
fa_upload
fa_ups
fa_usb
fa_usd
fa_user
fa_user_astronaut
fa_user_check
fa_user_circle
fa_user_circle_o
fa_user_clock
fa_user_doctor
fa_user_gear
fa_user_graduate
fa_user_group
fa_user_injured
fa_user_large
fa_user_large_slash
fa_user_lock
fa_user_md
fa_user_minus
fa_user_ninja
fa_user_nurse
fa_user_o
fa_user_pen
fa_user_plus
fa_user_secret
fa_user_shield
fa_user_slash
fa_user_tag
fa_user_tie
fa_user_times
fa_user_xmark
fa_users
fa_users_gear
fa_usps
fa_ussunnah
fa_utensils
fa_vaadin
fa_van_shuttle
fa_vcard
fa_vcard_o
fa_vector_square
fa_venus
fa_venus_double
fa_venus_mars
fa_viacoin
fa_viadeo
fa_viadeo_square
fa_vial
fa_vials
fa_viber
fa_video
fa_video_camera
fa_video_slash
fa_vihara
fa_vimeo
fa_vimeo_square
fa_vimeo_v
fa_vine
fa_vk
fa_vnv
fa_voicemail
fa_volcano
fa_volleyball
fa_volume_control_phone
fa_volume_down
fa_volume_high
fa_volume_low
fa_volume_off
fa_volume_up
fa_volume_xmark
fa_vr_cardboard
fa_vuejs
fa_walkie_talkie
fa_wallet
fa_wand_magic
fa_wand_sparkles
fa_warehouse
fa_warning
fa_water
fa_water_ladder
fa_wave_square
fa_waze
fa_wechat
fa_weebly
fa_weibo
fa_weight_hanging
fa_weight_scale
fa_weixin
fa_whatsapp
fa_wheelchair
fa_wheelchair_alt
fa_whiskey_glass
fa_whmcs
fa_wifi
fa_wikipedia_w
fa_wind
fa_window_close
fa_window_close_o
fa_window_maximize
fa_window_minimize
fa_window_restore
fa_windows
fa_wine_bottle
fa_wine_glass
fa_wine_glass_empty
fa_wix
fa_wizards_of_the_coast
fa_wolf_pack_battalion
fa_won
fa_won_sign
fa_wordpress
fa_wordpress_simple
fa_wpbeginner
fa_wpexplorer
fa_wpforms
fa_wpressr
fa_wrench
fa_x_ray
fa_xbox
fa_xing
fa_xing_square
fa_xmark
fa_y_combinator
fa_y_combinator_square
fa_yahoo
fa_yammer
fa_yandex
fa_yandex_international
fa_yarn
fa_yc
fa_yc_square
fa_yelp
fa_yen
fa_yen_sign
fa_yin_yang
fa_yoast
fa_youtube
fa_youtube_play
fa_youtube_square
fa_zhihu
fae_apple_fruit
fae_atom
fae_bacteria
fae_banana
fae_bath
fae_bed
fae_benzene
fae_bigger
fae_biohazard
fae_blogger_circle
fae_blogger_square
fae_bones
fae_book_open
fae_book_open_o
fae_brain
fae_bread
fae_butterfly
fae_carot
fae_cc_by
fae_cc_cc
fae_cc_nc
fae_cc_nc_eu
fae_cc_nc_jp
fae_cc_nd
fae_cc_remix
fae_cc_sa
fae_cc_share
fae_cc_zero
fae_checklist_o
fae_cheese
fae_cherry
fae_chess_bishop
fae_chess_horse
fae_chess_king
fae_chess_pawn
fae_chess_queen
fae_chess_tower
fae_chicken_thigh
fae_chilli
fae_chip
fae_cicling
fae_cloud
fae_cockroach
fae_coffe_beans
fae_coins
fae_comb
fae_comet
fae_crown
fae_cup_coffe
fae_dice
fae_disco
fae_dna
fae_donut
fae_dress
fae_drop
fae_ello
fae_envelope_open
fae_envelope_open_o
fae_equal
fae_equal_bigger
fae_feedly
fae_file_export
fae_file_import
fae_fingerprint
fae_floppy
fae_footprint
fae_freecodecamp
fae_galaxy
fae_galery
fae_gift_card
fae_glass
fae_google_drive
fae_google_play
fae_gps
fae_grav
fae_guitar
fae_gut
fae_halter
fae_hamburger
fae_hat
fae_hexagon
fae_high_heel
fae_hotdog
fae_ice_cream
fae_id_card
fae_imdb
fae_infinity
fae_injection
fae_isle
fae_java
fae_layers
fae_lips
fae_lipstick
fae_liver
fae_lollipop
fae_loyalty_card
fae_lung
fae_makeup_brushes
fae_maximize
fae_meat
fae_medicine
fae_microscope
fae_milk_bottle
fae_minimize
fae_molecule
fae_moon_cloud
fae_mountains
fae_mushroom
fae_mustache
fae_mysql
fae_nintendo
fae_orange
fae_palette_color
fae_peach
fae_pear
fae_pi
fae_pizza
fae_planet
fae_plant
fae_playstation
fae_poison
fae_popcorn
fae_popsicle
fae_pulse
fae_python
fae_quora_circle
fae_quora_square
fae_radioactive
fae_raining
fae_real_heart
fae_refrigerator
fae_restore
fae_ring
fae_ruby
fae_ruby_o
fae_ruler
fae_shirt
fae_slash
fae_smaller
fae_snowing
fae_soda
fae_sofa
fae_soup
fae_spermatozoon
fae_spin_double
fae_stomach
fae_storm
fae_sun_cloud
fae_sushi
fae_tacos
fae_telegram
fae_telegram_circle
fae_telescope
fae_thermometer
fae_thermometer_high
fae_thermometer_low
fae_thin_close
fae_toilet
fae_tools
fae_tooth
fae_tree
fae_triangle_ruler
fae_umbrella
fae_uterus
fae_virus
fae_w3c
fae_walking
fae_wallet
fae_wind
fae_xbox
iec_power
iec_power_off
iec_power_on
iec_sleep_mode
iec_toggle_power
indent_dotted_guide
indent_line
indentation_line
linux_almalinux
linux_alpine
linux_aosc
linux_apple
linux_archcraft
linux_archlabs
linux_archlinux
linux_arcolinux
linux_arduino
linux_artix
linux_awesome
linux_biglinux
linux_bspwm
linux_budgie
linux_centos
linux_cinnamon
linux_codeberg
linux_coreos
linux_crystal
linux_debian
linux_deepin
linux_devuan
linux_docker
linux_dwm
linux_elementary
linux_endeavour
linux_enlightenment
linux_fdroid
linux_fedora
linux_fedora_inverse
linux_ferris
linux_flathub
linux_fluxbox
linux_forgejo
linux_fosdem
linux_freebsd
linux_freecad
linux_freedesktop
linux_garuda
linux_gentoo
linux_gimp
linux_gitea
linux_gnome
linux_gnu_guix
linux_gtk
linux_hyperbola
linux_hyprland
linux_i3
linux_illumos
linux_inkscape
linux_jwm
linux_kali_linux
linux_kde
linux_kde_neon
linux_kde_plasma
linux_kdenlive
linux_kicad
linux_krita
linux_kubuntu
linux_kubuntu_inverse
linux_leap
linux_libreoffice
linux_libreofficebase
linux_libreofficecalc
linux_libreofficedraw
linux_libreofficeimpress
linux_libreofficemath
linux_libreofficewriter
linux_linuxmint
linux_linuxmint_inverse
linux_locos
linux_lxde
linux_lxle
linux_lxqt
linux_mageia
linux_mandriva
linux_manjaro
linux_mate
linux_mpv
linux_mxlinux
linux_neovim
linux_nixos
linux_nobara
linux_octoprint
linux_openbsd
linux_openscad
linux_opensuse
linux_osh
linux_oshwa
linux_osi
linux_parabola
linux_parrot
linux_pop_os
linux_postmarketos
linux_prusaslicer
linux_puppy
linux_qt
linux_qtile
linux_qubesos
linux_raspberry_pi
linux_redhat
linux_reprap
linux_riscv
linux_river
linux_rocky_linux
linux_sabayon
linux_slackware
linux_slackware_inverse
linux_snappy
linux_solus
linux_sway
linux_tails
linux_thunderbird
linux_tor
linux_trisquel
linux_tumbleweed
linux_tux
linux_typst
linux_ubuntu
linux_ubuntu_inverse
linux_vanilla
linux_void
linux_vscodium
linux_wayland
linux_wikimedia
linux_xerolinux
linux_xfce
linux_xmonad
linux_xorg
linux_zorin
󰇉md_ab_testing
󱛠md_abacus
󱌨md_abjad_arabic
󱌩md_abjad_hebrew
󱌪md_abugida_devanagari
󱌫md_abugida_thai
󰀃md_access_point
󱔸md_access_point_check
󱔹md_access_point_minus
󰀂md_access_point_network
󰯡md_access_point_network_off
󱔑md_access_point_off
󱔺md_access_point_plus
󱔻md_access_point_remove
󰀄md_account
󰀅md_account_alert
󰭐md_account_alert_outline
󱡨md_account_arrow_down
󱡩md_account_arrow_down_outline
󰭑md_account_arrow_left
󰭒md_account_arrow_left_outline
󰭓md_account_arrow_right
󰭔md_account_arrow_right_outline
󱡧md_account_arrow_up
󱡪md_account_arrow_up_outline
󰀆md_account_box
󰤴md_account_box_multiple
󱀊md_account_box_multiple_outline
󰀇md_account_box_outline
󱋟md_account_cancel
󱋠md_account_cancel_outline
󱂗md_account_cash
󱂘md_account_cash_outline
󰀈md_account_check
󰯢md_account_check_outline
󰪉md_account_child
󰪊md_account_child_circle
󱃈md_account_child_outline
󰀉md_account_circle
󰭕md_account_circle_outline
󰭖md_account_clock
󰭗md_account_clock_outline
󱍰md_account_cog
󱍱md_account_cog_outline
󰀊md_account_convert
󱌁md_account_convert_outline
󰺛md_account_cowboy_hat
󱟳md_account_cowboy_hat_outline
󰘱md_account_details
󱍲md_account_details_outline
󰚼md_account_edit
󰿻md_account_edit_outline
󰐠md_account_eye
󱉻md_account_eye_outline
󰤶md_account_filter
󰾝md_account_filter_outline
󰡉md_account_group
󰭘md_account_group_outline
󰖵md_account_hard_hat
󱨟md_account_hard_hat_outline
󰢙md_account_heart
󰯣md_account_heart_outline
󱠕md_account_injury
󱠖md_account_injury_outline
󰀋md_account_key
󰯤md_account_key_outline
󱅞md_account_lock
󱥠md_account_lock_open
󱥡md_account_lock_open_outline
󱅟md_account_lock_outline
󰀍md_account_minus
󰫬md_account_minus_outline
󰀎md_account_multiple
󰣅md_account_multiple_check
󱇾md_account_multiple_check_outline
󰗓md_account_multiple_minus
󰯥md_account_multiple_minus_outline
󰀏md_account_multiple_outline
󰀐md_account_multiple_plus
󰠀md_account_multiple_plus_outline
󱈊md_account_multiple_remove
󱈋md_account_multiple_remove_outline
󰠃md_account_music
󰳩md_account_music_outline
󰀑md_account_network
󰯦md_account_network_outline
󰀒md_account_off
󰯧md_account_off_outline
󰀓md_account_outline
󰀔md_account_plus
󰠁md_account_plus_outline
󰭙md_account_question
󰭚md_account_question_outline
󱔫md_account_reactivate
󱔬md_account_reactivate_outline
󰀕md_account_remove
󰫭md_account_remove_outline
󱨠md_account_school
󱨡md_account_school_outline
󰀖md_account_search
󰤵md_account_search_outline
󰘰md_account_settings
󱃉md_account_settings_outline
󰀗md_account_star
󰯨md_account_star_outline
󰪋md_account_supervisor
󰪌md_account_supervisor_circle
󱓬md_account_supervisor_circle_outline
󱄭md_account_supervisor_outline
󰀙md_account_switch
󰓋md_account_switch_outline
󱤛md_account_sync
󱤜md_account_sync_outline
󰳣md_account_tie
󱢘md_account_tie_hat
󱢙md_account_tie_hat_outline
󱃊md_account_tie_outline
󱌈md_account_tie_voice
󱌊md_account_tie_voice_off
󱌋md_account_tie_voice_off_outline
󱌉md_account_tie_voice_outline
󱪌md_account_tie_woman
󰗋md_account_voice
󰻔md_account_voice_off
󱢚md_account_wrench
󱢛md_account_wrench_outline
󰀚md_adjust
󱤪md_advertisements
󱤫md_advertisements_off
󰀛md_air_conditioner
󰵃md_air_filter
󰶬md_air_horn
󱂙md_air_humidifier
󱑦md_air_humidifier_off
󰵄md_air_purifier
󰯩md_airbag
󰀜md_airballoon
󱀋md_airballoon_outline
󰀝md_airplane
󱡺md_airplane_alert
󱡻md_airplane_check
󱡼md_airplane_clock
󱡽md_airplane_cog
󱡾md_airplane_edit
󰗔md_airplane_landing
󱡿md_airplane_marker
󱢀md_airplane_minus
󰀞md_airplane_off
󱢁md_airplane_plus
󱢂md_airplane_remove
󱢃md_airplane_search
󱢄md_airplane_settings
󰗕md_airplane_takeoff
󰡋md_airport
󰀠md_alarm
󰞎md_alarm_bell
󰀡md_alarm_check
󰞏md_alarm_light
󱜞md_alarm_light_off
󱜟md_alarm_light_off_outline
󰯪md_alarm_light_outline
󰀢md_alarm_multiple
󰹱md_alarm_note
󰹲md_alarm_note_off
󰀣md_alarm_off
󱗄md_alarm_panel
󱗅md_alarm_panel_outline
󰀤md_alarm_plus
󰚎md_alarm_snooze
󰀥md_album
󰀦md_alert
󰀧md_alert_box
󰳤md_alert_box_outline
󰀨md_alert_circle
󱇭md_alert_circle_check
󱇮md_alert_circle_check_outline
󰗖md_alert_circle_outline
󰚽md_alert_decagram
󰳥md_alert_decagram_outline
󱒻md_alert_minus
󱒾md_alert_minus_outline
󰀩md_alert_octagon
󰳦md_alert_octagon_outline
󰝧md_alert_octagram
󰳧md_alert_octagram_outline
󰀪md_alert_outline
󱒺md_alert_plus
󱒽md_alert_plus_outline
󱒼md_alert_remove
󱒿md_alert_remove_outline
󱇎md_alert_rhombus
󱇏md_alert_rhombus_outline
󰢚md_alien
󱃋md_alien_outline
󱇃md_align_horizontal_center
󱥢md_align_horizontal_distribute
󱇂md_align_horizontal_left
󱇄md_align_horizontal_right
󱇅md_align_vertical_bottom
󱇆md_align_vertical_center
󱥣md_align_vertical_distribute
󱇇md_align_vertical_top
󰚾md_all_inclusive
󱢍md_all_inclusive_box
󱢎md_all_inclusive_box_outline
󱉘md_allergy
󰀫md_alpha
󰫮md_alpha_a
󰬈md_alpha_a_box
󰯫md_alpha_a_box_outline
󰯬md_alpha_a_circle
󰯭md_alpha_a_circle_outline
󰫯md_alpha_b
󰬉md_alpha_b_box
󰯮md_alpha_b_box_outline
󰯯md_alpha_b_circle
󰯰md_alpha_b_circle_outline
󰫰md_alpha_c
󰬊md_alpha_c_box
󰯱md_alpha_c_box_outline
󰯲md_alpha_c_circle
󰯳md_alpha_c_circle_outline
󰫱md_alpha_d
󰬋md_alpha_d_box
󰯴md_alpha_d_box_outline
󰯵md_alpha_d_circle
󰯶md_alpha_d_circle_outline
󰫲md_alpha_e
󰬌md_alpha_e_box
󰯷md_alpha_e_box_outline
󰯸md_alpha_e_circle
󰯹md_alpha_e_circle_outline
󰫳md_alpha_f
󰬍md_alpha_f_box
󰯺md_alpha_f_box_outline
󰯻md_alpha_f_circle
󰯼md_alpha_f_circle_outline
󰫴md_alpha_g
󰬎md_alpha_g_box
󰯽md_alpha_g_box_outline
󰯾md_alpha_g_circle
󰯿md_alpha_g_circle_outline
󰫵md_alpha_h
󰬏md_alpha_h_box
󰰀md_alpha_h_box_outline
󰰁md_alpha_h_circle
󰰂md_alpha_h_circle_outline
󰫶md_alpha_i
󰬐md_alpha_i_box
󰰃md_alpha_i_box_outline
󰰄md_alpha_i_circle
󰰅md_alpha_i_circle_outline
󰫷md_alpha_j
󰬑md_alpha_j_box
󰰆md_alpha_j_box_outline
󰰇md_alpha_j_circle
󰰈md_alpha_j_circle_outline
󰫸md_alpha_k
󰬒md_alpha_k_box
󰰉md_alpha_k_box_outline
󰰊md_alpha_k_circle
󰰋md_alpha_k_circle_outline
󰫹md_alpha_l
󰬓md_alpha_l_box
󰰌md_alpha_l_box_outline
󰰍md_alpha_l_circle
󰰎md_alpha_l_circle_outline
󰫺md_alpha_m
󰬔md_alpha_m_box
󰰏md_alpha_m_box_outline
󰰐md_alpha_m_circle
󰰑md_alpha_m_circle_outline
󰫻md_alpha_n
󰬕md_alpha_n_box
󰰒md_alpha_n_box_outline
󰰓md_alpha_n_circle
󰰔md_alpha_n_circle_outline
󰫼md_alpha_o
󰬖md_alpha_o_box
󰰕md_alpha_o_box_outline
󰰖md_alpha_o_circle
󰰗md_alpha_o_circle_outline
󰫽md_alpha_p
󰬗md_alpha_p_box
󰰘md_alpha_p_box_outline
󰰙md_alpha_p_circle
󰰚md_alpha_p_circle_outline
󰫾md_alpha_q
󰬘md_alpha_q_box
󰰛md_alpha_q_box_outline
󰰜md_alpha_q_circle
󰰝md_alpha_q_circle_outline
󰫿md_alpha_r
󰬙md_alpha_r_box
󰰞md_alpha_r_box_outline
󰰟md_alpha_r_circle
󰰠md_alpha_r_circle_outline
󰬀md_alpha_s
󰬚md_alpha_s_box
󰰡md_alpha_s_box_outline
󰰢md_alpha_s_circle
󰰣md_alpha_s_circle_outline
󰬁md_alpha_t
󰬛md_alpha_t_box
󰰤md_alpha_t_box_outline
󰰥md_alpha_t_circle
󰰦md_alpha_t_circle_outline
󰬂md_alpha_u
󰬜md_alpha_u_box
󰰧md_alpha_u_box_outline
󰰨md_alpha_u_circle
󰰩md_alpha_u_circle_outline
󰬃md_alpha_v
󰬝md_alpha_v_box
󰰪md_alpha_v_box_outline
󰰫md_alpha_v_circle
󰰬md_alpha_v_circle_outline
󰬄md_alpha_w
󰬞md_alpha_w_box
󰰭md_alpha_w_box_outline
󰰮md_alpha_w_circle
󰰯md_alpha_w_circle_outline
󰬅md_alpha_x
󰬟md_alpha_x_box
󰰰md_alpha_x_box_outline
󰰱md_alpha_x_circle
󰰲md_alpha_x_circle_outline
󰬆md_alpha_y
󰬠md_alpha_y_box
󰰳md_alpha_y_box_outline
󰰴md_alpha_y_circle
󰰵md_alpha_y_circle_outline
󰬇md_alpha_z
󰬡md_alpha_z_box
󰰶md_alpha_z_box_outline
󰰷md_alpha_z_circle
󰰸md_alpha_z_circle_outline
󱌬md_alphabet_aurebesh
󱌭md_alphabet_cyrillic
󱌮md_alphabet_greek
󱌯md_alphabet_latin
󱌰md_alphabet_piqad
󱌷md_alphabet_tengwar
󰀬md_alphabetical
󱀌md_alphabetical_off
󱀍md_alphabetical_variant
󱀎md_alphabetical_variant_off
󰗗md_altimeter
󰀯md_ambulance
󰳨md_ammunition
󰪍md_ampersand
󰀰md_amplifier
󱆵md_amplifier_off
󰀱md_anchor
󰀲md_android
󰵅md_android_messages
󰀴md_android_studio
󰤷md_angle_acute
󰤸md_angle_obtuse
󰤹md_angle_right
󰚲md_angular
󰚿md_angularjs
󰗘md_animation
󰪏md_animation_outline
󰤺md_animation_play
󰪐md_animation_play_outline
󱂚md_ansible
󱄙md_antenna
󰢛md_anvil
󱀏md_apache_kafka
󱂛md_api
󱉗md_api_off
󰀵md_apple
󰀶md_apple_finder
󰀸md_apple_icloud
󰀷md_apple_ios
󰘲md_apple_keyboard_caps
󰘳md_apple_keyboard_command
󰘴md_apple_keyboard_control
󰘵md_apple_keyboard_option
󰘶md_apple_keyboard_shift
󰀹md_apple_safari
󰣆md_application
󱃵md_application_array
󱃶md_application_array_outline
󱃷md_application_braces
󱃸md_application_braces_outline
󰲋md_application_brackets
󰲌md_application_brackets_outline
󰙵md_application_cog
󱕷md_application_cog_outline
󰂮md_application_edit
󰘙md_application_edit_outline
󰶭md_application_export
󰶮md_application_import
󰘔md_application_outline
󱃹md_application_parentheses
󱃺md_application_parentheses_outline
󰭠md_application_settings
󱕕md_application_settings_outline
󱃻md_application_variable
󱃼md_application_variable_outline
󰾞md_approximately_equal
󰾟md_approximately_equal_box
󰀻md_apps
󰵆md_apps_box
󰣇md_arch
󰀼md_archive
󱓽md_archive_alert
󱓾md_archive_alert_outline
󱉙md_archive_arrow_down
󱉚md_archive_arrow_down_outline
󱉛md_archive_arrow_up
󱉜md_archive_arrow_up_outline
󱝋md_archive_cancel
󱝌md_archive_cancel_outline
󱝍md_archive_check
󱝎md_archive_check_outline
󱝏md_archive_clock
󱝐md_archive_clock_outline
󱝑md_archive_cog
󱝒md_archive_cog_outline
󱝓md_archive_edit
󱝔md_archive_edit_outline
󱝕md_archive_eye
󱝖md_archive_eye_outline
󱝗md_archive_lock
󱝘md_archive_lock_open
󱝙md_archive_lock_open_outline
󱝚md_archive_lock_outline
󱝛md_archive_marker
󱝜md_archive_marker_outline
󱝝md_archive_minus
󱝞md_archive_minus_outline
󱝟md_archive_music
󱝠md_archive_music_outline
󱝡md_archive_off
󱝢md_archive_off_outline
󱈎md_archive_outline
󱝣md_archive_plus
󱝤md_archive_plus_outline
󱝥md_archive_refresh
󱝦md_archive_refresh_outline
󱝧md_archive_remove
󱝨md_archive_remove_outline
󱝩md_archive_search
󱝪md_archive_search_outline
󱝫md_archive_settings
󱝬md_archive_settings_outline
󱝭md_archive_star
󱝮md_archive_star_outline
󱝯md_archive_sync
󱝰md_archive_sync_outline
󰿗md_arm_flex
󰿖md_arm_flex_outline
󰀽md_arrange_bring_forward
󰀾md_arrange_bring_to_front
󰀿md_arrange_send_backward
󰁀md_arrange_send_to_back
󰁁md_arrow_all
󰁂md_arrow_bottom_left
󱥤md_arrow_bottom_left_bold_box
󱥥md_arrow_bottom_left_bold_box_outline
󰦷md_arrow_bottom_left_bold_outline
󰦸md_arrow_bottom_left_thick
󱦶md_arrow_bottom_left_thin
󱖖md_arrow_bottom_left_thin_circle_outline
󰁃md_arrow_bottom_right
󱥦md_arrow_bottom_right_bold_box
󱥧md_arrow_bottom_right_bold_box_outline
󰦹md_arrow_bottom_right_bold_outline
󰦺md_arrow_bottom_right_thick
󱦷md_arrow_bottom_right_thin
󱖕md_arrow_bottom_right_thin_circle_outline
󰘕md_arrow_collapse
󰁄md_arrow_collapse_all
󰞒md_arrow_collapse_down
󰡌md_arrow_collapse_horizontal
󰞓md_arrow_collapse_left
󰞔md_arrow_collapse_right
󰞕md_arrow_collapse_up
󰡍md_arrow_collapse_vertical
󰦻md_arrow_decision
󰦼md_arrow_decision_auto
󰦽md_arrow_decision_auto_outline
󰦾md_arrow_decision_outline
󰁅md_arrow_down
󰜮md_arrow_down_bold
󰜯md_arrow_down_bold_box
󰜰md_arrow_down_bold_box_outline
󰁇md_arrow_down_bold_circle
󰁈md_arrow_down_bold_circle_outline
󰁉md_arrow_down_bold_hexagon_outline
󰦿md_arrow_down_bold_outline
󰛀md_arrow_down_box
󰳛md_arrow_down_circle
󰳜md_arrow_down_circle_outline
󰁊md_arrow_down_drop_circle
󰁋md_arrow_down_drop_circle_outline
󱞡md_arrow_down_left
󱞢md_arrow_down_left_bold
󱞣md_arrow_down_right
󱞤md_arrow_down_right_bold
󰁆md_arrow_down_thick
󱦳md_arrow_down_thin
󱖙md_arrow_down_thin_circle_outline
󰘖md_arrow_expand
󰁌md_arrow_expand_all
󰞖md_arrow_expand_down
󰡎md_arrow_expand_horizontal
󰞗md_arrow_expand_left
󰞘md_arrow_expand_right
󰞙md_arrow_expand_up
󰡏md_arrow_expand_vertical
󱅛md_arrow_horizontal_lock
󰁍md_arrow_left
󰜱md_arrow_left_bold
󰜲md_arrow_left_bold_box
󰜳md_arrow_left_bold_box_outline
󰁏md_arrow_left_bold_circle
󰁐md_arrow_left_bold_circle_outline
󰁑md_arrow_left_bold_hexagon_outline
󰧀md_arrow_left_bold_outline
󱞥md_arrow_left_bottom
󱞦md_arrow_left_bottom_bold
󰛁md_arrow_left_box
󰳝md_arrow_left_circle
󰳞md_arrow_left_circle_outline
󰁒md_arrow_left_drop_circle
󰁓md_arrow_left_drop_circle_outline
󰹳md_arrow_left_right
󰹴md_arrow_left_right_bold
󰧁md_arrow_left_right_bold_outline
󰁎md_arrow_left_thick
󱦱md_arrow_left_thin
󱖚md_arrow_left_thin_circle_outline
󱞧md_arrow_left_top
󱞨md_arrow_left_top_bold
󱡀md_arrow_projectile
󱠿md_arrow_projectile_multiple
󰁔md_arrow_right
󰜴md_arrow_right_bold
󰜵md_arrow_right_bold_box
󰜶md_arrow_right_bold_box_outline
󰁖md_arrow_right_bold_circle
󰁗md_arrow_right_bold_circle_outline
󰁘md_arrow_right_bold_hexagon_outline
󰧂md_arrow_right_bold_outline
󱞩md_arrow_right_bottom
󱞪md_arrow_right_bottom_bold
󰛂md_arrow_right_box
󰳟md_arrow_right_circle
󰳠md_arrow_right_circle_outline
󰁙md_arrow_right_drop_circle
󰁚md_arrow_right_drop_circle_outline
󰁕md_arrow_right_thick
󱦰md_arrow_right_thin
󱖘md_arrow_right_thin_circle_outline
󱞫md_arrow_right_top
󱞬md_arrow_right_top_bold
󰤻md_arrow_split_horizontal
󰤼md_arrow_split_vertical
󰁛md_arrow_top_left
󱥨md_arrow_top_left_bold_box
󱥩md_arrow_top_left_bold_box_outline
󰧃md_arrow_top_left_bold_outline
󰹵md_arrow_top_left_bottom_right
󰹶md_arrow_top_left_bottom_right_bold
󰧄md_arrow_top_left_thick
󱦵md_arrow_top_left_thin
󱖓md_arrow_top_left_thin_circle_outline
󰁜md_arrow_top_right
󱥪md_arrow_top_right_bold_box
󱥫md_arrow_top_right_bold_box_outline
󰧅md_arrow_top_right_bold_outline
󰹷md_arrow_top_right_bottom_left
󰹸md_arrow_top_right_bottom_left_bold
󰧆md_arrow_top_right_thick
󱦴md_arrow_top_right_thin
󱖔md_arrow_top_right_thin_circle_outline
󱞭md_arrow_u_down_left
󱞮md_arrow_u_down_left_bold
󱞯md_arrow_u_down_right
󱞰md_arrow_u_down_right_bold
󱞱md_arrow_u_left_bottom
󱞲md_arrow_u_left_bottom_bold
󱞳md_arrow_u_left_top
󱞴md_arrow_u_left_top_bold
󱞵md_arrow_u_right_bottom
󱞶md_arrow_u_right_bottom_bold
󱞷md_arrow_u_right_top
󱞸md_arrow_u_right_top_bold
󱞹md_arrow_u_up_left
󱞺md_arrow_u_up_left_bold
󱞻md_arrow_u_up_right
󱞼md_arrow_u_up_right_bold
󰁝md_arrow_up
󰜷md_arrow_up_bold
󰜸md_arrow_up_bold_box
󰜹md_arrow_up_bold_box_outline
󰁟md_arrow_up_bold_circle
󰁠md_arrow_up_bold_circle_outline
󰁡md_arrow_up_bold_hexagon_outline
󰧇md_arrow_up_bold_outline
󰛃md_arrow_up_box
󰳡md_arrow_up_circle
󰳢md_arrow_up_circle_outline
󰹹md_arrow_up_down
󰹺md_arrow_up_down_bold
󰧈md_arrow_up_down_bold_outline
󰁢md_arrow_up_drop_circle
󰁣md_arrow_up_drop_circle_outline
󱞽md_arrow_up_left
󱞾md_arrow_up_left_bold
󱞿md_arrow_up_right
󱟀md_arrow_up_right_bold
󰁞md_arrow_up_thick
󱦲md_arrow_up_thin
󱖗md_arrow_up_thin_circle_outline
󱅜md_arrow_vertical_lock
󰭛md_artstation
󰨤md_aspect_ratio
󰁤md_assistant
󰛄md_asterisk
󱨧md_asterisk_circle_outline
󰁥md_at
󰠄md_atlassian
󰵇md_atm
󰝨md_atom
󰹻md_atom_variant
󰁦md_attachment
󱫁md_attachment_check
󱧄md_attachment_lock
󱫂md_attachment_minus
󱫃md_attachment_off
󱫄md_attachment_plus
󱫅md_attachment_remove
󱡫md_audio_input_rca
󱡬md_audio_input_stereo_minijack
󱡭md_audio_input_xlr
󰤽md_audio_video
󱆶md_audio_video_off
󰡐md_augmented_reality
󱍾md_auto_download
󰁨md_auto_fix
󰁩md_auto_upload
󰁪md_autorenew
󱧧md_autorenew_off
󰁫md_av_timer
󰸏md_aws
󰣈md_axe
󱡂md_axe_battle
󰵈md_axis
󰵉md_axis_arrow
󱐎md_axis_arrow_info
󰵊md_axis_arrow_lock
󰵋md_axis_lock
󰵌md_axis_x_arrow
󰵍md_axis_x_arrow_lock
󰵎md_axis_x_rotate_clockwise
󰵏md_axis_x_rotate_counterclockwise
󰵐md_axis_x_y_arrow_lock
󰵑md_axis_y_arrow
󰵒md_axis_y_arrow_lock
󰵓md_axis_y_rotate_clockwise
󰵔md_axis_y_rotate_counterclockwise
󰵕md_axis_z_arrow
󰵖md_axis_z_arrow_lock
󰵗md_axis_z_rotate_clockwise
󰵘md_axis_z_rotate_counterclockwise
󰨥md_babel
󰁬md_baby
󰼹md_baby_bottle
󰼺md_baby_bottle_outline
󱏠md_baby_buggy
󰚏md_baby_carriage
󰾠md_baby_carriage_off
󰹼md_baby_face
󰹽md_baby_face_outline
󰁭md_backburger
󰁮md_backspace
󰭜md_backspace_outline
󰹾md_backspace_reverse
󰹿md_backspace_reverse_outline
󰁯md_backup_restore
󰻕md_bacteria
󰻖md_bacteria_outline
󰶧md_badge_account
󰶨md_badge_account_alert
󰶩md_badge_account_alert_outline
󰸍md_badge_account_horizontal
󰸎md_badge_account_horizontal_outline
󰶪md_badge_account_outline
󰡑md_badminton
󰼻md_bag_carry_on
󰵥md_bag_carry_on_check
󰼼md_bag_carry_on_off
󰼽md_bag_checked
󰸐md_bag_personal
󰸑md_bag_personal_off
󰸒md_bag_personal_off_outline
󰸓md_bag_personal_outline
󱖋md_bag_suitcase
󱖍md_bag_suitcase_off
󱖎md_bag_suitcase_off_outline
󱖌md_bag_suitcase_outline
󰼾md_baguette
󱠗md_balcony
󰨦md_balloon
󰧉md_ballot
󰧊md_ballot_outline
󰰹md_ballot_recount
󰰺md_ballot_recount_outline
󰶯md_bandage
󰁰md_bank
󱙕md_bank_check
󰶰md_bank_minus
󱙖md_bank_off
󱙗md_bank_off_outline
󰺀md_bank_outline
󰶱md_bank_plus
󰶲md_bank_remove
󰨧md_bank_transfer
󰨨md_bank_transfer_in
󰨩md_bank_transfer_out
󰁱md_barcode
󱈶md_barcode_off
󰁲md_barcode_scan
󰁳md_barley
󰭝md_barley_off
󰭞md_barn
󰁴md_barrel
󱨨md_barrel_outline
󰡒md_baseball
󰡓md_baseball_bat
󱗬md_baseball_diamond
󱗭md_baseball_diamond_outline
󱆃md_bash
󰁶md_basket
󱣥md_basket_check
󱣦md_basket_check_outline
󰁷md_basket_fill
󱔣md_basket_minus
󱔤md_basket_minus_outline
󱔥md_basket_off
󱔦md_basket_off_outline
󱆁md_basket_outline
󱔧md_basket_plus
󱔨md_basket_plus_outline
󱔩md_basket_remove
󱔪md_basket_remove_outline
󰁸md_basket_unfill
󰠆md_basketball
󰰻md_basketball_hoop
󰰼md_basketball_hoop_outline
󰭟md_bat
󱠘md_bathtub
󱠙md_bathtub_outline
󰁹md_battery
󰁺md_battery_10
󰤾md_battery_10_bluetooth
󰁻md_battery_20
󰤿md_battery_20_bluetooth
󰁼md_battery_30
󰥀md_battery_30_bluetooth
󰁽md_battery_40
󰥁md_battery_40_bluetooth
󰁾md_battery_50
󰥂md_battery_50_bluetooth
󰁿md_battery_60
󰥃md_battery_60_bluetooth
󰂀md_battery_70
󰥄md_battery_70_bluetooth
󰂁md_battery_80
󰥅md_battery_80_bluetooth
󰂂md_battery_90
󰥆md_battery_90_bluetooth
󰂃md_battery_alert
󰥇md_battery_alert_bluetooth
󱃌md_battery_alert_variant
󱃍md_battery_alert_variant_outline
󱟞md_battery_arrow_down
󱟟md_battery_arrow_down_outline
󱟠md_battery_arrow_up
󱟡md_battery_arrow_up_outline
󰥈md_battery_bluetooth
󰥉md_battery_bluetooth_variant
󰂄md_battery_charging
󰢜md_battery_charging_10
󰂆md_battery_charging_20
󰂇md_battery_charging_30
󰂈md_battery_charging_40
󰢝md_battery_charging_50
󰂉md_battery_charging_60
󰢞md_battery_charging_70
󰂊md_battery_charging_80
󰂋md_battery_charging_90
󰂅md_battery_charging_100
󱊦md_battery_charging_high
󱊤md_battery_charging_low
󱊥md_battery_charging_medium
󰢟md_battery_charging_outline
󰠇md_battery_charging_wireless
󰠈md_battery_charging_wireless_10
󰠉md_battery_charging_wireless_20
󰠊md_battery_charging_wireless_30
󰠋md_battery_charging_wireless_40
󰠌md_battery_charging_wireless_50
󰠍md_battery_charging_wireless_60
󰠎md_battery_charging_wireless_70
󰠏md_battery_charging_wireless_80
󰠐md_battery_charging_wireless_90
󰠑md_battery_charging_wireless_alert
󰠒md_battery_charging_wireless_outline
󱟢md_battery_check
󱟣md_battery_check_outline
󱧥md_battery_clock
󱧦md_battery_clock_outline
󱈏md_battery_heart
󱈐md_battery_heart_outline
󱈑md_battery_heart_variant
󱊣md_battery_high
󱞜md_battery_lock
󱞝md_battery_lock_open
󱊡md_battery_low
󱊢md_battery_medium
󱟤md_battery_minus
󱟥md_battery_minus_outline
󰂌md_battery_minus_variant
󰂍md_battery_negative
󱉝md_battery_off
󱉞md_battery_off_outline
󰂎md_battery_outline
󱟦md_battery_plus
󱟧md_battery_plus_outline
󰂏md_battery_plus_variant
󰂐md_battery_positive
󱟨md_battery_remove
󱟩md_battery_remove_outline
󱠴md_battery_sync
󱠵md_battery_sync_outline
󰂑md_battery_unknown
󰥊md_battery_unknown_bluetooth
󰂒md_beach
󰳪md_beaker
󱈩md_beaker_alert
󱈪md_beaker_alert_outline
󱈫md_beaker_check
󱈬md_beaker_check_outline
󱈭md_beaker_minus
󱈮md_beaker_minus_outline
󰚐md_beaker_outline
󱈯md_beaker_plus
󱈰md_beaker_plus_outline
󱈱md_beaker_question
󱈲md_beaker_question_outline
󱈳md_beaker_remove
󱈴md_beaker_remove_outline
󰋣md_bed
󰿔md_bed_double
󰿓md_bed_double_outline
󰢠md_bed_empty
󰿒md_bed_king
󰿑md_bed_king_outline
󰂙md_bed_outline
󰿐md_bed_queen
󰿛md_bed_queen_outline
󱁭md_bed_single
󱁮md_bed_single_outline
󰾡md_bee
󰾢md_bee_flower
󱏭md_beehive_off_outline
󱃎md_beehive_outline
󱓢md_beekeeper
󰂘md_beer
󱌌md_beer_outline
󰂚md_bell
󰵙md_bell_alert
󰺁md_bell_alert_outline
󱅫md_bell_badge
󰅸md_bell_badge_outline
󱏧md_bell_cancel
󱏨md_bell_cancel_outline
󱇥md_bell_check
󱇦md_bell_check_outline
󰵚md_bell_circle
󰵛md_bell_circle_outline
󱨩md_bell_cog
󱨪md_bell_cog_outline
󱏩md_bell_minus
󱏪md_bell_minus_outline
󰂛md_bell_off
󰪑md_bell_off_outline
󰂜md_bell_outline
󰂝md_bell_plus
󰪒md_bell_plus_outline
󱏫md_bell_remove
󱏬md_bell_remove_outline
󰂞md_bell_ring
󰂟md_bell_ring_outline
󰂠md_bell_sleep
󰪓md_bell_sleep_outline
󰂡md_beta
󰧋md_betamax
󰸔md_biathlon
󱂜md_bicycle
󱈵md_bicycle_basket
󱢜md_bicycle_cargo
󱖴md_bicycle_electric
󱗩md_bicycle_penny_farthing
󰂣md_bike
󱄟md_bike_fast
󱀐md_billboard
󰭡md_billiards
󰭢md_billiards_rack
󰂥md_binoculars
󰂦md_bio
󰂧md_biohazard
󱗆md_bird
󰂨md_bitbucket
󰠓md_bitcoin
󰂩md_black_mesa
󰳫md_blender
󱠚md_blender_outline
󰂫md_blender_software
󰂬md_blinds
󱨫md_blinds_horizontal
󱨬md_blinds_horizontal_closed
󱀑md_blinds_open
󱨭md_blinds_vertical
󱨮md_blinds_vertical_closed
󰂭md_block_helper
󰳬md_blood_bag
󰂯md_bluetooth
󰂰md_bluetooth_audio
󰂱md_bluetooth_connect
󰂲md_bluetooth_off
󰂳md_bluetooth_settings
󰂴md_bluetooth_transfer
󰂵md_blur
󰂶md_blur_linear
󰂷md_blur_off
󰂸md_blur_radial
󰶳md_bolt
󰚑md_bomb
󰛅md_bomb_off
󰂹md_bone
󱧠md_bone_off
󰂺md_book
󱎭md_book_account
󱎮md_book_account_outline
󱙼md_book_alert
󱙽md_book_alert_outline
󰘝md_book_alphabet
󱙾md_book_arrow_down
󱙿md_book_arrow_down_outline
󱚀md_book_arrow_left
󱚁md_book_arrow_left_outline
󱚂md_book_arrow_right
󱚃md_book_arrow_right_outline
󱚄md_book_arrow_up
󱚅md_book_arrow_up_outline
󱚆md_book_cancel
󱚇md_book_cancel_outline
󱓳md_book_check
󱓴md_book_check_outline
󱚈md_book_clock
󱚉md_book_clock_outline
󱚊md_book_cog
󱚋md_book_cog_outline
󰂢md_book_cross
󱚌md_book_edit
󱚍md_book_edit_outline
󱛉md_book_education
󱛊md_book_education_outline
󱨝md_book_heart
󱨞md_book_heart_outline
󱁯md_book_information_variant
󰞚md_book_lock
󰞛md_book_lock_open
󱚎md_book_lock_open_outline
󱚏md_book_lock_outline
󱚐md_book_marker
󱚑md_book_marker_outline
󰗙md_book_minus
󰪔md_book_minus_multiple
󰤋md_book_minus_multiple_outline
󱚒md_book_minus_outline
󰂻md_book_multiple
󰐶md_book_multiple_outline
󰁧md_book_music
󱚓md_book_music_outline
󱚔md_book_off
󱚕md_book_off_outline
󰂽md_book_open
󰂾md_book_open_blank_variant
󰭣md_book_open_outline
󰗚md_book_open_page_variant
󱗖md_book_open_page_variant_outline
󱓷md_book_open_variant
󰭤md_book_outline
󰺂md_book_play
󰺃md_book_play_outline
󰗛md_book_plus
󰪕md_book_plus_multiple
󰫞md_book_plus_multiple_outline
󱚖md_book_plus_outline
󱚗md_book_refresh
󱚘md_book_refresh_outline
󰪗md_book_remove
󰪖md_book_remove_multiple
󰓊md_book_remove_multiple_outline
󱚙md_book_remove_outline
󰺄md_book_search
󰺅md_book_search_outline
󱚚md_book_settings
󱚛md_book_settings_outline
󱚜md_book_sync
󱛈md_book_sync_outline
󰂿md_book_variant
󰂼md_book_variant_multiple
󰃀md_bookmark
󱥬md_bookmark_box_multiple
󱥭md_bookmark_box_multiple_outline
󰃁md_bookmark_check
󱍻md_bookmark_check_outline
󰧌md_bookmark_minus
󰧍md_bookmark_minus_outline
󰸕md_bookmark_multiple
󰸖md_bookmark_multiple_outline
󰃂md_bookmark_music
󱍹md_bookmark_music_outline
󰧎md_bookmark_off
󰧏md_bookmark_off_outline
󰃃md_bookmark_outline
󰃅md_bookmark_plus
󰃄md_bookmark_plus_outline
󰃆md_bookmark_remove
󱍺md_bookmark_remove_outline
󱉟md_bookshelf
󰺆md_boom_gate
󰺇md_boom_gate_alert
󰺈md_boom_gate_alert_outline
󰺉md_boom_gate_arrow_down
󰺊md_boom_gate_arrow_down_outline
󰺌md_boom_gate_arrow_up
󰺍md_boom_gate_arrow_up_outline
󰺋md_boom_gate_outline
󱟹md_boom_gate_up
󱟺md_boom_gate_up_outline
󰗜md_boombox
󱃏md_boomerang
󰛆md_bootstrap
󰃇md_border_all
󰢡md_border_all_variant
󰃈md_border_bottom
󰢢md_border_bottom_variant
󰃉md_border_color
󰃊md_border_horizontal
󰃋md_border_inside
󰃌md_border_left
󰢣md_border_left_variant
󰃍md_border_none
󰢤md_border_none_variant
󰃎md_border_outside
󰃏md_border_right
󰢥md_border_right_variant
󰃐md_border_style
󰃑md_border_top
󰢦md_border_top_variant
󰃒md_border_vertical
󱁰md_bottle_soda
󱁱md_bottle_soda_classic
󱍣md_bottle_soda_classic_outline
󱁲md_bottle_soda_outline
󱄮md_bottle_tonic
󱄯md_bottle_tonic_outline
󱄰md_bottle_tonic_plus
󱄱md_bottle_tonic_plus_outline
󱄲md_bottle_tonic_skull
󱄳md_bottle_tonic_skull_outline
󰡔md_bottle_wine
󱌐md_bottle_wine_outline
󱡁md_bow_arrow
󰙸md_bow_tie
󰊎md_bowl
󰘗md_bowl_mix
󰋤md_bowl_mix_outline
󰊩md_bowl_outline
󰃓md_bowling
󰃔md_box
󰃕md_box_cutter
󰭊md_box_cutter_off
󰘷md_box_shadow
󰭥md_boxing_glove
󰧐md_braille
󰧑md_brain
󰳮md_bread_slice
󰳯md_bread_slice_outline
󰘘md_bridge
󰃖md_briefcase
󰳰md_briefcase_account
󰳱md_briefcase_account_outline
󱪍md_briefcase_arrow_left_right
󱪎md_briefcase_arrow_left_right_outline
󱪏md_briefcase_arrow_up_down
󱪐md_briefcase_arrow_up_down_outline
󰃗md_briefcase_check
󱌞md_briefcase_check_outline
󱃐md_briefcase_clock
󱃑md_briefcase_clock_outline
󰃘md_briefcase_download
󰰽md_briefcase_download_outline
󰪘md_briefcase_edit
󰰾md_briefcase_edit_outline
󱟙md_briefcase_eye
󱟚md_briefcase_eye_outline
󰨪md_briefcase_minus
󰰿md_briefcase_minus_outline
󱙘md_briefcase_off
󱙙md_briefcase_off_outline
󰠔md_briefcase_outline
󰨫md_briefcase_plus
󰱀md_briefcase_plus_outline
󰨬md_briefcase_remove
󰱁md_briefcase_remove_outline
󰨭md_briefcase_search
󰱂md_briefcase_search_outline
󰃙md_briefcase_upload
󰱃md_briefcase_upload_outline
󱒔md_briefcase_variant
󱙚md_briefcase_variant_off
󱙛md_briefcase_variant_off_outline
󱒕md_briefcase_variant_outline
󰃚md_brightness_1
󰃛md_brightness_2
󰃜md_brightness_3
󰃝md_brightness_4
󰃞md_brightness_5
󰃟md_brightness_6
󰃠md_brightness_7
󰃡md_brightness_auto
󰳲md_brightness_percent
󱜠md_broadcast
󱜡md_broadcast_off
󰃢md_broom
󰃣md_brush
󱝱md_brush_off
󱨍md_brush_outline
󱠓md_brush_variant
󱐕md_bucket
󱐖md_bucket_outline
󰕸md_buffet
󰃤md_bug
󰨮md_bug_check
󰨯md_bug_check_outline
󰨰md_bug_outline
󰶴md_bugle
󱨯md_bulkhead_light
󰬢md_bulldozer
󰳳md_bullet
󰃥md_bulletin_board
󰃦md_bullhorn
󰬣md_bullhorn_outline
󱥮md_bullhorn_variant
󱥯md_bullhorn_variant_outline
󰗝md_bullseye
󰣉md_bullseye_arrow
󱋧md_bulma
󱌂md_bunk_bed
󰂗md_bunk_bed_outline
󰃧md_bus
󰪙md_bus_alert
󰞜md_bus_articulated_end
󰞝md_bus_articulated_front
󰣊md_bus_clock
󰞞md_bus_double_decker
󱤝md_bus_electric
󱈒md_bus_marker
󰼿md_bus_multiple
󰞟md_bus_school
󰞠md_bus_side
󱀒md_bus_stop
󱀓md_bus_stop_covered
󱀔md_bus_stop_uncovered
󱖉md_butterfly
󱖊md_butterfly_outline
󱢌md_cabin_a_frame
󱎔md_cable_data
󰃨md_cached
󰶵md_cactus
󰃩md_cake
󰃪md_cake_layered
󰃫md_cake_variant
󱟰md_cake_variant_outline
󰃬md_calculator
󰪚md_calculator_variant
󱖦md_calculator_variant_outline
󰃭md_calendar
󰻗md_calendar_account
󰻘md_calendar_account_outline
󰨱md_calendar_alert
󱄴md_calendar_arrow_left
󱄵md_calendar_arrow_right
󰃮md_calendar_blank
󱁳md_calendar_blank_multiple
󰭦md_calendar_blank_outline
󰃯md_calendar_check
󰱄md_calendar_check_outline
󰃰md_calendar_clock
󱛡md_calendar_clock_outline
󱢝md_calendar_collapse_horizontal
󱕻md_calendar_cursor
󰢧md_calendar_edit
󱙬md_calendar_end
󱢞md_calendar_expand_horizontal
󰬤md_calendar_export
󰧒md_calendar_heart
󰬥md_calendar_import
󱙁md_calendar_lock
󱙂md_calendar_lock_outline
󰵜md_calendar_minus
󰸗md_calendar_month
󰸘md_calendar_month_outline
󰃱md_calendar_multiple
󰃲md_calendar_multiple_check
󰨲md_calendar_multiselect
󰭧md_calendar_outline
󰃳md_calendar_plus
󰚒md_calendar_question
󰙹md_calendar_range
󰭨md_calendar_range_outline
󰇡md_calendar_refresh
󰈃md_calendar_refresh_outline
󰃴md_calendar_remove
󰱅md_calendar_remove_outline
󰥌md_calendar_search
󰧓md_calendar_star
󱙭md_calendar_start
󰺎md_calendar_sync
󰺏md_calendar_sync_outline
󰃵md_calendar_text
󰱆md_calendar_text_outline
󰃶md_calendar_today
󱨰md_calendar_today_outline
󰨳md_calendar_week
󰨴md_calendar_week_begin
󱨱md_calendar_week_begin_outline
󱨲md_calendar_week_end
󱨳md_calendar_week_end_outline
󱨴md_calendar_week_outline
󰻙md_calendar_weekend
󰻚md_calendar_weekend_outline
󰃷md_call_made
󰃸md_call_merge
󰃹md_call_missed
󰃺md_call_received
󰃻md_call_split
󰃼md_camcorder
󰃿md_camcorder_off
󰄀md_camera
󰣋md_camera_account
󰚓md_camera_burst
󰭩md_camera_control
󱡱md_camera_document
󱡲md_camera_document_off
󰄁md_camera_enhance
󰭪md_camera_enhance_outline
󱗙md_camera_flip
󱗚md_camera_flip_outline
󰄂md_camera_front
󰄃md_camera_front_variant
󰞡md_camera_gopro
󰣌md_camera_image
󰄄md_camera_iris
󱨔md_camera_lock
󱨕md_camera_lock_outline
󱦧md_camera_marker
󱦨md_camera_marker_outline
󰞢md_camera_metering_center
󰞣md_camera_metering_matrix
󰞤md_camera_metering_partial
󰞥md_camera_metering_spot
󰗟md_camera_off
󱦿md_camera_off_outline
󰵝md_camera_outline
󰄅md_camera_party_mode
󰻛md_camera_plus
󰻜md_camera_plus_outline
󰄆md_camera_rear
󰄇md_camera_rear_variant
󰸙md_camera_retake
󰸚md_camera_retake_outline
󰄈md_camera_switch
󰡊md_camera_switch_outline
󰄉md_camera_timer
󰶶md_camera_wireless
󰶷md_camera_wireless_outline
󰻝md_campfire
󰜺md_cancel
󱟒md_candelabra
󱟓md_candelabra_fire
󰗢md_candle
󱥰md_candy
󱥱md_candy_off
󱥲md_candy_off_outline
󱥳md_candy_outline
󰄊md_candycane
󰞦md_cannabis
󱙮md_cannabis_off
󰪛md_caps_lock
󰄋md_car
󱀕md_car_2_plus
󱀖md_car_3_plus
󱎲md_car_arrow_left
󱎳md_car_arrow_right
󰸛md_car_back
󰄌md_car_battery
󰱇md_car_brake_abs
󰱈md_car_brake_alert
󱤉md_car_brake_fluid_level
󰵞md_car_brake_hold
󱤊md_car_brake_low_pressure
󰵟md_car_brake_parking
󱀗md_car_brake_retarder
󱤋md_car_brake_temperature
󱤌md_car_brake_worn_linings
󰾣md_car_child_seat
󱥴md_car_clock
󱀘md_car_clutch
󱏌md_car_cog
󰄍md_car_connected
󰞧md_car_convertible
󱀙md_car_coolant_level
󰵠md_car_cruise_control
󰵡md_car_defrost_front
󰵢md_car_defrost_rear
󰭫md_car_door
󱂝md_car_door_lock
󰭬md_car_electric
󱖵md_car_electric_outline
󱘏md_car_emergency
󰱉md_car_esp
󰞨md_car_estate
󰞩md_car_hatchback
󱆾md_car_info
󰭭md_car_key
󱔭md_car_lifted_pickup
󱤍md_car_light_alert
󰱊md_car_light_dimmed
󰱋md_car_light_fog
󰱌md_car_light_high
󰣍md_car_limousine
󰭮md_car_multiple
󰸜md_car_off
󱓭md_car_outline
󰵣md_car_parking_lights
󰞪md_car_pickup
󰾤md_car_seat
󰾥md_car_seat_cooler
󰾦md_car_seat_heater
󱡹md_car_select
󱏍md_car_settings
󰽀md_car_shift_pattern
󰞫md_car_side
󱤎md_car_speed_limiter
󰞬md_car_sports
󰱍md_car_tire_alert
󰵤md_car_traction_control
󱀚md_car_turbocharger
󰄎md_car_wash
󱀛md_car_windshield
󱀜md_car_windshield_outline
󱡸md_car_wireless
󱠔md_car_wrench
󱓀md_carabiner
󰞭md_caravan
󰭯md_card
󰗒md_card_account_details
󰶫md_card_account_details_outline
󰊣md_card_account_details_star
󰛛md_card_account_details_star_outline
󰆎md_card_account_mail
󰺘md_card_account_mail_outline
󰺙md_card_account_phone
󰺚md_card_account_phone_outline
󰭰md_card_bulleted
󰭱md_card_bulleted_off
󰭲md_card_bulleted_off_outline
󰭳md_card_bulleted_outline
󰭴md_card_bulleted_settings
󰭵md_card_bulleted_settings_outline
󱘀md_card_minus
󱘁md_card_minus_outline
󱟱md_card_multiple
󱟲md_card_multiple_outline
󱘂md_card_off
󱘃md_card_off_outline
󰭶md_card_outline
󱇿md_card_plus
󱈀md_card_plus_outline
󱘄md_card_remove
󱘅md_card_remove_outline
󱁴md_card_search
󱁵md_card_search_outline
󰭷md_card_text
󰭸md_card_text_outline
󰘸md_cards
󰣎md_cards_club
󱢟md_cards_club_outline
󰣏md_cards_diamond
󱀝md_cards_diamond_outline
󰘹md_cards_outline
󱢡md_cards_playing
󱢢md_cards_playing_club
󱢣md_cards_playing_club_multiple
󱢤md_cards_playing_club_multiple_outline
󱢥md_cards_playing_club_outline
󱢦md_cards_playing_diamond
󱢧md_cards_playing_diamond_multiple
󱢨md_cards_playing_diamond_multiple_outline
󱢩md_cards_playing_diamond_outline
󱢪md_cards_playing_heart
󱢫md_cards_playing_heart_multiple
󱢬md_cards_playing_heart_multiple_outline
󱢭md_cards_playing_heart_outline
󰘺md_cards_playing_outline
󱢮md_cards_playing_spade
󱢯md_cards_playing_spade_multiple
󱢰md_cards_playing_spade_multiple_outline
󱢱md_cards_playing_spade_outline
󰣑md_cards_spade
󱢲md_cards_spade_outline
󰛇md_cards_variant
󰄏md_carrot
󰄐md_cart
󰵦md_cart_arrow_down
󰱎md_cart_arrow_right
󰵧md_cart_arrow_up
󱗪md_cart_check
󱣠md_cart_heart
󰵨md_cart_minus
󰙫md_cart_off
󰄑md_cart_outline
󰄒md_cart_plus
󰵩md_cart_remove
󱗫md_cart_variant
󰄓md_case_sensitive_alt
󰄔md_cash
󰄕md_cash_100
󱓮md_cash_check
󱪑md_cash_clock
󱡜md_cash_fast
󱓪md_cash_lock
󱓫md_cash_lock_open
󰶸md_cash_marker
󱉠md_cash_minus
󰄖md_cash_multiple
󱉡md_cash_plus
󰪜md_cash_refund
󰳴md_cash_register
󱉢md_cash_remove
󱪒md_cash_sync
󰧔md_cassette
󰄘md_cast
󱀞md_cast_audio
󱝉md_cast_audio_variant
󰄙md_cast_connected
󰸝md_cast_education
󰞊md_cast_off
󰀟md_cast_variant
󰄚md_castle
󰄛md_cat
󰞮md_cctv
󱡟md_cctv_off
󱞗md_ceiling_fan
󱞘md_ceiling_fan_light
󰝩md_ceiling_light
󱣝md_ceiling_light_multiple
󱣞md_ceiling_light_multiple_outline
󱟇md_ceiling_light_outline
󰄜md_cellphone
󰧕md_cellphone_arrow_down
󱧅md_cellphone_arrow_down_variant
󰄞md_cellphone_basic
󱎗md_cellphone_charging
󱟽md_cellphone_check
󰥑md_cellphone_cog
󰄟md_cellphone_dock
󰽁md_cellphone_information
󰥎md_cellphone_key
󰄡md_cellphone_link
󰄢md_cellphone_link_off
󰥏md_cellphone_lock
󱠺md_cellphone_marker
󰣓md_cellphone_message
󱃒md_cellphone_message_off
󰺐md_cellphone_nfc
󱋘md_cellphone_nfc_off
󰥐md_cellphone_off
󱀟md_cellphone_play
󰥍md_cellphone_remove
󰨵md_cellphone_screenshot
󰄣md_cellphone_settings
󰥒md_cellphone_sound
󰣒md_cellphone_text
󰠕md_cellphone_wireless
󱄚md_centos
󰄤md_certificate
󱆈md_certificate_outline
󰽈md_chair_rolling
󰄥md_chair_school
󱞓md_chandelier
󰱏md_charity
󰄦md_chart_arc
󰄧md_chart_areaspline
󰺑md_chart_areaspline_variant
󰄨md_chart_bar
󰝪md_chart_bar_stacked
󰱐md_chart_bell_curve
󰾧md_chart_bell_curve_cumulative
󱕍md_chart_box
󱕎md_chart_box_outline
󱕏md_chart_box_plus_outline
󰗣md_chart_bubble
󰞯md_chart_donut
󰞰md_chart_donut_variant
󰙬md_chart_gantt
󰄩md_chart_histogram
󰄪md_chart_line
󰝫md_chart_line_stacked
󰞱md_chart_line_variant
󰣔md_chart_multiline
󱈓md_chart_multiple
󰄫md_chart_pie
󱎀md_chart_ppf
󱇟md_chart_sankey
󱇠md_chart_sankey_variant
󰺒md_chart_scatter_plot
󰙭md_chart_scatter_plot_hexbin
󰙮md_chart_timeline
󰺓md_chart_timeline_variant
󱖶md_chart_timeline_variant_shimmer
󰺔md_chart_tree
󱤘md_chart_waterfall
󰭹md_chat
󰭺md_chat_alert
󱋉md_chat_alert_outline
󱐐md_chat_minus
󱐓md_chat_minus_outline
󰻞md_chat_outline
󱐏md_chat_plus
󱐒md_chat_plus_outline
󰭻md_chat_processing
󱋊md_chat_processing_outline
󱜸md_chat_question
󱜹md_chat_question_outline
󱐑md_chat_remove
󱐔md_chat_remove_outline
󱋑md_chat_sleep
󱋒md_chat_sleep_outline
󰄬md_check
󰄭md_check_all
󰸞md_check_bold
󰗠md_check_circle
󰗡md_check_circle_outline
󰞑md_check_decagram
󱝀md_check_decagram_outline
󰱓md_check_network
󰱔md_check_network_outline
󰡕md_check_outline
󰸟md_check_underline
󰸠md_check_underline_circle
󰸡md_check_underline_circle_outline
󰪝md_checkbook
󰄮md_checkbox_blank
󱅶md_checkbox_blank_badge
󰄗md_checkbox_blank_badge_outline
󰄯md_checkbox_blank_circle
󰄰md_checkbox_blank_circle_outline
󱋬md_checkbox_blank_off
󱋭md_checkbox_blank_off_outline
󰄱md_checkbox_blank_outline
󰡖md_checkbox_intermediate
󰄲md_checkbox_marked
󰄳md_checkbox_marked_circle
󰄴md_checkbox_marked_circle_outline
󱤧md_checkbox_marked_circle_plus_outline
󰄵md_checkbox_marked_outline
󰄶md_checkbox_multiple_blank
󰘻md_checkbox_multiple_blank_circle
󰘼md_checkbox_multiple_blank_circle_outline
󰄷md_checkbox_multiple_blank_outline
󰄸md_checkbox_multiple_marked
󰘽md_checkbox_multiple_marked_circle
󰘾md_checkbox_multiple_marked_circle_outline
󰄹md_checkbox_multiple_marked_outline
󰱑md_checkbox_multiple_outline
󰱒md_checkbox_outline
󰄺md_checkerboard
󱈂md_checkerboard_minus
󱈁md_checkerboard_plus
󱈃md_checkerboard_remove
󱊹md_cheese
󱏮md_cheese_off
󰭼md_chef_hat
󰄻md_chemical_weapon
󰡜md_chess_bishop
󰡗md_chess_king
󰡘md_chess_knight
󰡙md_chess_pawn
󰡚md_chess_queen
󰡛md_chess_rook
󰄼md_chevron_double_down
󰄽md_chevron_double_left
󰄾md_chevron_double_right
󰄿md_chevron_double_up
󰅀md_chevron_down
󰧖md_chevron_down_box
󰧗md_chevron_down_box_outline
󰬦md_chevron_down_circle
󰬧md_chevron_down_circle_outline
󰅁md_chevron_left
󰧘md_chevron_left_box
󰧙md_chevron_left_box_outline
󰬨md_chevron_left_circle
󰬩md_chevron_left_circle_outline
󰅂md_chevron_right
󰧚md_chevron_right_box
󰧛md_chevron_right_box_outline
󰬪md_chevron_right_circle
󰬫md_chevron_right_circle_outline
󰶹md_chevron_triple_down
󰶺md_chevron_triple_left
󰶻md_chevron_triple_right
󰶼md_chevron_triple_up
󰅃md_chevron_up
󰧜md_chevron_up_box
󰧝md_chevron_up_box_outline
󰬬md_chevron_up_circle
󰬭md_chevron_up_circle_outline
󱟪md_chili_alert
󱟫md_chili_alert_outline
󰞲md_chili_hot
󱟬md_chili_hot_outline
󰞳md_chili_medium
󱟭md_chili_medium_outline
󰞴md_chili_mild
󱟮md_chili_mild_outline
󱑧md_chili_off
󱟯md_chili_off_outline
󰘚md_chip
󰅄md_church
󱆉md_cigar
󱐛md_cigar_off
󱗜md_circle_box
󱗝md_circle_box_outline
󰺕md_circle_double
󰣕md_circle_edit_outline
󰺖md_circle_expand
󱎕md_circle_half
󱎖md_circle_half_full
󰧞md_circle_medium
󰬸md_circle_multiple
󰚕md_circle_multiple_outline
󱃓md_circle_off_outline
󱡓md_circle_opacity
󰪞md_circle_slice_1
󰪟md_circle_slice_2
󰪠md_circle_slice_3
󰪡md_circle_slice_4
󰪢md_circle_slice_5
󰪣md_circle_slice_6
󰪤md_circle_slice_7
󰪥md_circle_slice_8
󰧟md_circle_small
󰸢md_circular_saw
󰅆md_city
󰨶md_city_variant
󰨷md_city_variant_outline
󰅇md_clipboard
󰅈md_clipboard_account
󰱕md_clipboard_account_outline
󰅉md_clipboard_alert
󰳷md_clipboard_alert_outline
󰅊md_clipboard_arrow_down
󰱖md_clipboard_arrow_down_outline
󰅋md_clipboard_arrow_left
󰳸md_clipboard_arrow_left_outline
󰳹md_clipboard_arrow_right
󰳺md_clipboard_arrow_right_outline
󰱗md_clipboard_arrow_up
󰱘md_clipboard_arrow_up_outline
󰅎md_clipboard_check
󱉣md_clipboard_check_multiple
󱉤md_clipboard_check_multiple_outline
󰢨md_clipboard_check_outline
󱛢md_clipboard_clock
󱛣md_clipboard_clock_outline
󱓥md_clipboard_edit
󱓦md_clipboard_edit_outline
󱉥md_clipboard_file
󱉦md_clipboard_file_outline
󰛈md_clipboard_flow
󱄗md_clipboard_flow_outline
󱃔md_clipboard_list
󱃕md_clipboard_list_outline
󱘘md_clipboard_minus
󱘙md_clipboard_minus_outline
󱉧md_clipboard_multiple
󱉨md_clipboard_multiple_outline
󱘚md_clipboard_off
󱘛md_clipboard_off_outline
󰅌md_clipboard_outline
󰱙md_clipboard_play
󱉩md_clipboard_play_multiple
󱉪md_clipboard_play_multiple_outline
󰱚md_clipboard_play_outline
󰝑md_clipboard_plus
󱌟md_clipboard_plus_outline
󰡝md_clipboard_pulse
󰡞md_clipboard_pulse_outline
󱘜md_clipboard_remove
󱘝md_clipboard_remove_outline
󱘞md_clipboard_search
󱘟md_clipboard_search_outline
󰅍md_clipboard_text
󱣹md_clipboard_text_clock
󱣺md_clipboard_text_clock_outline
󱉫md_clipboard_text_multiple
󱉬md_clipboard_text_multiple_outline
󱘠md_clipboard_text_off
󱘡md_clipboard_text_off_outline
󰨸md_clipboard_text_outline
󰱛md_clipboard_text_play
󰱜md_clipboard_text_play_outline
󱘢md_clipboard_text_search
󱘣md_clipboard_text_search_outline
󰅏md_clippy
󰥔md_clock
󰥕md_clock_alert
󰗎md_clock_alert_outline
󰾨md_clock_check
󰾩md_clock_check_outline
󰺗md_clock_digital
󱦺md_clock_edit
󱦻md_clock_edit_outline
󰅑md_clock_end
󰅒md_clock_fast
󰅓md_clock_in
󱡣md_clock_minus
󱡤md_clock_minus_outline
󰅔md_clock_out
󰅐md_clock_outline
󱡡md_clock_plus
󱡢md_clock_plus_outline
󱡥md_clock_remove
󱡦md_clock_remove_outline
󰅕md_clock_start
󱑆md_clock_time_eight
󱑒md_clock_time_eight_outline
󱑉md_clock_time_eleven
󱑕md_clock_time_eleven_outline
󱑃md_clock_time_five
󱑏md_clock_time_five_outline
󱑂md_clock_time_four
󱑎md_clock_time_four_outline
󱑇md_clock_time_nine
󱑓md_clock_time_nine_outline
󱐿md_clock_time_one
󱑋md_clock_time_one_outline
󱑅md_clock_time_seven
󱑑md_clock_time_seven_outline
󱑄md_clock_time_six
󱑐md_clock_time_six_outline
󱑈md_clock_time_ten
󱑔md_clock_time_ten_outline
󱑁md_clock_time_three
󱑍md_clock_time_three_outline
󱑊md_clock_time_twelve
󱑖md_clock_time_twelve_outline
󱑀md_clock_time_two
󱑌md_clock_time_two_outline
󰅖md_close
󰅗md_close_box
󰱝md_close_box_multiple
󰱞md_close_box_multiple_outline
󰅘md_close_box_outline
󰅙md_close_circle
󰘪md_close_circle_multiple
󰢃md_close_circle_multiple_outline
󰅚md_close_circle_outline
󰅛md_close_network
󰱟md_close_network_outline
󰅜md_close_octagon
󰅝md_close_octagon_outline
󰛉md_close_outline
󱎘md_close_thick
󰅞md_closed_caption
󰶽md_closed_caption_outline
󰅟md_cloud
󰧠md_cloud_alert
󰞵md_cloud_braces
󰅠md_cloud_check
󱋌md_cloud_check_outline
󰅡md_cloud_circle
󰅢md_cloud_download
󰭽md_cloud_download_outline
󱇱md_cloud_lock
󱇲md_cloud_lock_outline
󰅤md_cloud_off_outline
󰅣md_cloud_outline
󱨵md_cloud_percent
󱨶md_cloud_percent_outline
󰅥md_cloud_print
󰅦md_cloud_print_outline
󰨹md_cloud_question
󰔪md_cloud_refresh
󰥖md_cloud_search
󰥗md_cloud_search_outline
󰘿md_cloud_sync
󱋖md_cloud_sync_outline
󰞶md_cloud_tags
󰅧md_cloud_upload
󰭾md_cloud_upload_outline
󰠖md_clover
󱀠md_coach_lamp
󱨷md_coach_lamp_variant
󱂞md_coat_rack
󰅨md_code_array
󰅩md_code_braces
󱃖md_code_braces_box
󰅪md_code_brackets
󰅫md_code_equal
󰅬md_code_greater_than
󰅭md_code_greater_than_or_equal
󰘦md_code_json
󰅮md_code_less_than
󰅯md_code_less_than_or_equal
󰅰md_code_not_equal
󰅱md_code_not_equal_variant
󰅲md_code_parentheses
󱃗md_code_parentheses_box
󰅳md_code_string
󰅴md_code_tags
󰚔md_code_tags_check
󰅵md_codepen
󰅶md_coffee
󱂟md_coffee_maker
󱤱md_coffee_maker_check
󱤲md_coffee_maker_check_outline
󱠛md_coffee_maker_outline
󰾪md_coffee_off
󰾫md_coffee_off_outline
󰛊md_coffee_outline
󰅷md_coffee_to_go
󱌎md_coffee_to_go_outline
󰭿md_coffin
󰒓md_cog
󰒔md_cog_box
󱇝md_cog_clockwise
󱇞md_cog_counterclockwise
󱏎md_cog_off
󱏏md_cog_off_outline
󰢻md_cog_outline
󱤳md_cog_pause
󱤴md_cog_pause_outline
󱤵md_cog_play
󱤶md_cog_play_outline
󱑞md_cog_refresh
󱑟md_cog_refresh_outline
󱤷md_cog_stop
󱤸md_cog_stop_outline
󱑠md_cog_sync
󱑡md_cog_sync_outline
󱁛md_cog_transfer
󱁜md_cog_transfer_outline
󰣖md_cogs
󰙀md_collage
󰪦md_collapse_all
󰪧md_collapse_all_outline
󰅹md_color_helper
󰸣md_comma
󰸫md_comma_box
󰸤md_comma_box_outline
󰸥md_comma_circle
󰸦md_comma_circle_outline
󰅺md_comment
󰅻md_comment_account
󰅼md_comment_account_outline
󰅽md_comment_alert
󰅾md_comment_alert_outline
󰧡md_comment_arrow_left
󰧢md_comment_arrow_left_outline
󰧣md_comment_arrow_right
󰧤md_comment_arrow_right_outline
󱖮md_comment_bookmark
󱖯md_comment_bookmark_outline
󰅿md_comment_check
󰆀md_comment_check_outline
󱆿md_comment_edit
󱋄md_comment_edit_outline
󰨺md_comment_eye
󰨻md_comment_eye_outline
󱖰md_comment_flash
󱖱md_comment_flash_outline
󱗟md_comment_minus
󱗠md_comment_minus_outline
󰡟md_comment_multiple
󰆁md_comment_multiple_outline
󱗡md_comment_off
󱗢md_comment_off_outline
󰆂md_comment_outline
󰧥md_comment_plus
󰆃md_comment_plus_outline
󰆄md_comment_processing
󰆅md_comment_processing_outline
󰠗md_comment_question
󰆆md_comment_question_outline
󱀡md_comment_quote
󱀢md_comment_quote_outline
󰗞md_comment_remove
󰆇md_comment_remove_outline
󰨼md_comment_search
󰨽md_comment_search_outline
󰆈md_comment_text
󰡠md_comment_text_multiple
󰡡md_comment_text_multiple_outline
󰆉md_comment_text_outline
󰆊md_compare
󱒒md_compare_horizontal
󱢳md_compare_remove
󱒓md_compare_vertical
󰆋md_compass
󰮀md_compass_off
󰮁md_compass_off_outline
󰆌md_compass_outline
󱎂md_compass_rose
󱨸md_compost
󱥌md_cone
󱥍md_cone_off
󱘖md_connection
󰆍md_console
󰞷md_console_line
󰢩md_console_network
󰱠md_console_network_outline
󱃘md_consolidate
󰵪md_contactless_payment
󰌡md_contactless_payment_circle
󰐈md_contactless_payment_circle_outline
󰛋md_contacts
󰖸md_contacts_outline
󰨾md_contain
󰨿md_contain_end
󰩀md_contain_start
󰆏md_content_copy
󰆐md_content_cut
󰆑md_content_duplicate
󰆒md_content_paste
󰆓md_content_save
󰽂md_content_save_alert
󰽃md_content_save_alert_outline
󰆔md_content_save_all
󰽄md_content_save_all_outline
󱣪md_content_save_check
󱣫md_content_save_check_outline
󱑛md_content_save_cog
󱑜md_content_save_cog_outline
󰳻md_content_save_edit
󰳼md_content_save_edit_outline
󰸧md_content_save_move
󰸨md_content_save_move_outline
󱙃md_content_save_off
󱙄md_content_save_off_outline
󰠘md_content_save_outline
󰘛md_content_save_settings
󰬮md_content_save_settings_outline
󰆕md_contrast
󰆖md_contrast_box
󰆗md_contrast_circle
󰮂md_controller_classic
󰮃md_controller_classic_outline
󰆘md_cookie
󱛐md_cookie_alert
󱛑md_cookie_alert_outline
󱛒md_cookie_check
󱛓md_cookie_check_outline
󱛤md_cookie_clock
󱛥md_cookie_clock_outline
󱛔md_cookie_cog
󱛕md_cookie_cog_outline
󱛦md_cookie_edit
󱛧md_cookie_edit_outline
󱛨md_cookie_lock
󱛩md_cookie_lock_outline
󱛚md_cookie_minus
󱛛md_cookie_minus_outline
󱛪md_cookie_off
󱛫md_cookie_off_outline
󱛞md_cookie_outline
󱛖md_cookie_plus
󱛗md_cookie_plus_outline
󱛬md_cookie_refresh
󱛭md_cookie_refresh_outline
󱛘md_cookie_remove
󱛙md_cookie_remove_outline
󱛜md_cookie_settings
󱛝md_cookie_settings_outline
󰏈md_coolant_temperature
󱤹md_copyleft
󰗦md_copyright
󰥘md_cordova
󰞸md_corn
󱏯md_corn_off
󱑹md_cosine_wave
󰆙md_counter
󱠜md_countertop
󱠝md_countertop_outline
󰆚md_cow
󱣼md_cow_off
󰻟md_cpu_32_bit
󰻠md_cpu_64_bit
󱦋md_cradle
󱦑md_cradle_outline
󰡢md_crane
󰙴md_creation
󰵫md_creative_commons
󰿯md_credit_card
󱏐md_credit_card_check
󱏑md_credit_card_check_outline
󱤏md_credit_card_chip
󱤐md_credit_card_chip_outline
󰻡md_credit_card_clock
󰻢md_credit_card_clock_outline
󱟗md_credit_card_edit
󱟘md_credit_card_edit_outline
󱤑md_credit_card_fast
󱤒md_credit_card_fast_outline
󱣧md_credit_card_lock
󱣨md_credit_card_lock_outline
󰚨md_credit_card_marker
󰶾md_credit_card_marker_outline
󰾬md_credit_card_minus
󰾭md_credit_card_minus_outline
󰿰md_credit_card_multiple
󰆜md_credit_card_multiple_outline
󰿱md_credit_card_off
󰗤md_credit_card_off_outline
󰆛md_credit_card_outline
󰿲md_credit_card_plus
󰙶md_credit_card_plus_outline
󱙅md_credit_card_refresh
󱙆md_credit_card_refresh_outline
󰿳md_credit_card_refund
󰪨md_credit_card_refund_outline
󰾮md_credit_card_remove
󰾯md_credit_card_remove_outline
󰿴md_credit_card_scan
󰆝md_credit_card_scan_outline
󱙇md_credit_card_search
󱙈md_credit_card_search_outline
󰿵md_credit_card_settings
󰣗md_credit_card_settings_outline
󱙉md_credit_card_sync
󱙊md_credit_card_sync_outline
󰠂md_credit_card_wireless
󰕺md_credit_card_wireless_off
󰕻md_credit_card_wireless_off_outline
󰵬md_credit_card_wireless_outline
󰵭md_cricket
󰆞md_crop
󰆟md_crop_free
󰆠md_crop_landscape
󰆡md_crop_portrait
󰚖md_crop_rotate
󰆢md_crop_square
󰥓md_cross
󰳭md_cross_bolnisi
󰳵md_cross_celtic
󰳶md_cross_outline
󰆣md_crosshairs
󰆤md_crosshairs_gps
󰽅md_crosshairs_off
󱄶md_crosshairs_question
󱥵md_crowd
󰆥md_crown
󱟜md_crown_circle
󱟝md_crown_circle_outline
󱇐md_crown_outline
󰥙md_cryengine
󰬯md_crystal_ball
󰆦md_cube
󱐜md_cube_off
󱐝md_cube_off_outline
󰆧md_cube_outline
󰮄md_cube_scan
󰆨md_cube_send
󰆩md_cube_unfolded
󰆪md_cup
󰗥md_cup_off
󱍽md_cup_off_outline
󱌏md_cup_outline
󰆫md_cup_water
󰽆md_cupboard
󰽇md_cupboard_outline
󰥚md_cupcake
󰡣md_curling
󰡤md_currency_bdt
󰮅md_currency_brl
󰆬md_currency_btc
󰞺md_currency_cny
󰞻md_currency_eth
󰆭md_currency_eur
󱌕md_currency_eur_off
󱨹md_currency_fra
󰆮md_currency_gbp
󰱡md_currency_ils
󰆯md_currency_inr
󰞼md_currency_jpy
󰞽md_currency_krw
󰡥md_currency_kzt
󱔒md_currency_mnt
󰆰md_currency_ngn
󰧦md_currency_php
󰺜md_currency_rial
󰆱md_currency_rub
󱥶md_currency_rupee
󰞾md_currency_sign
󰆲md_currency_try
󰞿md_currency_twd
󰇁md_currency_usd
󰙺md_currency_usd_off
󱒀md_current_ac
󰥜md_current_dc
󰇀md_cursor_default
󰳽md_cursor_default_click
󰳾md_cursor_default_click_outline
󱄧md_cursor_default_gesture
󱄨md_cursor_default_gesture_outline
󰆿md_cursor_default_outline
󰆾md_cursor_move
󰆽md_cursor_pointer
󰗧md_cursor_text
󱡆md_curtains
󱡇md_curtains_closed
󱥎md_cylinder
󱥏md_cylinder_off
󱗻md_dance_ballroom
󱕸md_dance_pole
󱔼md_data_matrix
󱔽md_data_matrix_edit
󱔾md_data_matrix_minus
󱔿md_data_matrix_plus
󱕀md_data_matrix_remove
󱕁md_data_matrix_scan
󰆼md_database
󱘺md_database_alert
󱘤md_database_alert_outline
󱘻md_database_arrow_down
󱘥md_database_arrow_down_outline
󱘼md_database_arrow_left
󱘦md_database_arrow_left_outline
󱘽md_database_arrow_right
󱘧md_database_arrow_right_outline
󱘾md_database_arrow_up
󱘨md_database_arrow_up_outline
󰪩md_database_check
󱘩md_database_check_outline
󱘿md_database_clock
󱘪md_database_clock_outline
󱙋md_database_cog
󱙌md_database_cog_outline
󰮆md_database_edit
󱘫md_database_edit_outline
󰥞md_database_export
󱘬md_database_export_outline
󱤟md_database_eye
󱤠md_database_eye_off
󱤡md_database_eye_off_outline
󱤢md_database_eye_outline
󰥝md_database_import
󱘭md_database_import_outline
󰪪md_database_lock
󱘮md_database_lock_outline
󱋶md_database_marker
󱘯md_database_marker_outline
󰆻md_database_minus
󱘰md_database_minus_outline
󱙀md_database_off
󱘱md_database_off_outline
󱘲md_database_outline
󰆺md_database_plus
󱘳md_database_plus_outline
󰗂md_database_refresh
󱘴md_database_refresh_outline
󰴀md_database_remove
󱘵md_database_remove_outline
󰡦md_database_search
󱘶md_database_search_outline
󰴁md_database_settings
󱘷md_database_settings_outline
󰳿md_database_sync
󱘸md_database_sync_outline
󰣘md_death_star
󰣙md_death_star_variant
󰮇md_deathly_hallows
󰣚md_debian
󰆹md_debug_step_into
󰆸md_debug_step_out
󰆷md_debug_step_over
󰝬md_decagram
󰝭md_decagram_outline
󱂡md_decimal
󱂢md_decimal_comma
󱂣md_decimal_comma_decrease
󱂤md_decimal_comma_increase
󰆶md_decimal_decrease
󰆵md_decimal_increase
󰆴md_delete
󱂥md_delete_alert
󱂦md_delete_alert_outline
󰚃md_delete_circle
󰮈md_delete_circle_outline
󱕖md_delete_clock
󱕗md_delete_clock_outline
󰛌md_delete_empty
󰺝md_delete_empty_outline
󰗨md_delete_forever
󰮉md_delete_forever_outline
󱂧md_delete_off
󱂨md_delete_off_outline
󰧧md_delete_outline
󰠙md_delete_restore
󰗩md_delete_sweep
󰱢md_delete_sweep_outline
󰆳md_delete_variant
󰇂md_delta
󱈹md_desk
󰥟md_desk_lamp
󰇃md_deskphone
󰟀md_desktop_classic
󰇄md_desktop_mac
󰧨md_desktop_mac_dashboard
󰇅md_desktop_tower
󰪫md_desktop_tower_monitor
󰇆md_details
󰵮md_dev_to
󰚗md_developer_board
󰇇md_deviantart
󰾰md_devices
󰥋md_dharmachakra
󱄦md_diabetes
󰘜md_dialpad
󰱣md_diameter
󰱤md_diameter_outline
󰱥md_diameter_variant
󰮊md_diamond
󰮋md_diamond_outline
󰇈md_diamond_stone
󰇊md_dice_1
󱅊md_dice_1_outline
󰇋md_dice_2
󱅋md_dice_2_outline
󰇌md_dice_3
󱅌md_dice_3_outline
󰇍md_dice_4
󱅍md_dice_4_outline
󰇎md_dice_5
󱅎md_dice_5_outline
󰇏md_dice_6
󱅏md_dice_6_outline
󱅐md_dice_d4
󰗫md_dice_d4_outline
󱅑md_dice_d6
󰗭md_dice_d6_outline
󱅒md_dice_d8
󰗬md_dice_d8_outline
󱅓md_dice_d10
󰝯md_dice_d10_outline
󱅔md_dice_d12
󰡧md_dice_d12_outline
󱅕md_dice_d20
󰗪md_dice_d20_outline
󰝮md_dice_multiple
󱅖md_dice_multiple_outline
󱈷md_digital_ocean
󰟁md_dip_switch
󰇐md_directions
󰙁md_directions_fork
󰗮md_disc
󰇑md_disc_alert
󰥠md_disc_player
󰙯md_discord
󰪬md_dishwasher
󱆸md_dishwasher_alert
󱆹md_dishwasher_off
󰇒md_disqus
󱇉md_distribute_horizontal_center
󱇈md_distribute_horizontal_left
󱇊md_distribute_horizontal_right
󱇋md_distribute_vertical_bottom
󱇌md_distribute_vertical_center
󱇍md_distribute_vertical_top
󱡷md_diversify
󱥷md_diving
󰶿md_diving_flippers
󰷀md_diving_helmet
󰷁md_diving_scuba
󰷂md_diving_scuba_flag
󰷃md_diving_scuba_tank
󰷄md_diving_scuba_tank_multiple
󰷅md_diving_snorkel
󰇔md_division
󰇕md_division_box
󰩁md_dlna
󰚄md_dna
󰇖md_dns
󰮌md_dns_outline
󱂩md_dock_bottom
󱂪md_dock_left
󱂫md_dock_right
󱔓md_dock_top
󱂬md_dock_window
󰡨md_docker
󰩂md_doctor
󰩃md_dog
󰪭md_dog_service
󰩄md_dog_side
󱛮md_dog_side_off
󰚳md_dolby
󰺞md_dolly
󱢴md_dolphin
󰇗md_domain
󰵯md_domain_off
󱂭md_domain_plus
󱂮md_domain_remove
󱐞md_dome_light
󱀣md_domino_mask
󰟂md_donkey
󰠚md_door
󰠛md_door_closed
󱂯md_door_closed_lock
󰠜md_door_open
󱠞md_door_sliding
󱠟md_door_sliding_lock
󱠠md_door_sliding_open
󱋦md_doorbell
󰡩md_doorbell_video
󰪮md_dot_net
󱥸md_dots_circle
󱗼md_dots_grid
󱗿md_dots_hexagon
󰇘md_dots_horizontal
󰟃md_dots_horizontal_circle
󰮍md_dots_horizontal_circle_outline
󱗽md_dots_square
󱗾md_dots_triangle
󰇙md_dots_vertical
󰟄md_dots_vertical_circle
󰮎md_dots_vertical_circle_outline
󰇚md_download
󱑢md_download_box
󱑣md_download_box_outline
󱑤md_download_circle
󱑥md_download_circle_outline
󱌠md_download_lock
󱌡md_download_lock_outline
󰧩md_download_multiple
󰛴md_download_network
󰱦md_download_network_outline
󱂰md_download_off
󱂱md_download_off_outline
󰮏md_download_outline
󰇛md_drag
󰇜md_drag_horizontal
󱋰md_drag_horizontal_variant
󰮐md_drag_variant
󰇝md_drag_vertical
󱋱md_drag_vertical_variant
󰴂md_drama_masks
󰽉md_draw
󱦹md_draw_pen
󰇞md_drawing
󰇟md_drawing_box
󰽊md_dresser
󰽋md_dresser_outline
󰇢md_drone
󰇣md_dropbox
󰇤md_drupal
󰇥md_duck
󰇦md_dumbbell
󰱧md_dump_truck
󰟅md_ear_hearing
󱫮md_ear_hearing_loop
󰩅md_ear_hearing_off
󱡏md_earbuds
󱡐md_earbuds_off
󱡑md_earbuds_off_outline
󱡒md_earbuds_outline
󰇧md_earth
󱌑md_earth_arrow_right
󰛍md_earth_box
󱐇md_earth_box_minus
󰛎md_earth_box_off
󱐆md_earth_box_plus
󱐈md_earth_box_remove
󱐄md_earth_minus
󰇨md_earth_off
󱐃md_earth_plus
󱐅md_earth_remove
󰪯md_egg
󰪰md_egg_easter
󱡊md_egg_fried
󱏰md_egg_off
󱏱md_egg_off_outline
󱏲md_egg_outline
󱕫md_eiffel_tower
󰧪md_eight_track
󰇪md_eject
󰮑md_eject_outline
󰺟md_electric_switch
󱃙md_electric_switch_closed
󱀤md_electron_framework
󰟆md_elephant
󰇫md_elevation_decline
󰇬md_elevation_rise
󰇭md_elevator
󱋂md_elevator_down
󱎁md_elevator_passenger
󱥹md_elevator_passenger_off
󱥺md_elevator_passenger_off_outline
󱥻md_elevator_passenger_outline
󱋁md_elevator_up
󰺠md_ellipse
󰺡md_ellipse_outline
󰇮md_email
󰛏md_email_alert
󰵂md_email_alert_outline
󰴃md_email_box
󰪱md_email_check
󰪲md_email_check_outline
󰻣md_email_edit
󰻤md_email_edit_outline
󱡯md_email_fast
󱡰md_email_fast_outline
󰇱md_email_lock
󰮒md_email_mark_as_unread
󰻥md_email_minus
󰻦md_email_minus_outline
󰻧md_email_multiple
󰻨md_email_multiple_outline
󰾱md_email_newsletter
󱏣md_email_off
󱏤md_email_off_outline
󰇯md_email_open
󰻩md_email_open_multiple
󰻪md_email_open_multiple_outline
󰗯md_email_open_outline
󰇰md_email_outline
󰧫md_email_plus
󰧬md_email_plus_outline
󱃚md_email_receive
󱃛md_email_receive_outline
󱙡md_email_remove
󱙢md_email_remove_outline
󱥛md_email_seal
󱥜md_email_seal_outline
󰥡md_email_search
󰥢md_email_search_outline
󱃜md_email_send
󱃝md_email_send_outline
󱋇md_email_sync
󱋈md_email_sync_outline
󰗰md_email_variant
󰬰md_ember
󰚴md_emby
󰱨md_emoticon
󰱩md_emoticon_angry
󰱪md_emoticon_angry_outline
󱃞md_emoticon_confused
󱃟md_emoticon_confused_outline
󰱫md_emoticon_cool
󰇳md_emoticon_cool_outline
󰱬md_emoticon_cry
󰱭md_emoticon_cry_outline
󰱮md_emoticon_dead
󰚛md_emoticon_dead_outline
󰱯md_emoticon_devil
󰇴md_emoticon_devil_outline
󰱰md_emoticon_excited
󰚜md_emoticon_excited_outline
󰽌md_emoticon_frown
󰽍md_emoticon_frown_outline
󰱱md_emoticon_happy
󰇵md_emoticon_happy_outline
󰱲md_emoticon_kiss
󰱳md_emoticon_kiss_outline
󱈔md_emoticon_lol
󱈕md_emoticon_lol_outline
󰱴md_emoticon_neutral
󰇶md_emoticon_neutral_outline
󰇲md_emoticon_outline
󰇷md_emoticon_poop
󰱵md_emoticon_poop_outline
󰱶md_emoticon_sad
󰇸md_emoticon_sad_outline
󱕼md_emoticon_sick
󱕽md_emoticon_sick_outline
󰇹md_emoticon_tongue
󰱷md_emoticon_tongue_outline
󰱸md_emoticon_wink
󰱹md_emoticon_wink_outline
󰇺md_engine
󰩆md_engine_off
󰩇md_engine_off_outline
󰇻md_engine_outline
󱃠md_epsilon
󰇼md_equal
󰇽md_equal_box
󰺢md_equalizer
󰺣md_equalizer_outline
󰇾md_eraser
󰙂md_eraser_variant
󰇿md_escalator
󱎙md_escalator_box
󱋀md_escalator_down
󱊿md_escalator_up
󰱺md_eslint
󰪳md_et
󰡪md_ethereum
󰈀md_ethernet
󰈁md_ethernet_cable
󰈂md_ethernet_cable_off
󱔙md_ev_plug_ccs1
󱔚md_ev_plug_ccs2
󱔛md_ev_plug_chademo
󱔜md_ev_plug_tesla
󱔝md_ev_plug_type1
󱔞md_ev_plug_type2
󰗱md_ev_station
󰈄md_evernote
󱀥md_excavator
󰈅md_exclamation
󱈸md_exclamation_thick
󰩈md_exit_run
󰈆md_exit_to_app
󰪴md_expand_all
󰪵md_expand_all_outline
󰢮md_expansion_card
󰾲md_expansion_card_variant
󰥣md_exponent
󰥤md_exponent_box
󰈇md_export
󰮓md_export_variant
󰈈md_eye
󱣽md_eye_arrow_left
󱣾md_eye_arrow_left_outline
󱣿md_eye_arrow_right
󱤀md_eye_arrow_right_outline
󰴄md_eye_check
󰴅md_eye_check_outline
󰮔md_eye_circle
󰮕md_eye_circle_outline
󱀦md_eye_minus
󱀧md_eye_minus_outline
󰈉md_eye_off
󰛑md_eye_off_outline
󰛐md_eye_outline
󰡫md_eye_plus
󰡬md_eye_plus_outline
󱥼md_eye_refresh
󱥽md_eye_refresh_outline
󱗣md_eye_remove
󱗤md_eye_remove_outline
󰡭md_eye_settings
󰡮md_eye_settings_outline
󰈊md_eyedropper
󱏝md_eyedropper_minus
󱏟md_eyedropper_off
󱏜md_eyedropper_plus
󱏞md_eyedropper_remove
󰈋md_eyedropper_variant
󰵰md_face_agent
󰙃md_face_man
󰮖md_face_man_outline
󰙄md_face_man_profile
󱗌md_face_man_shimmer
󱗍md_face_man_shimmer_outline
󱖆md_face_mask
󱖇md_face_mask_outline
󰱻md_face_recognition
󱁷md_face_woman
󱁸md_face_woman_outline
󱁶md_face_woman_profile
󱗎md_face_woman_shimmer
󱗏md_face_woman_shimmer_outline
󰈌md_facebook
󰟝md_facebook_gaming
󰈎md_facebook_messenger
󰬱md_facebook_workplace
󰈏md_factory
󱘎md_family_tree
󰈐md_fan
󱑬md_fan_alert
󱜝md_fan_auto
󱑭md_fan_chevron_down
󱑮md_fan_chevron_up
󱨺md_fan_clock
󱑰md_fan_minus
󰠝md_fan_off
󱑯md_fan_plus
󱑱md_fan_remove
󱑲md_fan_speed_1
󱑳md_fan_speed_2
󱑴md_fan_speed_3
󰈑md_fast_forward
󱇸md_fast_forward_5
󰵱md_fast_forward_10
󱤺md_fast_forward_15
󰴆md_fast_forward_30
󱘋md_fast_forward_60
󰛒md_fast_forward_outline
󰈒md_fax
󰛓md_feather
󰩉md_feature_search
󰩊md_feature_search_outline
󰣛md_fedora
󱞚md_fence
󱟶md_fence_electric
󱓁md_fencing
󰺤md_ferris_wheel
󰈓md_ferry
󰈔md_file
󰜻md_file_account
󱀨md_file_account_outline
󰩋md_file_alert
󰩌md_file_alert_outline
󱪓md_file_arrow_left_right
󱪔md_file_arrow_left_right_outline
󱪕md_file_arrow_up_down
󱪖md_file_arrow_up_down_outline
󰪶md_file_cabinet
󰻫md_file_cad
󰻬md_file_cad_box
󰷆md_file_cancel
󰷇md_file_cancel_outline
󱆆md_file_certificate
󱆇md_file_certificate_outline
󰈕md_file_chart
󱧆md_file_chart_check
󱧇md_file_chart_check_outline
󱀩md_file_chart_outline
󰈖md_file_check
󰸩md_file_check_outline
󱋡md_file_clock
󱋢md_file_clock_outline
󰈗md_file_cloud
󱀪md_file_cloud_outline
󰈮md_file_code
󱀫md_file_code_outline
󱁻md_file_cog
󱁼md_file_cog_outline
󰢪md_file_compare
󰈘md_file_delimited
󰺥md_file_delimited_outline
󰈙md_file_document
󱪗md_file_document_alert
󱪘md_file_document_alert_outline
󱪙md_file_document_check
󱪚md_file_document_check_outline
󰷈md_file_document_edit
󰷉md_file_document_edit_outline
󱪛md_file_document_minus
󱪜md_file_document_minus_outline
󱔗md_file_document_multiple
󱔘md_file_document_multiple_outline
󰧮md_file_document_outline
󱪝md_file_document_plus
󱪞md_file_document_plus_outline
󱪟md_file_document_remove
󱪠md_file_document_remove_outline
󰥥md_file_download
󰥦md_file_download_outline
󱇧md_file_edit
󱇨md_file_edit_outline
󰈛md_file_excel
󰈜md_file_excel_box
󱀬md_file_excel_box_outline
󱀭md_file_excel_outline
󰈝md_file_export
󱀮md_file_export_outline
󰷊md_file_eye
󰷋md_file_eye_outline
󰈞md_file_find
󰮗md_file_find_outline
󰵸md_file_gif_box
󰘓md_file_hidden
󰈟md_file_image
󱝲md_file_image_marker
󱝳md_file_image_marker_outline
󱤻md_file_image_minus
󱤼md_file_image_minus_outline
󰺰md_file_image_outline
󱤽md_file_image_plus
󱤾md_file_image_plus_outline
󱤿md_file_image_remove
󱥀md_file_image_remove_outline
󰈠md_file_import
󱀯md_file_import_outline
󰈥md_file_jpg_box
󱆄md_file_key
󱆅md_file_key_outline
󱅷md_file_link
󱅸md_file_link_outline
󰈡md_file_lock
󱧈md_file_lock_open
󱧉md_file_lock_open_outline
󱀰md_file_lock_outline
󱝴md_file_marker
󱝵md_file_marker_outline
󱪡md_file_minus
󱪢md_file_minus_outline
󰪹md_file_move
󱀱md_file_move_outline
󰈢md_file_multiple
󱀲md_file_multiple_outline
󰈣md_file_music
󰸪md_file_music_outline
󰈤md_file_outline
󰈦md_file_pdf_box
󰠞md_file_percent
󱀳md_file_percent_outline
󱅹md_file_phone
󱅺md_file_phone_outline
󰝒md_file_plus
󰻭md_file_plus_outline
󰸭md_file_png_box
󰈧md_file_powerpoint
󰈨md_file_powerpoint_box
󱀴md_file_powerpoint_box_outline
󱀵md_file_powerpoint_outline
󰈩md_file_presentation_box
󰡯md_file_question
󱀶md_file_question_outline
󰤘md_file_refresh
󰕁md_file_refresh_outline
󰮘md_file_remove
󱀷md_file_remove_outline
󰬲md_file_replace
󰬳md_file_replace_outline
󰙰md_file_restore
󱀸md_file_restore_outline
󱨻md_file_rotate_left
󱨼md_file_rotate_left_outline
󱨽md_file_rotate_right
󱨾md_file_rotate_right_outline
󰱼md_file_search
󰱽md_file_search_outline
󰈪md_file_send
󱀹md_file_send_outline
󱁹md_file_settings
󱁺md_file_settings_outline
󱧃md_file_sign
󱀺md_file_star
󱀻md_file_star_outline
󰾴md_file_swap
󰾵md_file_swap_outline
󱈖md_file_sync
󱈗md_file_sync_outline
󰱾md_file_table
󱃡md_file_table_box
󱃢md_file_table_box_multiple
󱃣md_file_table_box_multiple_outline
󱃤md_file_table_box_outline
󰱿md_file_table_outline
󰙅md_file_tree
󱏒md_file_tree_outline
󰣜md_file_undo
󱀼md_file_undo_outline
󰩍md_file_upload
󰩎md_file_upload_outline
󰈫md_file_video
󰸬md_file_video_outline
󰈬md_file_word
󰈭md_file_word_box
󱀽md_file_word_box_outline
󱀾md_file_word_outline
󰈯md_film
󰈰md_filmstrip
󰌲md_filmstrip_box
󰴘md_filmstrip_box_multiple
󰈱md_filmstrip_off
󰈲md_filter
󱣬md_filter_check
󱣭md_filter_check_outline
󱪣md_filter_cog
󱪤md_filter_cog_outline
󱃥md_filter_menu
󱃦md_filter_menu_outline
󰻮md_filter_minus
󰻯md_filter_minus_outline
󱨿md_filter_multiple
󱩀md_filter_multiple_outline
󱓯md_filter_off
󱓰md_filter_off_outline
󰈳md_filter_outline
󰻰md_filter_plus
󰻱md_filter_plus_outline
󰈴md_filter_remove
󰈵md_filter_remove_outline
󱪥md_filter_settings
󱪦md_filter_settings_outline
󰈶md_filter_variant
󱄒md_filter_variant_minus
󱄓md_filter_variant_plus
󱀿md_filter_variant_remove
󰠟md_finance
󰛔md_find_replace
󰈷md_fingerprint
󰺱md_fingerprint_off
󰈸md_fire
󱗗md_fire_alert
󱠇md_fire_circle
󰻲md_fire_extinguisher
󱄷md_fire_hydrant
󱄸md_fire_hydrant_alert
󱄹md_fire_hydrant_off
󱜢md_fire_off
󰢫md_fire_truck
󰥧md_firebase
󰈹md_firefox
󰸮md_fireplace
󰸯md_fireplace_off
󰖾md_firewire
󰸰md_firework
󱜣md_firework_off
󰈺md_fish
󱏳md_fish_off
󰻳md_fishbowl
󰻴md_fishbowl_outline
󰻵md_fit_to_page
󰻶md_fit_to_page_outline
󱣴md_fit_to_screen
󱣵md_fit_to_screen_outline
󰈻md_flag
󰈼md_flag_checkered
󰮙md_flag_minus
󱂲md_flag_minus_outline
󱣮md_flag_off
󱣯md_flag_off_outline
󰈽md_flag_outline
󰮚md_flag_plus
󱂳md_flag_plus_outline
󰮛md_flag_remove
󱂴md_flag_remove_outline
󰈿md_flag_triangle
󰉀md_flag_variant
󰈾md_flag_variant_outline
󰵲md_flare
󰉁md_flash
󰻷md_flash_alert
󰻸md_flash_alert_outline
󰉂md_flash_auto
󰉃md_flash_off
󰛕md_flash_outline
󰙻md_flash_red_eye
󰉄md_flashlight
󰉅md_flashlight_off
󰂓md_flask
󰂔md_flask_empty
󱈺md_flask_empty_minus
󱈻md_flask_empty_minus_outline
󱏴md_flask_empty_off
󱏵md_flask_empty_off_outline
󰂕md_flask_empty_outline
󱈼md_flask_empty_plus
󱈽md_flask_empty_plus_outline
󱈾md_flask_empty_remove
󱈿md_flask_empty_remove_outline
󱉀md_flask_minus
󱉁md_flask_minus_outline
󱏶md_flask_off
󱏷md_flask_off_outline
󰂖md_flask_outline
󱉂md_flask_plus
󱉃md_flask_plus_outline
󱉄md_flask_remove
󱉅md_flask_remove_outline
󱉋md_flask_round_bottom
󱉌md_flask_round_bottom_empty
󱉍md_flask_round_bottom_empty_outline
󱉎md_flask_round_bottom_outline
󱌃md_fleur_de_lis
󱃧md_flip_horizontal
󰉇md_flip_to_back
󰉈md_flip_to_front
󱃨md_flip_vertical
󰣝md_floor_lamp
󱁀md_floor_lamp_dual
󱟎md_floor_lamp_dual_outline
󱟈md_floor_lamp_outline
󱝇md_floor_lamp_torchiere
󱟖md_floor_lamp_torchiere_outline
󱁁md_floor_lamp_torchiere_variant
󱟏md_floor_lamp_torchiere_variant_outline
󰠡md_floor_plan
󰉉md_floppy
󰧯md_floppy_variant
󰉊md_flower
󰧰md_flower_outline
󱢅md_flower_pollen
󱢆md_flower_pollen_outline
󰴈md_flower_poppy
󰧱md_flower_tulip
󰧲md_flower_tulip_outline
󰽎md_focus_auto
󰽏md_focus_field
󰽐md_focus_field_horizontal
󰽑md_focus_field_vertical
󰉋md_folder
󰉌md_folder_account
󰮜md_folder_account_outline
󰷌md_folder_alert
󰷍md_folder_alert_outline
󱧨md_folder_arrow_down
󱧩md_folder_arrow_down_outline
󱧪md_folder_arrow_left
󱧫md_folder_arrow_left_outline
󱧬md_folder_arrow_left_right
󱧭md_folder_arrow_left_right_outline
󱧮md_folder_arrow_right
󱧯md_folder_arrow_right_outline
󱧰md_folder_arrow_up
󱧱md_folder_arrow_up_down
󱧲md_folder_arrow_up_down_outline
󱧳md_folder_arrow_up_outline
󱧴md_folder_cancel
󱧵md_folder_cancel_outline
󱥾md_folder_check
󱥿md_folder_check_outline
󰪺md_folder_clock
󰪻md_folder_clock_outline
󱁿md_folder_cog
󱂀md_folder_cog_outline
󰉍md_folder_download
󱃩md_folder_download_outline
󰣞md_folder_edit
󰷎md_folder_edit_outline
󱞊md_folder_eye
󱞋md_folder_eye_outline
󱧶md_folder_file
󱧷md_folder_file_outline
󰉎md_folder_google_drive
󱃪md_folder_heart
󱃫md_folder_heart_outline
󱞞md_folder_hidden
󱂵md_folder_home
󱂶md_folder_home_outline
󰉏md_folder_image
󱂷md_folder_information
󱂸md_folder_information_outline
󰢬md_folder_key
󰢭md_folder_key_network
󰲀md_folder_key_network_outline
󱃬md_folder_key_outline
󰉐md_folder_lock
󰉑md_folder_lock_open
󱪧md_folder_lock_open_outline
󱪨md_folder_lock_outline
󱉭md_folder_marker
󱉮md_folder_marker_outline
󰉒md_folder_move
󱉆md_folder_move_outline
󰉓md_folder_multiple
󰉔md_folder_multiple_image
󰉕md_folder_multiple_outline
󱑾md_folder_multiple_plus
󱑿md_folder_multiple_plus_outline
󱍙md_folder_music
󱍚md_folder_music_outline
󰡰md_folder_network
󰲁md_folder_network_outline
󱧸md_folder_off
󱧹md_folder_off_outline
󰝰md_folder_open
󰷏md_folder_open_outline
󰉖md_folder_outline
󱧺md_folder_play
󱧻md_folder_play_outline
󰉗md_folder_plus
󰮝md_folder_plus_outline
󰴉md_folder_pound
󰴊md_folder_pound_outline
󱧊md_folder_question
󱧋md_folder_question_outline
󰝉md_folder_refresh
󰕂md_folder_refresh_outline
󰉘md_folder_remove
󰮞md_folder_remove_outline
󰥨md_folder_search
󰥩md_folder_search_outline
󱁽md_folder_settings
󱁾md_folder_settings_outline
󰚝md_folder_star
󱏓md_folder_star_multiple
󱏔md_folder_star_multiple_outline
󰮟md_folder_star_outline
󰾶md_folder_swap
󰾷md_folder_swap_outline
󰴋md_folder_sync
󰴌md_folder_sync_outline
󱋣md_folder_table
󱋤md_folder_table_outline
󰲂md_folder_text
󰲃md_folder_text_outline
󰉙md_folder_upload
󱃭md_folder_upload_outline
󱧼md_folder_wrench
󱧽md_folder_wrench_outline
󰛫md_folder_zip
󰞹md_folder_zip_outline
󰀺md_font_awesome
󰉚md_food
󰉛md_food_apple
󰲄md_food_apple_outline
󰟈md_food_croissant
󱐟md_food_drumstick
󱑨md_food_drumstick_off
󱑩md_food_drumstick_off_outline
󱐠md_food_drumstick_outline
󰗲md_food_fork_drink
󱕲md_food_halal
󱡋md_food_hot_dog
󱕳md_food_kosher
󰗳md_food_off
󱤕md_food_off_outline
󱤖md_food_outline
󱑪md_food_steak
󱑫md_food_steak_off
󱠶md_food_takeout_box
󱠷md_food_takeout_box_outline
󱜜md_food_turkey
󰉜md_food_variant
󱏥md_food_variant_off
󰽒md_foot_print
󰉝md_football
󰉞md_football_australian
󰉟md_football_helmet
󱢗md_forest
󰟉md_forklift
󱐀md_form_dropdown
󱐁md_form_select
󱂕md_form_textarea
󰘎md_form_textbox
󱍝md_form_textbox_lock
󰟵md_form_textbox_password
󰝓md_format_align_bottom
󰉠md_format_align_center
󰉡md_format_align_justify
󰉢md_format_align_left
󰝔md_format_align_middle
󰉣md_format_align_right
󰝕md_format_align_top
󰪼md_format_annotation_minus
󰙆md_format_annotation_plus
󰉤md_format_bold
󰉥md_format_clear
󰉦md_format_color_fill
󰸱md_format_color_highlight
󱌓md_format_color_marker_cancel
󰚞md_format_color_text
󰣟md_format_columns
󰉧md_format_float_center
󰉨md_format_float_left
󰉩md_format_float_none
󰉪md_format_float_right
󰛖md_format_font
󰧳md_format_font_size_decrease
󰧴md_format_font_size_increase
󰉫md_format_header_1
󰉬md_format_header_2
󰉭md_format_header_3
󰉮md_format_header_4
󰉯md_format_header_5
󰉰md_format_header_6
󰉱md_format_header_decrease
󰉲md_format_header_equal
󰉳md_format_header_increase
󰉴md_format_header_pound
󰘞md_format_horizontal_align_center
󰘟md_format_horizontal_align_left
󰘠md_format_horizontal_align_right
󰉵md_format_indent_decrease
󰉶md_format_indent_increase
󰉷md_format_italic
󰬴md_format_letter_case
󰬵md_format_letter_case_lower
󰬶md_format_letter_case_upper
󰾸md_format_letter_ends_with
󰾹md_format_letter_matches
󱥖md_format_letter_spacing
󰾺md_format_letter_starts_with
󰉸md_format_line_spacing
󰗈md_format_line_style
󰗉md_format_line_weight
󰉹md_format_list_bulleted
󰷐md_format_list_bulleted_square
󰺲md_format_list_bulleted_triangle
󰉺md_format_list_bulleted_type
󰥪md_format_list_checkbox
󰝖md_format_list_checks
󱡠md_format_list_group
󰉻md_format_list_numbered
󰴍md_format_list_numbered_rtl
󱉯md_format_list_text
󰺳md_format_overline
󰛗md_format_page_break
󱤗md_format_page_split
󰉼md_format_paint
󰉽md_format_paragraph
󰛘md_format_pilcrow
󰉾md_format_quote_close
󱆨md_format_quote_close_outline
󰝗md_format_quote_open
󱆧md_format_quote_open_outline
󰚪md_format_rotate_90
󰚟md_format_section
󰉿md_format_size
󰊀md_format_strikethrough
󰊁md_format_strikethrough_variant
󰊂md_format_subscript
󰊃md_format_superscript
󰊄md_format_text
󰾻md_format_text_rotation_angle_down
󰾼md_format_text_rotation_angle_up
󰵳md_format_text_rotation_down
󰾽md_format_text_rotation_down_vertical
󰵴md_format_text_rotation_none
󰾾md_format_text_rotation_up
󰾿md_format_text_rotation_vertical
󰸲md_format_text_variant
󱔏md_format_text_variant_outline
󰴎md_format_text_wrapping_clip
󰴏md_format_text_wrapping_overflow
󰴐md_format_text_wrapping_wrap
󰴑md_format_textbox
󰊅md_format_textdirection_l_to_r
󰊆md_format_textdirection_r_to_l
󰗴md_format_title
󰊇md_format_underline
󱣩md_format_underline_wavy
󰘡md_format_vertical_align_bottom
󰘢md_format_vertical_align_center
󰘣md_format_vertical_align_top
󰊈md_format_wrap_inline
󰊉md_format_wrap_square
󰊊md_format_wrap_tight
󰊋md_format_wrap_top_bottom
󰊌md_forum
󱪩md_forum_minus
󱪪md_forum_minus_outline
󰠢md_forum_outline
󱪫md_forum_plus
󱪬md_forum_plus_outline
󱪭md_forum_remove
󱪮md_forum_remove_outline
󰊍md_forward
󰵵md_forwardburger
󰥫md_fountain
󰴒md_fountain_pen
󰴓md_fountain_pen_tip
󱦒md_fraction_one_half
󰣠md_freebsd
󱥗md_french_fries
󰺴md_frequently_asked_questions
󰊐md_fridge
󱆱md_fridge_alert
󱆲md_fridge_alert_outline
󰊒md_fridge_bottom
󱗮md_fridge_industrial
󱗯md_fridge_industrial_alert
󱗰md_fridge_industrial_alert_outline
󱗱md_fridge_industrial_off
󱗲md_fridge_industrial_off_outline
󱗳md_fridge_industrial_outline
󱆯md_fridge_off
󱆰md_fridge_off_outline
󰊏md_fridge_outline
󰊑md_fridge_top
󱗴md_fridge_variant
󱗵md_fridge_variant_alert
󱗶md_fridge_variant_alert_outline
󱗷md_fridge_variant_off
󱗸md_fridge_variant_off_outline
󱗹md_fridge_variant_outline
󱁂md_fruit_cherries
󱏸md_fruit_cherries_off
󱁃md_fruit_citrus
󱏹md_fruit_citrus_off
󱁄md_fruit_grapes
󱁅md_fruit_grapes_outline
󱨎md_fruit_pear
󱁆md_fruit_pineapple
󱁇md_fruit_watermelon
󰟊md_fuel
󱢵md_fuel_cell
󰊓md_fullscreen
󰊔md_fullscreen_exit
󰊕md_function
󰡱md_function_variant
󱂁md_furigana_horizontal
󱂂md_furigana_vertical
󰲅md_fuse
󱐭md_fuse_alert
󰲆md_fuse_blade
󱐬md_fuse_off
󰊖md_gamepad
󰸳md_gamepad_circle
󰸴md_gamepad_circle_down
󰸵md_gamepad_circle_left
󰸶md_gamepad_circle_outline
󰸷md_gamepad_circle_right
󰸸md_gamepad_circle_up
󰸹md_gamepad_down
󰸺md_gamepad_left
󱤙md_gamepad_outline
󰸻md_gamepad_right
󰸼md_gamepad_round
󰸽md_gamepad_round_down
󰸾md_gamepad_round_left
󰸿md_gamepad_round_outline
󰹀md_gamepad_round_right
󰹁md_gamepad_round_up
󰺵md_gamepad_square
󰺶md_gamepad_square_outline
󰹂md_gamepad_up
󰊗md_gamepad_variant
󰺷md_gamepad_variant_outline
󱃮md_gamma
󰷑md_gantry_crane
󰛙md_garage
󰡲md_garage_alert
󱋕md_garage_alert_variant
󱟻md_garage_lock
󰛚md_garage_open
󱋔md_garage_open_variant
󱋓md_garage_variant
󱟼md_garage_variant_lock
󱨛md_gas_burner
󰙇md_gas_cylinder
󰊘md_gas_station
󱐉md_gas_station_off
󱐊md_gas_station_off_outline
󰺸md_gas_station_outline
󰊙md_gate
󱟸md_gate_alert
󰣡md_gate_and
󱟷md_gate_arrow_left
󱅩md_gate_arrow_right
󰣢md_gate_nand
󰣣md_gate_nor
󰣤md_gate_not
󱅪md_gate_open
󰣥md_gate_or
󰣦md_gate_xnor
󰣧md_gate_xor
󰹃md_gatsby
󰊚md_gauge
󰡳md_gauge_empty
󰡴md_gauge_full
󰡵md_gauge_low
󰊛md_gavel
󰊜md_gender_female
󰊝md_gender_male
󰊞md_gender_male_female
󱄿md_gender_male_female_variant
󱅀md_gender_non_binary
󰊟md_gender_transgender
󰣨md_gentoo
󰟋md_gesture
󰜼md_gesture_double_tap
󰪽md_gesture_pinch
󰪾md_gesture_spread
󰵶md_gesture_swipe
󰜽md_gesture_swipe_down
󰪿md_gesture_swipe_horizontal
󰜾md_gesture_swipe_left
󰜿md_gesture_swipe_right
󰝀md_gesture_swipe_up
󰫀md_gesture_swipe_vertical
󰝁md_gesture_tap
󱊩md_gesture_tap_box
󱊨md_gesture_tap_button
󰵷md_gesture_tap_hold
󰝂md_gesture_two_double_tap
󰝃md_gesture_two_tap
󰊠md_ghost
󰧵md_ghost_off
󱙜md_ghost_off_outline
󱙝md_ghost_outline
󰹄md_gift
󱛯md_gift_off
󱛰md_gift_off_outline
󱛱md_gift_open
󱛲md_gift_open_outline
󰊡md_gift_outline
󰊢md_git
󰊤md_github
󰮠md_gitlab
󰍖md_glass_cocktail
󱗦md_glass_cocktail_off
󰊥md_glass_flute
󱡳md_glass_fragile
󰊦md_glass_mug
󱗧md_glass_mug_off
󱄖md_glass_mug_variant
󱗨md_glass_mug_variant_off
󱌍md_glass_pint_outline
󰊧md_glass_stange
󰊨md_glass_tulip
󰡶md_glass_wine
󰊪md_glasses
󱋗md_globe_light
󰣩md_globe_model
󰊫md_gmail
󰊬md_gnome
󰵹md_go_kart
󰵺md_go_kart_track
󰮡md_gog
󱉏md_gold
󰠣md_golf
󱆤md_golf_cart
󱂃md_golf_tee
󰚆md_gondola
󰵻md_goodreads
󰊭md_google
󰲇md_google_ads
󰟌md_google_analytics
󰟍md_google_assistant
󰊮md_google_cardboard
󰊯md_google_chrome
󰊰md_google_circles
󰊱md_google_circles_communities
󰊲md_google_circles_extended
󰊳md_google_circles_group
󰋀md_google_classroom
󱇶md_google_cloud
󰊴md_google_controller
󰊵md_google_controller_off
󱍢md_google_downasaur
󰊶md_google_drive
󰊷md_google_earth
󰥬md_google_fit
󰊸md_google_glass
󰋉md_google_hangouts
󰠤md_google_home
󰛜md_google_keep
󰧶md_google_lens
󰗵md_google_maps
󱁈md_google_my_business
󰊹md_google_nearby
󰊼md_google_play
󰊽md_google_plus
󰺹md_google_podcast
󰧷md_google_spreadsheet
󰲈md_google_street_view
󰊿md_google_translate
󱝊md_gradient_horizontal
󰚠md_gradient_vertical
󰵼md_grain
󱁉md_graph
󱁊md_graph_outline
󰡷md_graphql
󱔐md_grass
󰮢md_grave_stone
󰙈md_grease_pencil
󰥭md_greater_than
󰥮md_greater_than_or_equal
󰀭md_greenhouse
󰋁md_grid
󰝘md_grid_large
󰋂md_grid_off
󰹅md_grill
󱆊md_grill_outline
󰋃md_group
󰝱md_guitar_acoustic
󰋄md_guitar_electric
󰋅md_guitar_pick
󰋆md_guitar_pick_outline
󰠥md_guy_fawkes_mask
󱩁md_gymnastics
󰫁md_hail
󱃯md_hair_dryer
󱃰md_hair_dryer_outline
󰮣md_halloween
󰚅md_hamburger
󱝶md_hamburger_check
󱝷md_hamburger_minus
󱝸md_hamburger_off
󱝹md_hamburger_plus
󱝺md_hamburger_remove
󰣪md_hammer
󱌢md_hammer_screwdriver
󱢇md_hammer_sickle
󱌣md_hammer_wrench
󰹆md_hand_back_left
󱠰md_hand_back_left_off
󱠲md_hand_back_left_off_outline
󱠬md_hand_back_left_outline
󰹇md_hand_back_right
󱠱md_hand_back_right_off
󱠳md_hand_back_right_off_outline
󱠭md_hand_back_right_outline
󱥋md_hand_clap
󱩂md_hand_clap_off
󱢏md_hand_coin
󱢐md_hand_coin_outline
󱢶md_hand_extended
󱢷md_hand_extended_outline
󱠫md_hand_front_left
󱠮md_hand_front_left_outline
󰩏md_hand_front_right
󱠯md_hand_front_right_outline
󱃱md_hand_heart
󱕾md_hand_heart_outline
󰩐md_hand_okay
󰩑md_hand_peace
󰩒md_hand_peace_variant
󰩓md_hand_pointing_down
󰩔md_hand_pointing_left
󰋇md_hand_pointing_right
󰩕md_hand_pointing_up
󰹈md_hand_saw
󱕿md_hand_wash
󱖀md_hand_wash_outline
󱎟md_hand_water
󱠡md_hand_wave
󱠢md_hand_wave_outline
󰽓md_handball
󱄾md_handcuffs
󰕹md_hands_pray
󱈘md_handshake
󱖡md_handshake_outline
󰋈md_hanger
󰥯md_hard_hat
󰋊md_harddisk
󱁋md_harddisk_plus
󱁌md_harddisk_remove
󰮤md_hat_fedora
󰲉md_hazard_lights
󰵽md_hdr
󰵾md_hdr_off
󱍞md_head
󱌸md_head_alert
󱌹md_head_alert_outline
󱌺md_head_check
󱌻md_head_check_outline
󱌼md_head_cog
󱌽md_head_cog_outline
󱌾md_head_dots_horizontal
󱌿md_head_dots_horizontal_outline
󱍀md_head_flash
󱍁md_head_flash_outline
󱍂md_head_heart
󱍃md_head_heart_outline
󱍄md_head_lightbulb
󱍅md_head_lightbulb_outline
󱍆md_head_minus
󱍇md_head_minus_outline
󱍟md_head_outline
󱍈md_head_plus
󱍉md_head_plus_outline
󱍊md_head_question
󱍋md_head_question_outline
󱍌md_head_remove
󱍍md_head_remove_outline
󱍎md_head_snowflake
󱍏md_head_snowflake_outline
󱍐md_head_sync
󱍑md_head_sync_outline
󰋋md_headphones
󰥰md_headphones_bluetooth
󰋌md_headphones_box
󰟎md_headphones_off
󰋍md_headphones_settings
󰋎md_headset
󰋏md_headset_dock
󰋐md_headset_off
󰋑md_heart
󰋒md_heart_box
󰋓md_heart_box_outline
󰋔md_heart_broken
󰴔md_heart_broken_outline
󰥱md_heart_circle
󰥲md_heart_circle_outline
󱙣md_heart_cog
󱙤md_heart_cog_outline
󰻹md_heart_flash
󰛟md_heart_half
󰛞md_heart_half_full
󰛠md_heart_half_outline
󱐯md_heart_minus
󱐲md_heart_minus_outline
󰩖md_heart_multiple
󰩗md_heart_multiple_outline
󰝙md_heart_off
󱐴md_heart_off_outline
󰋕md_heart_outline
󱐮md_heart_plus
󱐱md_heart_plus_outline
󰗶md_heart_pulse
󱐰md_heart_remove
󱐳md_heart_remove_outline
󱙥md_heart_settings
󱙦md_heart_settings_outline
󱩃md_heat_pump
󱩄md_heat_pump_outline
󱩅md_heat_wave
󱪯md_heating_coil
󰫂md_helicopter
󰋖md_help
󰞋md_help_box
󰋗md_help_circle
󰘥md_help_circle_outline
󰛵md_help_network
󰲊md_help_network_outline
󰮥md_help_rhombus
󰮦md_help_rhombus_outline
󱊧md_hexadecimal
󰋘md_hexagon
󰛡md_hexagon_multiple
󱃲md_hexagon_multiple_outline
󰋙md_hexagon_outline
󰫃md_hexagon_slice_1
󰫄md_hexagon_slice_2
󰫅md_hexagon_slice_3
󰫆md_hexagon_slice_4
󰫇md_hexagon_slice_5
󰫈md_hexagon_slice_6
󰫉md_hexagram
󰫊md_hexagram_outline
󰟏md_high_definition
󰡸md_high_definition_box
󰗷md_highway
󰵿md_hiking
󰋚md_history
󰡹md_hockey_puck
󰡺md_hockey_sticks
󰋛md_hololens
󰋜md_home
󰠦md_home_account
󰡻md_home_alert
󱗐md_home_alert_outline
󰺺md_home_analytics
󰟐md_home_assistant
󰟑md_home_automation
󱤁md_home_battery
󱤂md_home_battery_outline
󰟒md_home_circle
󱁍md_home_circle_outline
󰴕md_home_city
󰴖md_home_city_outline
󱨒md_home_clock
󱨓md_home_clock_outline
󱅙md_home_edit
󱅚md_home_edit_outline
󰾛md_home_export_outline
󰻺md_home_flood
󰷒md_home_floor_0
󰶀md_home_floor_1
󰶁md_home_floor_2
󰶂md_home_floor_3
󰶃md_home_floor_a
󰶄md_home_floor_b
󰶅md_home_floor_g
󰶆md_home_floor_l
󰷓md_home_floor_negative_1
󰷔md_home_group
󱧁md_home_group_minus
󱧀md_home_group_plus
󱧂md_home_group_remove
󰠧md_home_heart
󰾜md_home_import_outline
󱉑md_home_lightbulb
󱉒md_home_lightbulb_outline
󱤃md_home_lightning_bolt
󱤄md_home_lightning_bolt_outline
󰣫md_home_lock
󰣬md_home_lock_open
󰗸md_home_map_marker
󰥴md_home_minus
󱏕md_home_minus_outline
󰋝md_home_modern
󱩆md_home_off
󱩇md_home_off_outline
󰚡md_home_outline
󰥵md_home_plus
󱏖md_home_plus_outline
󱉇md_home_remove
󱏗md_home_remove_outline
󱄫md_home_roof
󱎰md_home_search
󱎱md_home_search_outline
󱞔md_home_switch
󱞕md_home_switch_outline
󰽔md_home_thermometer
󰽕md_home_thermometer_outline
󰋞md_home_variant
󰮧md_home_variant_outline
󰛢md_hook
󰛣md_hook_off
󰹖md_hoop_house
󰋟md_hops
󱃳md_horizontal_rotate_clockwise
󱃴md_horizontal_rotate_counterclockwise
󱖿md_horse
󱗀md_horse_human
󱗁md_horse_variant
󱡮md_horse_variant_fast
󰩘md_horseshoe
󰿶md_hospital
󰋠md_hospital_box
󰿷md_hospital_box_outline
󰋡md_hospital_building
󰋢md_hospital_marker
󰠨md_hot_tub
󱑸md_hours_24
󰴗md_hubspot
󰠩md_hulu
󰋦md_human
󱎋md_human_baby_changing_table
󱖁md_human_cane
󱖛md_human_capacity_decrease
󱖜md_human_capacity_increase
󰋧md_human_child
󱦀md_human_dolly
󱓨md_human_edit
󰙉md_human_female
󰩙md_human_female_boy
󱗉md_human_female_dance
󰩚md_human_female_female
󰩛md_human_female_girl
󱟄md_human_greeting
󱖝md_human_greeting_proximity
󰙊md_human_greeting_variant
󰙋md_human_handsdown
󰙌md_human_handsup
󰙍md_human_male
󰢐md_human_male_board
󰡆md_human_male_board_poll
󰩜md_human_male_boy
󱎌md_human_male_child
󰋨md_human_male_female
󱠣md_human_male_female_child
󰩝md_human_male_girl
󰻻md_human_male_height
󰻼md_human_male_height_variant
󰩞md_human_male_male
󱡈md_human_non_binary
󰗏md_human_pregnant
󱕱md_human_queue
󱇩md_human_scooter
󱎍md_human_wheelchair
󱦁md_human_white_cane
󰝄md_humble_bundle
󱍒md_hvac
󱖞md_hvac_off
󱌤md_hydraulic_oil_level
󱌥md_hydraulic_oil_temperature
󱋥md_hydro_power
󱢔md_hydrogen_station
󰠪md_ice_cream
󰹒md_ice_cream_off
󰻽md_ice_pop
󰿀md_id_card
󰻾md_identifier
󱌱md_ideogram_cjk
󱌲md_ideogram_cjk_variant
󰋩md_image
󰋪md_image_album
󰋫md_image_area
󰋬md_image_area_close
󰿁md_image_auto_adjust
󰋭md_image_broken
󰋮md_image_broken_variant
󱇣md_image_edit
󱇤md_image_edit_outline
󰋰md_image_filter_black_white
󰋱md_image_filter_center_focus
󰻿md_image_filter_center_focus_strong
󰼀md_image_filter_center_focus_strong_outline
󰋲md_image_filter_center_focus_weak
󰋳md_image_filter_drama
󰋴md_image_filter_frames
󰋵md_image_filter_hdr
󰋶md_image_filter_none
󰋷md_image_filter_tilt_shift
󰋸md_image_filter_vintage
󰹉md_image_frame
󱪰md_image_lock
󱪱md_image_lock_outline
󱝻md_image_marker
󱝼md_image_marker_outline
󱐙md_image_minus
󰧸md_image_move
󰋹md_image_multiple
󰋯md_image_multiple_outline
󰠫md_image_off
󱇑md_image_off_outline
󰥶md_image_outline
󰡼md_image_plus
󱧾md_image_refresh
󱧿md_image_refresh_outline
󱐘md_image_remove
󰥷md_image_search
󰥸md_image_search_outline
󰲍md_image_size_select_actual
󰲎md_image_size_select_large
󰲏md_image_size_select_small
󱨀md_image_sync
󱨁md_image_sync_outline
󱘍md_image_text
󰋺md_import
󰚇md_inbox
󰋻md_inbox_arrow_down
󱉰md_inbox_arrow_down_outline
󰏑md_inbox_arrow_up
󱉱md_inbox_arrow_up_outline
󱉲md_inbox_full
󱉳md_inbox_full_outline
󰢰md_inbox_multiple
󰮨md_inbox_multiple_outline
󱉴md_inbox_outline
󱖟md_inbox_remove
󱖠md_inbox_remove_outline
󰗹md_incognito
󱐡md_incognito_circle
󱐢md_incognito_circle_off
󰁵md_incognito_off
󱡌md_induction
󰛤md_infinity
󰋼md_information
󱞌md_information_off
󱞍md_information_off_outline
󰋽md_information_outline
󰙎md_information_variant
󰋾md_instagram
󱁎md_instrument_triangle
󱤓md_integrated_circuit_chip
󰌁md_invert_colors
󰹊md_invert_colors_off
󱋨md_iobroker
󰩟md_ip
󰩠md_ip_network
󰲐md_ip_network_outline
󱦂md_ip_outline
󰲑md_ipod
󱠤md_iron
󱠸md_iron_board
󱠥md_iron_outline
󱁏md_island
󱂹md_iv_bag
󰷕md_jabber
󰌂md_jeepney
󰼁md_jellyfish
󰼂md_jellyfish_outline
󰌃md_jira
󰡽md_jquery
󰌄md_jsfiddle
󱋿md_jump_rope
󰶇md_kabaddi
󱕘md_kangaroo
󰠬md_karate
󰢯md_kayaking
󰌅md_keg
󰗺md_kettle
󱌗md_kettle_alert
󱌘md_kettle_alert_outline
󱌛md_kettle_off
󱌜md_kettle_off_outline
󰽖md_kettle_outline
󱜼md_kettle_pour_over
󱌙md_kettle_steam
󱌚md_kettle_steam_outline
󱌀md_kettlebell
󰌆md_key
󱦃md_key_alert
󱦄md_key_alert_outline
󱌒md_key_arrow_right
󱕴md_key_chain
󱕵md_key_chain_variant
󰌇md_key_change
󱆟md_key_link
󰌈md_key_minus
󰷖md_key_outline
󰌉md_key_plus
󰌊md_key_remove
󱆞md_key_star
󰌋md_key_variant
󰿂md_key_wireless
󰌌md_keyboard
󰌍md_keyboard_backspace
󰌎md_keyboard_caps
󰌏md_keyboard_close
󱊷md_keyboard_esc
󱊫md_keyboard_f1
󱊬md_keyboard_f2
󱊭md_keyboard_f3
󱊮md_keyboard_f4
󱊯md_keyboard_f5
󱊰md_keyboard_f6
󱊱md_keyboard_f7
󱊲md_keyboard_f8
󱊳md_keyboard_f9
󱊴md_keyboard_f10
󱊵md_keyboard_f11
󱊶md_keyboard_f12
󰌐md_keyboard_off
󰹋md_keyboard_off_outline
󰥻md_keyboard_outline
󰌑md_keyboard_return
󰧹md_keyboard_settings
󰧺md_keyboard_settings_outline
󱁐md_keyboard_space
󰌒md_keyboard_tab
󰌥md_keyboard_tab_reverse
󰌓md_keyboard_variant
󱃽md_khanda
󰝅md_kickstarter
󱦅md_kite
󱦆md_kite_outline
󱝄md_kitesurfing
󱍛md_klingon
󰧻md_knife
󰧼md_knife_military
󱜿md_koala
󰌔md_kodi
󱃾md_kubernetes
󰌕md_label
󱍵md_label_multiple
󱍶md_label_multiple_outline
󰫋md_label_off
󰫌md_label_off_outline
󰌖md_label_outline
󱋪md_label_percent
󱋫md_label_percent_outline
󰫍md_label_variant
󰫎md_label_variant_outline
󱖢md_ladder
󰠭md_ladybug
󰘧md_lambda
󰚵md_lamp
󱟐md_lamp_outline
󱕶md_lamps
󱟑md_lamps_outline
󰌗md_lan
󱊪md_lan_check
󰌘md_lan_connect
󰌙md_lan_disconnect
󰌚md_lan_pending
󱪲md_land_fields
󱪳md_land_plots
󱪴md_land_plots_circle
󱪵md_land_plots_circle_variant
󱪶md_land_rows_horizontal
󱪷md_land_rows_vertical
󱩈md_landslide
󱩉md_landslide_outline
󰙱md_language_c
󰙲md_language_cpp
󰌛md_language_csharp
󰌜md_language_css3
󱈚md_language_fortran
󰟓md_language_go
󰲒md_language_haskell
󰌝md_language_html5
󰬷md_language_java
󰌞md_language_javascript
󱈙md_language_kotlin
󰢱md_language_lua
󰍔md_language_markdown
󰽛md_language_markdown_outline
󰌟md_language_php
󰌠md_language_python
󰟔md_language_r
󰴭md_language_ruby
󰫏md_language_ruby_on_rails
󱘗md_language_rust
󰛥md_language_swift
󰛦md_language_typescript
󰙳md_language_xaml
󰌢md_laptop
󱩊md_laptop_account
󰛧md_laptop_off
󰫐md_laravel
󱒄md_laser_pointer
󰼃md_lasso
󰑆md_lastpass
󰽗md_latitude
󰌧md_launch
󰟕md_lava_lamp
󰌨md_layers
󱢒md_layers_edit
󰹌md_layers_minus
󰌩md_layers_off
󰧽md_layers_off_outline
󰧾md_layers_outline
󰹍md_layers_plus
󰹎md_layers_remove
󱈆md_layers_search
󱈇md_layers_search_outline
󰽘md_layers_triple
󰽙md_layers_triple_outline
󰙏md_lead_pencil
󰌪md_leaf
󱤅md_leaf_circle
󱤆md_leaf_circle_outline
󰲓md_leaf_maple
󱋚md_leaf_maple_off
󱋙md_leaf_off
󰷗md_leak
󰷘md_leak_off
󱫰md_lecturn
󰌫md_led_off
󰌬md_led_on
󰌭md_led_outline
󰟖md_led_strip
󱁑md_led_strip_variant
󱩋md_led_strip_variant_off
󰌮md_led_variant_off
󰌯md_led_variant_on
󰌰md_led_variant_outline
󱅽md_leek
󰥼md_less_than
󰥽md_less_than_or_equal
󰌱md_library
󱨢md_library_outline
󰮩md_library_shelves
󰿃md_license
󰡾md_lifebuoy
󱦇md_light_flood_down
󱦈md_light_flood_up
󱞛md_light_recessed
󰥾md_light_switch
󱨤md_light_switch_off
󰌵md_lightbulb
󱧡md_lightbulb_alert
󱧢md_lightbulb_alert_outline
󱠀md_lightbulb_auto
󱠁md_lightbulb_auto_outline
󱈈md_lightbulb_cfl
󱈉md_lightbulb_cfl_off
󱉵md_lightbulb_cfl_spiral
󱋃md_lightbulb_cfl_spiral_off
󱠄md_lightbulb_fluorescent_tube
󱠅md_lightbulb_fluorescent_tube_outline
󱉓md_lightbulb_group
󱋍md_lightbulb_group_off
󱋎md_lightbulb_group_off_outline
󱉔md_lightbulb_group_outline
󱉕md_lightbulb_multiple
󱋏md_lightbulb_multiple_off
󱋐md_lightbulb_multiple_off_outline
󱉖md_lightbulb_multiple_outline
󱩌md_lightbulb_night
󱩍md_lightbulb_night_outline
󰹏md_lightbulb_off
󰹐md_lightbulb_off_outline
󰛨md_lightbulb_on
󱩎md_lightbulb_on_10
󱩏md_lightbulb_on_20
󱩐md_lightbulb_on_30
󱩑md_lightbulb_on_40
󱩒md_lightbulb_on_50
󱩓md_lightbulb_on_60
󱩔md_lightbulb_on_70
󱩕md_lightbulb_on_80
󱩖md_lightbulb_on_90
󰛩md_lightbulb_on_outline
󰌶md_lightbulb_outline
󱧣md_lightbulb_question
󱧤md_lightbulb_question_outline
󱟴md_lightbulb_spot
󱟵md_lightbulb_spot_off
󱠂md_lightbulb_variant
󱠃md_lightbulb_variant_outline
󰧿md_lighthouse
󰨀md_lighthouse_on
󱐋md_lightning_bolt
󰠠md_lightning_bolt_circle
󱐌md_lightning_bolt_outline
󰘤md_line_scan
󱑶md_lingerie
󰌷md_link
󰴚md_link_box
󰴛md_link_box_outline
󰴜md_link_box_variant
󰴝md_link_box_variant_outline
󱂺md_link_lock
󰌸md_link_off
󰲔md_link_plus
󰌹md_link_variant
󱃿md_link_variant_minus
󰌺md_link_variant_off
󱄀md_link_variant_plus
󱄁md_link_variant_remove
󰌻md_linkedin
󰌽md_linux
󰣭md_linux_mint
󱎵md_lipstick
󱠦md_liquid_spot
󱤞md_liquor
󱖫md_list_status
󰩡md_litecoin
󰝲md_loading
󰿄md_location_enter
󰿅md_location_exit
󰌾md_lock
󰣮md_lock_alert
󱗑md_lock_alert_outline
󱎚md_lock_check
󱚨md_lock_check_outline
󰥿md_lock_clock
󱚩md_lock_minus
󱚪md_lock_minus_outline
󱙱md_lock_off
󱙲md_lock_off_outline
󰌿md_lock_open
󱎛md_lock_open_alert
󱗒md_lock_open_alert_outline
󱎜md_lock_open_check
󱚫md_lock_open_check_outline
󱚬md_lock_open_minus
󱚭md_lock_open_minus_outline
󰍀md_lock_open_outline
󱚮md_lock_open_plus
󱚯md_lock_open_plus_outline
󱚰md_lock_open_remove
󱚱md_lock_open_remove_outline
󰿆md_lock_open_variant
󰿇md_lock_open_variant_outline
󰍁md_lock_outline
󰛪md_lock_pattern
󰗻md_lock_plus
󱚲md_lock_plus_outline
󰣯md_lock_question
󱚳md_lock_remove
󱚴md_lock_remove_outline
󰝳md_lock_reset
󰢲md_lock_smart
󰟗md_locker
󰟘md_locker_multiple
󰍂md_login
󰍃md_logout
󰗽md_logout_variant
󰽚md_longitude
󰍄md_looks
󱖂md_lotion
󱖃md_lotion_outline
󱖄md_lotion_plus
󱖅md_lotion_plus_outline
󰍅md_loupe
󰍆md_lumx
󱂄md_lungs
󱡃md_mace
󰌤md_magazine_pistol
󰌣md_magazine_rifle
󱡄md_magic_staff
󰍇md_magnet
󰍈md_magnet_on
󰍉md_magnify
󰦀md_magnify_close
󱡴md_magnify_expand
󰍊md_magnify_minus
󰩢md_magnify_minus_cursor
󰛬md_magnify_minus_outline
󰍋md_magnify_plus
󰩣md_magnify_plus_cursor
󰛭md_magnify_plus_outline
󱈌md_magnify_remove_cursor
󱈍md_magnify_remove_outline
󱉶md_magnify_scan
󰺻md_mail
󰛮md_mailbox
󰶈md_mailbox_open
󰶉md_mailbox_open_outline
󰶊md_mailbox_open_up
󰶋md_mailbox_open_up_outline
󰶌md_mailbox_outline
󰶍md_mailbox_up
󰶎md_mailbox_up_outline
󱘊md_manjaro
󰍍md_map
󰺼md_map_check
󰺽md_map_check_outline
󰴞md_map_clock
󰴟md_map_clock_outline
󰨁md_map_legend
󰍎md_map_marker
󱣣md_map_marker_account
󱣤md_map_marker_account_outline
󰼅md_map_marker_alert
󰼆md_map_marker_alert_outline
󰲕md_map_marker_check
󱋻md_map_marker_check_outline
󰍏md_map_marker_circle
󰣰md_map_marker_distance
󱄂md_map_marker_down
󱋛md_map_marker_left
󱋝md_map_marker_left_outline
󰙐md_map_marker_minus
󱋹md_map_marker_minus_outline
󰍐md_map_marker_multiple
󱉷md_map_marker_multiple_outline
󰍑md_map_marker_off
󱋽md_map_marker_off_outline
󰟙md_map_marker_outline
󰴠md_map_marker_path
󰙑md_map_marker_plus
󱋸md_map_marker_plus_outline
󰼇md_map_marker_question
󰼈md_map_marker_question_outline
󰍒md_map_marker_radius
󱋼md_map_marker_radius_outline
󰼉md_map_marker_remove
󱋺md_map_marker_remove_outline
󰼊md_map_marker_remove_variant
󱋜md_map_marker_right
󱋞md_map_marker_right_outline
󱘈md_map_marker_star
󱘉md_map_marker_star_outline
󱄃md_map_marker_up
󰦁md_map_minus
󰦂md_map_outline
󰦃md_map_plus
󰦄md_map_search
󰦅md_map_search_outline
󰮪md_mapbox
󰍓md_margin
󰙒md_marker
󰷙md_marker_cancel
󰍕md_marker_check
󰫑md_mastodon
󰦆md_material_design
󰍗md_material_ui
󰍘md_math_compass
󰲖md_math_cos
󰿈md_math_integral
󰿉md_math_integral_box
󱂅md_math_log
󰿊md_math_norm
󰿋md_math_norm_box
󰲗md_math_sin
󰲘md_math_tan
󰘨md_matrix
󰦇md_medal
󱌦md_medal_outline
󰛯md_medical_bag
󱪸md_medical_cotton_swab
󱅻md_meditation
󰍛md_memory
󱟔md_menorah
󱟕md_menorah_fire
󰍜md_menu
󰍝md_menu_down
󰚶md_menu_down_outline
󰍞md_menu_left
󰨂md_menu_left_outline
󰮫md_menu_open
󰍟md_menu_right
󰨃md_menu_right_outline
󰩤md_menu_swap
󰩥md_menu_swap_outline
󰍠md_menu_up
󰚷md_menu_up_outline
󰽜md_merge
󰍡md_message
󰍢md_message_alert
󰨄md_message_alert_outline
󱋲md_message_arrow_left
󱋳md_message_arrow_left_outline
󱋴md_message_arrow_right
󱋵md_message_arrow_right_outline
󱥁md_message_badge
󱥂md_message_badge_outline
󱖬md_message_bookmark
󱖭md_message_bookmark_outline
󰚢md_message_bulleted
󰚣md_message_bulleted_off
󰛱md_message_cog
󱅲md_message_cog_outline
󰍣md_message_draw
󱧌md_message_fast
󱧍md_message_fast_outline
󱖩md_message_flash
󱖪md_message_flash_outline
󰍤md_message_image
󱅬md_message_image_outline
󰿌md_message_lock
󱅭md_message_lock_outline
󱅮md_message_minus
󱅯md_message_minus_outline
󱙍md_message_off
󱙎md_message_off_outline
󰍥md_message_outline
󰙓md_message_plus
󱂻md_message_plus_outline
󰍦md_message_processing
󱅰md_message_processing_outline
󱜺md_message_question
󱜻md_message_question_outline
󰍧md_message_reply
󱜽md_message_reply_outline
󰍨md_message_reply_text
󱜾md_message_reply_text_outline
󰛰md_message_settings
󱅱md_message_settings_outline
󰚚md_message_star
󱉐md_message_star_outline
󰍩md_message_text
󱅳md_message_text_clock
󱅴md_message_text_clock_outline
󱧎md_message_text_fast
󱧏md_message_text_fast_outline
󰿍md_message_text_lock
󱅵md_message_text_lock_outline
󰍪md_message_text_outline
󰍫md_message_video
󰘩md_meteor
󱩗md_meter_electric
󱩘md_meter_electric_outline
󱩙md_meter_gas
󱩚md_meter_gas_outline
󰟚md_metronome
󰟛md_metronome_tick
󰟜md_micro_sd
󰍬md_microphone
󰢳md_microphone_minus
󰍭md_microphone_off
󰍮md_microphone_outline
󰢴md_microphone_plus
󱦉md_microphone_question
󱦊md_microphone_question_outline
󰍯md_microphone_settings
󰍰md_microphone_variant
󰍱md_microphone_variant_off
󰙔md_microscope
󰍲md_microsoft
󱎎md_microsoft_access
󰠅md_microsoft_azure
󰿕md_microsoft_azure_devops
󰂤md_microsoft_bing
󰦈md_microsoft_dynamics_365
󰇩md_microsoft_edge
󱎏md_microsoft_excel
󰌀md_microsoft_internet_explorer
󰏆md_microsoft_office
󰏊md_microsoft_onedrive
󰝇md_microsoft_onenote
󰴢md_microsoft_outlook
󱎐md_microsoft_powerpoint
󱎑md_microsoft_sharepoint
󰊻md_microsoft_teams
󰘐md_microsoft_visual_studio
󰨞md_microsoft_visual_studio_code
󰖳md_microsoft_windows
󰨡md_microsoft_windows_classic
󱎒md_microsoft_word
󰖹md_microsoft_xbox
󰖺md_microsoft_xbox_controller
󰝋md_microsoft_xbox_controller_battery_alert
󰨢md_microsoft_xbox_controller_battery_charging
󰝌md_microsoft_xbox_controller_battery_empty
󰝍md_microsoft_xbox_controller_battery_full
󰝎md_microsoft_xbox_controller_battery_low
󰝏md_microsoft_xbox_controller_battery_medium
󰝐md_microsoft_xbox_controller_battery_unknown
󰹯md_microsoft_xbox_controller_menu
󰖻md_microsoft_xbox_controller_off
󰹰md_microsoft_xbox_controller_view
󰲙md_microwave
󱐣md_microwave_off
󰽝md_middleware
󰽞md_middleware_outline
󰣱md_midi
󰣲md_midi_port
󰷚md_mine
󰍳md_minecraft
󰨅md_mini_sd
󰨆md_minidisc
󰍴md_minus
󰍵md_minus_box
󱅁md_minus_box_multiple
󱅂md_minus_box_multiple_outline
󰛲md_minus_box_outline
󰍶md_minus_circle
󰍚md_minus_circle_multiple
󰫓md_minus_circle_multiple_outline
󱑙md_minus_circle_off
󱑚md_minus_circle_off_outline
󰍷md_minus_circle_outline
󰍸md_minus_network
󰲚md_minus_network_outline
󱘹md_minus_thick
󱇽md_mirror
󱞟md_mirror_rectangle
󱞠md_mirror_variant
󰶏md_mixed_martial_arts
󰡿md_mixed_reality
󰮬md_molecule
󱋾md_molecule_co
󰟤md_molecule_co2
󰍹md_monitor
󱩛md_monitor_account
󱧐md_monitor_arrow_down
󱧑md_monitor_arrow_down_variant
󰦉md_monitor_cellphone
󰦊md_monitor_cellphone_star
󰨇md_monitor_dashboard
󱋆md_monitor_edit
󱎴md_monitor_eye
󰷛md_monitor_lock
󰍺md_monitor_multiple
󰶐md_monitor_off
󰹑md_monitor_screenshot
󱒃md_monitor_share
󱄄md_monitor_shimmer
󱡶md_monitor_small
󰽟md_monitor_speaker
󰽠md_monitor_speaker_off
󰷜md_monitor_star
󰽡md_moon_first_quarter
󰽢md_moon_full
󰽣md_moon_last_quarter
󰽤md_moon_new
󰽥md_moon_waning_crescent
󰽦md_moon_waning_gibbous
󰽧md_moon_waxing_crescent
󰽨md_moon_waxing_gibbous
󱂆md_moped
󱖷md_moped_electric
󱖸md_moped_electric_outline
󱖹md_moped_outline
󰍻md_more
󱝈md_mortar_pestle
󰏱md_mortar_pestle_plus
󱠧md_mosque
󱌔md_mother_heart
󰴡md_mother_nurse
󱖲md_motion
󱖳md_motion_outline
󱖐md_motion_pause
󱖒md_motion_pause_outline
󱖏md_motion_play
󱖑md_motion_play_outline
󰶑md_motion_sensor
󱐵md_motion_sensor_off
󰍼md_motorbike
󱖺md_motorbike_electric
󰍽md_mouse
󰦋md_mouse_bluetooth
󱕐md_mouse_move_down
󱕑md_mouse_move_up
󱕒md_mouse_move_vertical
󰍾md_mouse_off
󰍿md_mouse_variant
󰎀md_mouse_variant_off
󰙕md_move_resize
󰙖md_move_resize_variant
󰎁md_movie
󱛳md_movie_check
󱛴md_movie_check_outline
󱛵md_movie_cog
󱛶md_movie_cog_outline
󱄢md_movie_edit
󱄣md_movie_edit_outline
󱄤md_movie_filter
󱄥md_movie_filter_outline
󱛷md_movie_minus
󱛸md_movie_minus_outline
󱛹md_movie_off
󱛺md_movie_off_outline
󰿎md_movie_open
󱛻md_movie_open_check
󱛼md_movie_open_check_outline
󱛽md_movie_open_cog
󱛾md_movie_open_cog_outline
󱛿md_movie_open_edit
󱜀md_movie_open_edit_outline
󱜁md_movie_open_minus
󱜂md_movie_open_minus_outline
󱜃md_movie_open_off
󱜄md_movie_open_off_outline
󰿏md_movie_open_outline
󱜅md_movie_open_play
󱜆md_movie_open_play_outline
󱜇md_movie_open_plus
󱜈md_movie_open_plus_outline
󱜉md_movie_open_remove
󱜊md_movie_open_remove_outline
󱜋md_movie_open_settings
󱜌md_movie_open_settings_outline
󱜍md_movie_open_star
󱜎md_movie_open_star_outline
󰷝md_movie_outline
󱜏md_movie_play
󱜐md_movie_play_outline
󱜑md_movie_plus
󱜒md_movie_plus_outline
󱜓md_movie_remove
󱜔md_movie_remove_outline
󰟞md_movie_roll
󱇒md_movie_search
󱇓md_movie_search_outline
󱜕md_movie_settings
󱜖md_movie_settings_outline
󱜗md_movie_star
󱜘md_movie_star_outline
󱙯md_mower
󱙰md_mower_bag
󰦌md_muffin
󱢓md_multicast
󰎂md_multiplication
󰎃md_multiplication_box
󰟟md_mushroom
󱏺md_mushroom_off
󱏻md_mushroom_off_outline
󰟠md_mushroom_outline
󰝚md_music
󰽩md_music_accidental_double_flat
󰽪md_music_accidental_double_sharp
󰽫md_music_accidental_flat
󰽬md_music_accidental_natural
󰽭md_music_accidental_sharp
󰎄md_music_box
󰌳md_music_box_multiple
󰼄md_music_box_multiple_outline
󰎅md_music_box_outline
󰎆md_music_circle
󰫔md_music_circle_outline
󰽮md_music_clef_alto
󰽯md_music_clef_bass
󰽰md_music_clef_treble
󰎇md_music_note
󰗾md_music_note_bluetooth
󰗿md_music_note_bluetooth_off
󰽱md_music_note_eighth_dotted
󰎉md_music_note_half
󰽲md_music_note_half_dotted
󰎊md_music_note_off
󰽳md_music_note_off_outline
󰽴md_music_note_outline
󰷞md_music_note_plus
󰎋md_music_note_quarter
󰽵md_music_note_quarter_dotted
󰎌md_music_note_sixteenth
󰽶md_music_note_sixteenth_dotted
󰎍md_music_note_whole
󰽷md_music_note_whole_dotted
󰝛md_music_off
󰽸md_music_rest_eighth
󰽹md_music_rest_half
󰽺md_music_rest_quarter
󰽻md_music_rest_sixteenth
󰽼md_music_rest_whole
󱗞md_mustache
󰷟md_nail
󰣳md_nas
󰢀md_nativescript
󰎎md_nature
󰎏md_nature_people
󰎐md_navigation
󱘇md_navigation_outline
󱣱md_navigation_variant_outline
󰗍md_near_me
󰼋md_necklace
󰎑md_needle
󱧒md_needle_off
󰝆md_netflix
󰛳md_network
󰲛md_network_off
󰲜md_network_off_outline
󰲝md_network_outline
󱫋md_network_pos
󰣴md_network_strength_1
󰣵md_network_strength_1_alert
󰣶md_network_strength_2
󰣷md_network_strength_2_alert
󰣸md_network_strength_3
󰣹md_network_strength_3_alert
󰣺md_network_strength_4
󰣻md_network_strength_4_alert
󱤚md_network_strength_4_cog
󰣼md_network_strength_off
󰣽md_network_strength_off_outline
󰣾md_network_strength_outline
󰎔md_new_box
󰎕md_newspaper
󱥃md_newspaper_check
󰼌md_newspaper_minus
󰼍md_newspaper_plus
󱥄md_newspaper_remove
󱀁md_newspaper_variant
󱀂md_newspaper_variant_multiple
󱀃md_newspaper_variant_multiple_outline
󱀄md_newspaper_variant_outline
󰎖md_nfc
󰹓md_nfc_search_variant
󰎗md_nfc_tap
󰎘md_nfc_variant
󰹔md_nfc_variant_off
󰝴md_ninja
󱎓md_nintendo_game_boy
󰟡md_nintendo_switch
󰖫md_nintendo_wii
󰜭md_nintendo_wiiu
󱄅md_nix
󰎙md_nodejs
󱅾md_noodles
󰦍md_not_equal
󰦎md_not_equal_variant
󰎚md_note
󱝽md_note_alert
󱝾md_note_alert_outline
󱝿md_note_check
󱞀md_note_check_outline
󱞁md_note_edit
󱞂md_note_edit_outline
󱙏md_note_minus
󱙐md_note_minus_outline
󰚸md_note_multiple
󰚹md_note_multiple_outline
󱞃md_note_off
󱞄md_note_off_outline
󰎛md_note_outline
󰎜md_note_plus
󰎝md_note_plus_outline
󱙑md_note_remove
󱙒md_note_remove_outline
󱙓md_note_search
󱙔md_note_search_outline
󰎞md_note_text
󱇗md_note_text_outline
󰠮md_notebook
󱓵md_notebook_check
󱓶md_notebook_check_outline
󱓧md_notebook_edit
󱓩md_notebook_edit_outline
󱨋md_notebook_heart
󱨌md_notebook_heart_outline
󱘐md_notebook_minus
󱘑md_notebook_minus_outline
󰹕md_notebook_multiple
󰺿md_notebook_outline
󱘒md_notebook_plus
󱘓md_notebook_plus_outline
󱘔md_notebook_remove
󱘕md_notebook_remove_outline
󰎟md_notification_clear_all
󰛷md_npm
󰚤md_nuke
󰟢md_null
󰎠md_numeric
󰎡md_numeric_0_box
󰼎md_numeric_0_box_multiple
󰎢md_numeric_0_box_multiple_outline
󰎣md_numeric_0_box_outline
󰬺md_numeric_1
󰎤md_numeric_1_box
󰼏md_numeric_1_box_multiple
󰎥md_numeric_1_box_multiple_outline
󰎦md_numeric_1_box_outline
󰲠md_numeric_1_circle
󰲡md_numeric_1_circle_outline
󰬻md_numeric_2
󰎧md_numeric_2_box
󰼐md_numeric_2_box_multiple
󰎨md_numeric_2_box_multiple_outline
󰎩md_numeric_2_box_outline
󰲢md_numeric_2_circle
󰲣md_numeric_2_circle_outline
󰬼md_numeric_3
󰎪md_numeric_3_box
󰼑md_numeric_3_box_multiple
󰎫md_numeric_3_box_multiple_outline
󰎬md_numeric_3_box_outline
󰲤md_numeric_3_circle
󰲥md_numeric_3_circle_outline
󰬽md_numeric_4
󰎭md_numeric_4_box
󰼒md_numeric_4_box_multiple
󰎲md_numeric_4_box_multiple_outline
󰎮md_numeric_4_box_outline
󰲦md_numeric_4_circle
󰲧md_numeric_4_circle_outline
󰬾md_numeric_5
󰎱md_numeric_5_box
󰼓md_numeric_5_box_multiple
󰎯md_numeric_5_box_multiple_outline
󰎰md_numeric_5_box_outline
󰲨md_numeric_5_circle
󰲩md_numeric_5_circle_outline
󰬿md_numeric_6
󰎳md_numeric_6_box
󰼔md_numeric_6_box_multiple
󰎴md_numeric_6_box_multiple_outline
󰎵md_numeric_6_box_outline
󰲪md_numeric_6_circle
󰲫md_numeric_6_circle_outline
󰭀md_numeric_7
󰎶md_numeric_7_box
󰼕md_numeric_7_box_multiple
󰎷md_numeric_7_box_multiple_outline
󰎸md_numeric_7_box_outline
󰲬md_numeric_7_circle
󰲭md_numeric_7_circle_outline
󰭁md_numeric_8
󰎹md_numeric_8_box
󰼖md_numeric_8_box_multiple
󰎺md_numeric_8_box_multiple_outline
󰎻md_numeric_8_box_outline
󰲮md_numeric_8_circle
󰲯md_numeric_8_circle_outline
󰭂md_numeric_9
󰎼md_numeric_9_box
󰼗md_numeric_9_box_multiple
󰎽md_numeric_9_box_multiple_outline
󰎾md_numeric_9_box_outline
󰲰md_numeric_9_circle
󰲱md_numeric_9_circle_outline
󰿮md_numeric_9_plus
󰎿md_numeric_9_plus_box
󰼘md_numeric_9_plus_box_multiple
󰏀md_numeric_9_plus_box_multiple_outline
󰏁md_numeric_9_plus_box_outline
󰲲md_numeric_9_plus_circle
󰲳md_numeric_9_plus_circle_outline
󰿩md_numeric_10
󰽽md_numeric_10_box
󰿪md_numeric_10_box_multiple
󰿫md_numeric_10_box_multiple_outline
󰽾md_numeric_10_box_outline
󰿬md_numeric_10_circle
󰿭md_numeric_10_circle_outline
󱁒md_numeric_negative_1
󱧓md_numeric_off
󱗋md_numeric_positive_1
󰛸md_nut
󰏂md_nutrition
󱄆md_nuxt
󰙼md_oar
󰷠md_ocarina
󱋩md_oci
󱄺md_ocr
󰏃md_octagon
󰏄md_octagon_outline
󰛹md_octagram
󰝵md_octagram_outline
󱥐md_octahedron
󱥑md_octahedron_off
󰏅md_odnoklassniki
󱈛md_offer
󰦑md_office_building
󱥉md_office_building_cog
󱥊md_office_building_cog_outline
󱔠md_office_building_marker
󱔡md_office_building_marker_outline
󱔟md_office_building_outline
󰏇md_oil
󰼙md_oil_lamp
󱁓md_oil_level
󰿸md_oil_temperature
󰥳md_om
󰏉md_omega
󰮭md_one_up
󰢁md_onepassword
󰗌md_opacity
󰏋md_open_in_app
󰏌md_open_in_new
󰮮md_open_source_initiative
󰏍md_openid
󰏎md_opera
󰀘md_orbit
󱗛md_orbit_variant
󰈍md_order_alphabetical_ascending
󰴇md_order_alphabetical_descending
󰊾md_order_bool_ascending
󰦏md_order_bool_ascending_variant
󱎄md_order_bool_descending
󰦐md_order_bool_descending_variant
󰕅md_order_numeric_ascending
󰕆md_order_numeric_descending
󰭃md_origin
󰏏md_ornament
󰏐md_ornament_variant
󱁔md_outdoor_lamp
󱀅md_overscan
󰏒md_owl
󰮯md_pac_man
󰏓md_package
󰏔md_package_down
󰏕md_package_up
󰏖md_package_variant
󰏗md_package_variant_closed
󱧔md_package_variant_closed_minus
󱧕md_package_variant_closed_plus
󱧖md_package_variant_closed_remove
󱧗md_package_variant_minus
󱧘md_package_variant_plus
󱧙md_package_variant_remove
󰘀md_page_first
󰘁md_page_last
󰛺md_page_layout_body
󰛻md_page_layout_footer
󰛼md_page_layout_header
󰽿md_page_layout_header_footer
󰛽md_page_layout_sidebar_left
󰛾md_page_layout_sidebar_right
󰮰md_page_next
󰮱md_page_next_outline
󰮲md_page_previous
󰮳md_page_previous_outline
󱐗md_pail
󱐷md_pail_minus
󱐼md_pail_minus_outline
󱐹md_pail_off
󱐾md_pail_off_outline
󱐺md_pail_outline
󱐶md_pail_plus
󱐻md_pail_plus_outline
󱐸md_pail_remove
󱐽md_pail_remove_outline
󰏘md_palette
󰏙md_palette_advanced
󰸌md_palette_outline
󰢵md_palette_swatch
󱍜md_palette_swatch_outline
󱥚md_palette_swatch_variant
󱁕md_palm_tree
󰮴md_pan
󰮵md_pan_bottom_left
󰮶md_pan_bottom_right
󰮷md_pan_down
󰮸md_pan_horizontal
󰮹md_pan_left
󰮺md_pan_right
󰮻md_pan_top_left
󰮼md_pan_top_right
󰮽md_pan_up
󰮾md_pan_vertical
󰏚md_panda
󰏛md_pandora
󰏜md_panorama
󰏝md_panorama_fisheye
󱤨md_panorama_horizontal
󰏞md_panorama_horizontal_outline
󱦌md_panorama_outline
󱦍md_panorama_sphere
󱦎md_panorama_sphere_outline
󱦏md_panorama_variant
󱦐md_panorama_variant_outline
󱤩md_panorama_vertical
󰏟md_panorama_vertical_outline
󱥟md_panorama_wide_angle
󰏠md_panorama_wide_angle_outline
󰏡md_paper_cut_vertical
󱅗md_paper_roll
󱅘md_paper_roll_outline
󰏢md_paperclip
󱫆md_paperclip_check
󱧚md_paperclip_lock
󱫇md_paperclip_minus
󱫈md_paperclip_off
󱫉md_paperclip_plus
󱫊md_paperclip_remove
󰲴md_parachute
󰲵md_parachute_outline
󱝅md_paragliding
󰏣md_parking
󱁖md_party_popper
󰟣md_passport
󰷡md_passport_biometric
󱅠md_pasta
󰾀md_patio_heater
󰢂md_patreon
󰏤md_pause
󰏥md_pause_circle
󰏦md_pause_circle_outline
󰏧md_pause_octagon
󰏨md_pause_octagon_outline
󰏩md_paw
󰙗md_paw_off
󱙶md_paw_off_outline
󱙵md_paw_outline
󰢄md_peace
󰿼md_peanut
󰿽md_peanut_off
󰿿md_peanut_off_outline
󰿾md_peanut_outline
󰏪md_pen
󰷢md_pen_lock
󰷣md_pen_minus
󰷤md_pen_off
󰷥md_pen_plus
󰷦md_pen_remove
󰏫md_pencil
󰏬md_pencil_box
󱅄md_pencil_box_multiple
󱅅md_pencil_box_multiple_outline
󰏭md_pencil_box_outline
󰛿md_pencil_circle
󰝶md_pencil_circle_outline
󰏮md_pencil_lock
󰷧md_pencil_lock_outline
󰷨md_pencil_minus
󰷩md_pencil_minus_outline
󰏯md_pencil_off
󰷪md_pencil_off_outline
󰲶md_pencil_outline
󰷫md_pencil_plus
󰷬md_pencil_plus_outline
󰷭md_pencil_remove
󰷮md_pencil_remove_outline
󱍓md_pencil_ruler
󰻀md_penguin
󰜁md_pentagon
󰜀md_pentagon_outline
󱙧md_pentagram
󰏰md_percent
󱨂md_percent_box
󱨃md_percent_box_outline
󱨄md_percent_circle
󱨅md_percent_circle_outline
󱉸md_percent_outline
󰢶md_periodic_table
󰴣md_perspective_less
󰴤md_perspective_more
󱟅md_ph
󰏲md_phone
󰼚md_phone_alert
󱆎md_phone_alert_outline
󰏳md_phone_bluetooth
󱆏md_phone_bluetooth_outline
󱂼md_phone_cancel
󱆐md_phone_cancel_outline
󱆩md_phone_check
󱆪md_phone_check_outline
󰘂md_phone_classic
󱉹md_phone_classic_off
󱧛md_phone_clock
󱕙md_phone_dial
󱕚md_phone_dial_outline
󰏴md_phone_forward
󱆑md_phone_forward_outline
󰏵md_phone_hangup
󱆒md_phone_hangup_outline
󰏶md_phone_in_talk
󱆂md_phone_in_talk_outline
󰏷md_phone_incoming
󱆓md_phone_incoming_outline
󰏸md_phone_lock
󱆔md_phone_lock_outline
󰏹md_phone_log
󱆕md_phone_log_outline
󱆖md_phone_message
󱆗md_phone_message_outline
󰙘md_phone_minus
󱆘md_phone_minus_outline
󰏺md_phone_missed
󱆥md_phone_missed_outline
󰷯md_phone_off
󱆦md_phone_off_outline
󰏻md_phone_outgoing
󱆙md_phone_outgoing_outline
󰷰md_phone_outline
󰏼md_phone_paused
󱆚md_phone_paused_outline
󰙙md_phone_plus
󱆛md_phone_plus_outline
󱦓md_phone_refresh
󱦔md_phone_refresh_outline
󱔯md_phone_remove
󱔰md_phone_remove_outline
󰠯md_phone_return
󱆜md_phone_return_outline
󱆫md_phone_ring
󱆬md_phone_ring_outline
󰢅md_phone_rotate_landscape
󰢆md_phone_rotate_portrait
󰏽md_phone_settings
󱆝md_phone_settings_outline
󱦕md_phone_sync
󱦖md_phone_sync_outline
󰏾md_phone_voip
󰏿md_pi
󰐀md_pi_box
󰷱md_pi_hole
󰙽md_piano
󰚘md_piano_off
󰢷md_pickaxe
󰹗md_picture_in_picture_bottom_right
󰹘md_picture_in_picture_bottom_right_outline
󰹙md_picture_in_picture_top_right
󰹚md_picture_in_picture_top_right_outline
󰢇md_pier
󰢈md_pier_crane
󰐁md_pig
󱀆md_pig_variant
󱙸md_pig_variant_outline
󱀇md_piggy_bank
󱙹md_piggy_bank_outline
󰐂md_pill
󱩜md_pill_off
󰜂md_pillar
󰐃md_pin
󰐄md_pin_off
󰤰md_pin_off_outline
󰤱md_pin_outline
󰐅md_pine_tree
󰐆md_pine_tree_box
󱐚md_pine_tree_fire
󰐇md_pinterest
󰫕md_pinwheel
󰫖md_pinwheel_outline
󰟥md_pipe
󰟦md_pipe_disconnected
󰢉md_pipe_leak
󱡍md_pipe_valve
󱍔md_pipe_wrench
󰨈md_pirate
󰜃md_pistol
󰢊md_piston
󱕓md_pitchfork
󰐉md_pizza
󰐊md_play
󱉺md_play_box
󱨖md_play_box_lock
󱨗md_play_box_lock_open
󱨘md_play_box_lock_open_outline
󱨙md_play_box_lock_outline
󰴙md_play_box_multiple
󱏦md_play_box_multiple_outline
󰐋md_play_box_outline
󰐌md_play_circle
󰐍md_play_circle_outline
󰢋md_play_network
󰲷md_play_network_outline
󰼛md_play_outline
󰐎md_play_pause
󰐏md_play_protected_content
󰣿md_play_speed
󰗇md_playlist_check
󰤀md_playlist_edit
󰐐md_playlist_minus
󰲸md_playlist_music
󰲹md_playlist_music_outline
󰐑md_playlist_play
󰐒md_playlist_plus
󰐓md_playlist_remove
󰷲md_playlist_star
󰚺md_plex
󱦤md_pliers
󰐕md_plus
󰐖md_plus_box
󰌴md_plus_box_multiple
󱅃md_plus_box_multiple_outline
󰜄md_plus_box_outline
󰐗md_plus_circle
󰍌md_plus_circle_multiple
󰐘md_plus_circle_multiple_outline
󰐙md_plus_circle_outline
󱩝md_plus_lock
󱩞md_plus_lock_open
󰦒md_plus_minus
󰦓md_plus_minus_box
󱓉md_plus_minus_variant
󰐚md_plus_network
󰲺md_plus_network_outline
󰜅md_plus_outline
󱇬md_plus_thick
󰦔md_podcast
󰴥md_podium
󰴦md_podium_bronze
󰴧md_podium_gold
󰴨md_podium_silver
󰶒md_point_of_sale
󰐝md_pokeball
󰨉md_pokemon_go
󰠰md_poker_chip
󰐞md_polaroid
󱅧md_police_badge
󱅨md_police_badge_outline
󱠹md_police_station
󰐟md_poll
󱓃md_polo
󰐡md_polymer
󰘆md_pool
󱩟md_pool_thermometer
󰐢md_popcorn
󱀈md_post
󱩠md_post_lamp
󱀉md_post_outline
󰲻md_postage_stamp
󰋥md_pot
󰙛md_pot_mix
󰙷md_pot_mix_outline
󰋿md_pot_outline
󰙚md_pot_steam
󰌦md_pot_steam_outline
󰐣md_pound
󰐤md_pound_box
󱅿md_pound_box_outline
󰐥md_power
󰤁md_power_cycle
󰤂md_power_off
󰤃md_power_on
󰚥md_power_plug
󰚦md_power_plug_off
󱐤md_power_plug_off_outline
󱐥md_power_plug_outline
󰐦md_power_settings
󰤄md_power_sleep
󰐧md_power_socket
󰤅md_power_socket_au
󰾳md_power_socket_ch
󱄇md_power_socket_de
󰟧md_power_socket_eu
󱄈md_power_socket_fr
󱓿md_power_socket_it
󱄉md_power_socket_jp
󰟨md_power_socket_uk
󰟩md_power_socket_us
󰤆md_power_standby
󰨊md_powershell
󰜆md_prescription
󰐨md_presentation
󰐩md_presentation_play
󱕢md_pretzel
󰐪md_printer
󰐫md_printer_3d
󰹛md_printer_3d_nozzle
󱇀md_printer_3d_nozzle_alert
󱇁md_printer_3d_nozzle_alert_outline
󱢸md_printer_3d_nozzle_heat
󱢹md_printer_3d_nozzle_heat_outline
󰹜md_printer_3d_nozzle_outline
󰐬md_printer_alert
󱅆md_printer_check
󱑘md_printer_eye
󰹝md_printer_off
󱞅md_printer_off_outline
󱞆md_printer_outline
󱁗md_printer_pos
󱑗md_printer_search
󰜇md_printer_settings
󰨋md_printer_wireless
󰘃md_priority_high
󰘄md_priority_low
󰐭md_professional_hexagon
󰲼md_progress_alert
󰦕md_progress_check
󰦖md_progress_clock
󱄊md_progress_close
󰦗md_progress_download
󱞇md_progress_pencil
󱔢md_progress_question
󱞈md_progress_star
󰦘md_progress_upload
󰲽md_progress_wrench
󰐮md_projector
󱨣md_projector_off
󰐯md_projector_screen
󱠍md_projector_screen_off
󱠎md_projector_screen_off_outline
󱜤md_projector_screen_outline
󱠏md_projector_screen_variant
󱠐md_projector_screen_variant_off
󱠑md_projector_screen_variant_off_outline
󱠒md_projector_screen_variant_outline
󱍗md_propane_tank
󱍘md_propane_tank_outline
󰿘md_protocol
󰚧md_publish
󱥅md_publish_off
󰐰md_pulse
󱐂md_pump
󰮿md_pumpkin
󰼜md_purse
󰼝md_purse_outline
󰐱md_puzzle
󱐦md_puzzle_check
󱐧md_puzzle_check_outline
󱓓md_puzzle_edit
󱓙md_puzzle_edit_outline
󱓔md_puzzle_heart
󱓚md_puzzle_heart_outline
󱓑md_puzzle_minus
󱓗md_puzzle_minus_outline
󰩦md_puzzle_outline
󱓐md_puzzle_plus
󱓖md_puzzle_plus_outline
󱓒md_puzzle_remove
󱓘md_puzzle_remove_outline
󱓕md_puzzle_star
󱓛md_puzzle_star_outline
󱥒md_pyramid
󱥓md_pyramid_off
󰦙md_qi
󰘅md_qqchat
󰐲md_qrcode
󰢸md_qrcode_edit
󱆌md_qrcode_minus
󱆋md_qrcode_plus
󱆍md_qrcode_remove
󰐳md_qrcode_scan
󰐴md_quadcopter
󰐵md_quality_high
󰨌md_quality_low
󰨍md_quality_medium
󰴩md_quora
󰤇md_rabbit
󱩡md_rabbit_variant
󱩢md_rabbit_variant_outline
󰶓md_racing_helmet
󰶔md_racquetball
󰐷md_radar
󰐸md_radiator
󰫗md_radiator_disabled
󰫘md_radiator_off
󰐹md_radio
󰲾md_radio_am
󰲿md_radio_fm
󰐺md_radio_handheld
󱈜md_radio_off
󰐻md_radio_tower
󰐼md_radioactive
󱡝md_radioactive_circle
󱡞md_radioactive_circle_outline
󰻁md_radioactive_off
󰐾md_radiobox_marked
󱓅md_radiology_box
󱓆md_radiology_box_outline
󰳀md_radius
󰳁md_radius_outline
󰼞md_railroad_light
󱕄md_rake
󰐿md_raspberry_pi
󱨏md_raw
󱨐md_raw_off
󰑀md_ray_end
󰑁md_ray_end_arrow
󰑂md_ray_start
󰑃md_ray_start_arrow
󰑄md_ray_start_end
󱗘md_ray_start_vertex_end
󰑅md_ray_vertex
󱦗md_razor_double_edge
󱦘md_razor_single_edge
󰜈md_react
󰑇md_read
󰑉md_receipt
󱧜md_receipt_outline
󱩣md_receipt_text_check
󱩤md_receipt_text_check_outline
󱩥md_receipt_text_minus
󱩦md_receipt_text_minus_outline
󱩧md_receipt_text_plus
󱩨md_receipt_text_plus_outline
󱩩md_receipt_text_remove
󱩪md_receipt_text_remove_outline
󰑊md_record
󰻂md_record_circle
󰻃md_record_circle_outline
󰦚md_record_player
󰑋md_record_rec
󰹞md_rectangle
󰹟md_rectangle_outline
󰑌md_recycle
󱎝md_recycle_variant
󰑍md_reddit
󱄛md_redhat
󰑎md_redo
󰑏md_redo_variant
󰨎md_reflect_horizontal
󰨏md_reflect_vertical
󰑐md_refresh
󱣲md_refresh_auto
󱍷md_refresh_circle
󰑑md_regex
󰩧md_registered_trademark
󱖈md_reiterate
󱒖md_relation_many_to_many
󱒗md_relation_many_to_one
󱒘md_relation_many_to_one_or_many
󱒙md_relation_many_to_only_one
󱒚md_relation_many_to_zero_or_many
󱒛md_relation_many_to_zero_or_one
󱒜md_relation_one_or_many_to_many
󱒝md_relation_one_or_many_to_one
󱒞md_relation_one_or_many_to_one_or_many
󱒟md_relation_one_or_many_to_only_one
󱒠md_relation_one_or_many_to_zero_or_many
󱒡md_relation_one_or_many_to_zero_or_one
󱒢md_relation_one_to_many
󱒣md_relation_one_to_one
󱒤md_relation_one_to_one_or_many
󱒥md_relation_one_to_only_one
󱒦md_relation_one_to_zero_or_many
󱒧md_relation_one_to_zero_or_one
󱒨md_relation_only_one_to_many
󱒩md_relation_only_one_to_one
󱒪md_relation_only_one_to_one_or_many
󱒫md_relation_only_one_to_only_one
󱒬md_relation_only_one_to_zero_or_many
󱒭md_relation_only_one_to_zero_or_one
󱒮md_relation_zero_or_many_to_many
󱒯md_relation_zero_or_many_to_one
󱒰md_relation_zero_or_many_to_one_or_many
󱒱md_relation_zero_or_many_to_only_one
󱒲md_relation_zero_or_many_to_zero_or_many
󱒳md_relation_zero_or_many_to_zero_or_one
󱒴md_relation_zero_or_one_to_many
󱒵md_relation_zero_or_one_to_one
󱒶md_relation_zero_or_one_to_one_or_many
󱒷md_relation_zero_or_one_to_only_one
󱒸md_relation_zero_or_one_to_zero_or_many
󱒹md_relation_zero_or_one_to_zero_or_one
󰑒md_relative_scale
󰑓md_reload
󱄋md_reload_alert
󰢌md_reminder
󰑔md_remote
󰢹md_remote_desktop
󰻄md_remote_off
󰻅md_remote_tv
󰻆md_remote_tv_off
󰑕md_rename_box
󰚈md_reorder_horizontal
󰚉md_reorder_vertical
󰑖md_repeat
󰑗md_repeat_off
󰑘md_repeat_once
󰕇md_repeat_variant
󰑙md_replay
󰑚md_reply
󰑛md_reply_all
󰼟md_reply_all_outline
󱆮md_reply_circle
󰼠md_reply_outline
󰑜md_reproduction
󰭄md_resistor
󰭅md_resistor_nodes
󰩨md_resize
󰑝md_resize_bottom_right
󰑞md_responsive
󰜉md_restart
󱄌md_restart_alert
󰶕md_restart_off
󰦛md_restore
󱄍md_restore_alert
󰑟md_rewind
󱇹md_rewind_5
󰴪md_rewind_10
󱥆md_rewind_15
󰶖md_rewind_30
󱘌md_rewind_60
󰜊md_rewind_outline
󰜋md_rhombus
󰨐md_rhombus_medium
󱓜md_rhombus_medium_outline
󰜌md_rhombus_outline
󰨑md_rhombus_split
󱓝md_rhombus_split_outline
󰑠md_ribbon
󰟪md_rice
󱖻md_rickshaw
󱖼md_rickshaw_electric
󰟫md_ring
󰹠md_rivet
󰑡md_road
󰑢md_road_variant
󱁘md_robber
󰚩md_robot
󱚝md_robot_angry
󱚞md_robot_angry_outline
󱚟md_robot_confused
󱚠md_robot_confused_outline
󱚡md_robot_dead
󱚢md_robot_dead_outline
󱚣md_robot_excited
󱚤md_robot_excited_outline
󱜙md_robot_happy
󱜚md_robot_happy_outline
󰭆md_robot_industrial
󱨚md_robot_industrial_outline
󱚥md_robot_love
󱚦md_robot_love_outline
󱇷md_robot_mower
󱇳md_robot_mower_outline
󱚧md_robot_off
󱙻md_robot_off_outline
󱙺md_robot_outline
󰜍md_robot_vacuum
󰤈md_robot_vacuum_variant
󰑣md_rocket
󱓞md_rocket_launch
󱓟md_rocket_launch_outline
󱎯md_rocket_outline
󱌧md_rodent
󱩫md_roller_shade
󱩬md_roller_shade_closed
󰴫md_roller_skate
󰅅md_roller_skate_off
󰴬md_rollerblade
󰀮md_rollerblade_off
󰯀md_rollupjs
󱪹md_rolodex
󱪺md_rolodex_outline
󱂉md_roman_numeral_2
󱂊md_roman_numeral_3
󱂋md_roman_numeral_4
󱂍md_roman_numeral_6
󱂎md_roman_numeral_7
󱂏md_roman_numeral_8
󱂐md_roman_numeral_9
󰢍md_room_service
󰶗md_room_service_outline
󱦙md_rotate_360
󰻇md_rotate_3d
󰑤md_rotate_3d_variant
󰑥md_rotate_left
󰑦md_rotate_left_variant
󰶘md_rotate_orbit
󰑧md_rotate_right
󰑨md_rotate_right_variant
󰘇md_rounded_corner
󱇢md_router
󱂇md_router_network
󰑩md_router_wireless
󱖣md_router_wireless_off
󰩩md_router_wireless_settings
󰑪md_routes
󱁙md_routes_clock
󰘈md_rowing
󰑫md_rss
󰑬md_rss_box
󰼡md_rss_off
󱑵md_rug
󰶙md_rugby
󰑭md_ruler
󰳂md_ruler_square
󰺾md_ruler_square_compass
󰜎md_run
󰑮md_run_fast
󱇔md_rv_truck
󰴮md_sack
󰴯md_sack_percent
󰩪md_safe
󱉼md_safe_square
󱉽md_safe_square_outline
󰴰md_safety_goggles
󰻈md_sail_boat
󱫯md_sail_boat_sink
󰑯md_sale
󱨆md_sale_outline
󰢎md_salesforce
󰟬md_sass
󰑰md_satellite
󰤉md_satellite_uplink
󰑱md_satellite_variant
󰢺md_sausage
󱞉md_sausage_off
󰹡md_saw_blade
󱑺md_sawtooth_wave
󰘉md_saxophone
󰑲md_scale
󰗑md_scale_balance
󰑳md_scale_bathroom
󱁚md_scale_off
󱦸md_scale_unbalanced
󱏘md_scan_helper
󰚫md_scanner
󰤊md_scanner_off
󰻉md_scatter_plot
󰻊md_scatter_plot_outline
󱥘md_scent
󱥙md_scent_off
󰑴md_school
󱆀md_school_outline
󰩫md_scissors_cutting
󱖽md_scooter
󱖾md_scooter_electric
󱉾md_scoreboard
󱉿md_scoreboard_outline
󰑵md_screen_rotation
󰑸md_screen_rotation_lock
󰷳md_screw_flat_top
󰷴md_screw_lag
󰷵md_screw_machine_flat_top
󰷶md_screw_machine_round_top
󰷷md_screw_round_top
󰑶md_screwdriver
󰯁md_script
󰑷md_script_outline
󰯂md_script_text
󱜥md_script_text_key
󱜦md_script_text_key_outline
󰯃md_script_text_outline
󱜧md_script_text_play
󱜨md_script_text_play_outline
󰑹md_sd
󰑺md_seal
󰿙md_seal_variant
󰜏md_search_web
󰳃md_seat
󰑻md_seat_flat
󰑼md_seat_flat_angled
󰑽md_seat_individual_suite
󰑾md_seat_legroom_extra
󰑿md_seat_legroom_normal
󰒀md_seat_legroom_reduced
󰳄md_seat_outline
󱉉md_seat_passenger
󰒁md_seat_recline_extra
󰒂md_seat_recline_normal
󰳅md_seatbelt
󰒃md_security
󰒄md_security_network
󰹢md_seed
󱏽md_seed_off
󱏾md_seed_off_outline
󰹣md_seed_outline
󱩭md_seed_plus
󱩮md_seed_plus_outline
󱖤md_seesaw
󰻋md_segment
󰒅md_select
󰒆md_select_all
󰴱md_select_color
󰫙md_select_compare
󰩬md_select_drag
󰾂md_select_group
󰒇md_select_inverse
󱊀md_select_marker
󱊁md_select_multiple
󱊂md_select_multiple_marker
󰒈md_select_off
󰿚md_select_place
󱟁md_select_remove
󱈄md_select_search
󰒉md_selection
󰩭md_selection_drag
󰴲md_selection_ellipse
󰼢md_selection_ellipse_arrow_inside
󱟂md_selection_ellipse_remove
󱊃md_selection_marker
󱊅md_selection_multiple
󱊄md_selection_multiple_marker
󰝷md_selection_off
󱟃md_selection_remove
󱈅md_selection_search
󱌖md_semantic_web
󰒊md_send
󱅡md_send_check
󱅢md_send_check_outline
󰷸md_send_circle
󰷹md_send_circle_outline
󱅣md_send_clock
󱅤md_send_clock_outline
󰟭md_send_lock
󱅦md_send_lock_outline
󱅥md_send_outline
󰙜md_serial_port
󰒋md_server
󰒌md_server_minus
󰒍md_server_network
󰒎md_server_network_off
󰒏md_server_off
󰒐md_server_plus
󰒑md_server_remove
󰒒md_server_security
󰝸md_set_all
󰝹md_set_center
󰝺md_set_center_right
󰝻md_set_left
󰝼md_set_left_center
󰝽md_set_left_right
󱓠md_set_merge
󰝾md_set_none
󰝿md_set_right
󱓡md_set_split
󱑝md_set_square
󰦟md_set_top_box
󰩮md_settings_helper
󱄎md_shaker
󱄏md_shaker_outline
󰠱md_shape
󰙝md_shape_circle_plus
󰠲md_shape_outline
󱇺md_shape_oval_plus
󰒕md_shape_plus
󰙞md_shape_polygon_plus
󰙟md_shape_rectangle_plus
󰙠md_shape_square_plus
󱓺md_shape_square_rounded_plus
󰒖md_share
󱇴md_share_all
󱇵md_share_all_outline
󱆭md_share_circle
󰼣md_share_off
󰼤md_share_off_outline
󰤲md_share_outline
󰒗md_share_variant
󱔔md_share_variant_outline
󱢺md_shark
󱙳md_shark_fin
󱙴md_shark_fin_outline
󱢻md_shark_off
󰳆md_sheep
󰒘md_shield
󰢏md_shield_account
󰨒md_shield_account_outline
󱖧md_shield_account_variant
󱖨md_shield_account_variant_outline
󰚻md_shield_airplane
󰳇md_shield_airplane_outline
󰻌md_shield_alert
󰻍md_shield_alert_outline
󱏚md_shield_bug
󱏛md_shield_bug_outline
󰾃md_shield_car
󰕥md_shield_check
󰳈md_shield_check_outline
󰳉md_shield_cross
󰳊md_shield_cross_outline
󱢼md_shield_crown
󱢽md_shield_crown_outline
󱆠md_shield_edit
󱆡md_shield_edit_outline
󱍠md_shield_half
󰞀md_shield_half_full
󰚊md_shield_home
󰳋md_shield_home_outline
󰯄md_shield_key
󰯅md_shield_key_outline
󰴳md_shield_link_variant
󰴴md_shield_link_variant_outline
󰦝md_shield_lock
󱦚md_shield_lock_open
󱦛md_shield_lock_open_outline
󰳌md_shield_lock_outline
󱠨md_shield_moon
󱠩md_shield_moon_outline
󰦞md_shield_off
󰦜md_shield_off_outline
󰒙md_shield_outline
󰫚md_shield_plus
󰫛md_shield_plus_outline
󰂪md_shield_refresh
󰇠md_shield_refresh_outline
󰫜md_shield_remove
󰫝md_shield_remove_outline
󰶚md_shield_search
󱄻md_shield_star
󱄼md_shield_star_outline
󱁝md_shield_sun
󱁞md_shield_sun_outline
󱢾md_shield_sword
󱢿md_shield_sword_outline
󱆢md_shield_sync
󱆣md_shield_sync_outline
󱕅md_shimmer
󰠳md_ship_wheel
󱡎md_shipping_pallet
󱗊md_shoe_ballet
󱗇md_shoe_cleat
󰭇md_shoe_formal
󰭈md_shoe_heel
󰷺md_shoe_print
󱗈md_shoe_sneaker
󰒚md_shopping
󰒛md_shopping_music
󱇕md_shopping_outline
󰾄md_shopping_search
󱩯md_shopping_search_outline
󱓹md_shore
󰜐md_shovel
󰜑md_shovel_off
󰦠md_shower
󰦡md_shower_head
󰒜md_shredder
󰒝md_shuffle
󰒞md_shuffle_disabled
󰒟md_shuffle_variant
󱍿md_shuriken
󱣀md_sickle
󰒠md_sigma
󰘫md_sigma_lower
󰒡md_sign_caution
󰞁md_sign_direction
󱀀md_sign_direction_minus
󰿜md_sign_direction_plus
󰿝md_sign_direction_remove
󱓸md_sign_pole
󱄘md_sign_real_estate
󰞂md_sign_text
󰒢md_signal
󰜒md_signal_2g
󰜓md_signal_3g
󰜔md_signal_4g
󰩯md_signal_5g
󰢼md_signal_cellular_1
󰢽md_signal_cellular_2
󰢾md_signal_cellular_3
󰢿md_signal_cellular_outline
󰹤md_signal_distance_variant
󰜕md_signal_hspa
󰜖md_signal_hspa_plus
󰞃md_signal_off
󰘊md_signal_variant
󰷻md_signature
󰷼md_signature_freehand
󰷽md_signature_image
󰷾md_signature_text
󰭉md_silo
󰒣md_silverware
󰿞md_silverware_clean
󰒤md_silverware_fork
󰩰md_silverware_fork_knife
󰒥md_silverware_spoon
󰒦md_silverware_variant
󰒧md_sim
󰒨md_sim_alert
󱗓md_sim_alert_outline
󰒩md_sim_off
󱗔md_sim_off_outline
󱗕md_sim_outline
󱌝md_simple_icons
󰫟md_sina_weibo
󰥛md_sine_wave
󰒪md_sitemap
󱦜md_sitemap_outline
󱎥md_size_m
󱎤md_size_s
󱎧md_size_xl
󱎣md_size_xs
󱎨md_size_xxl
󱎢md_size_xxs
󱎩md_size_xxxl
󰴵md_skate
󰚙md_skate_off
󱓂md_skateboard
󰔁md_skateboarding
󰴶md_skew_less
󰴷md_skew_more
󱌄md_ski
󱌅md_ski_cross_country
󱌆md_ski_water
󰒫md_skip_backward
󰼥md_skip_backward_outline
󰒬md_skip_forward
󰼦md_skip_forward_outline
󰒭md_skip_next
󰙡md_skip_next_circle
󰙢md_skip_next_circle_outline
󰼧md_skip_next_outline
󰒮md_skip_previous
󰙣md_skip_previous_circle
󰙤md_skip_previous_circle_outline
󰼨md_skip_previous_outline
󰚌md_skull
󰯆md_skull_crossbones
󰯇md_skull_crossbones_outline
󰯈md_skull_outline
󱓇md_skull_scan
󱓈md_skull_scan_outline
󰒯md_skype
󰒰md_skype_business
󰒱md_slack
󰿟md_slash_forward
󰿠md_slash_forward_box
󰐛md_sledding
󰒲md_sleep
󰒳md_sleep_off
󱖥md_slide
󰷿md_slope_downhill
󰸀md_slope_uphill
󱄔md_slot_machine
󱄕md_slot_machine_outline
󱂽md_smart_card
󱣷md_smart_card_off
󱣸md_smart_card_off_outline
󱂾md_smart_card_outline
󱂿md_smart_card_reader
󱃀md_smart_card_reader_outline
󰩱md_smog
󱞙md_smoke
󰎒md_smoke_detector
󱤮md_smoke_detector_alert
󱤯md_smoke_detector_alert_outline
󱠉md_smoke_detector_off
󱠊md_smoke_detector_off_outline
󱠈md_smoke_detector_outline
󱠋md_smoke_detector_variant
󱤰md_smoke_detector_variant_alert
󱠌md_smoke_detector_variant_off
󰒴md_smoking
󰒵md_smoking_off
󱐍md_smoking_pipe
󱐨md_smoking_pipe_off
󱙷md_snail
󱔎md_snake
󰒶md_snapchat
󱌇md_snowboard
󰜗md_snowflake
󰼩md_snowflake_alert
󱩰md_snowflake_check
󱋋md_snowflake_melt
󱓣md_snowflake_off
󱩱md_snowflake_thermometer
󰼪md_snowflake_variant
󰒷md_snowman
󰛝md_snowmobile
󱩲md_snowshoeing
󰒸md_soccer
󰠴md_soccer_field
󱕹md_social_distance_2_meters
󱕺md_social_distance_6_feet
󰒹md_sofa
󱕭md_sofa_outline
󱕮md_sofa_single
󱕯md_sofa_single_outline
󰶛md_solar_panel
󰶜md_solar_panel_large
󰩲md_solar_power
󱩳md_solar_power_variant
󱩴md_solar_power_variant_outline
󱂒md_soldering_iron
󰚍md_solid
󰐔md_sony_playstation
󰒺md_sort
󰖽md_sort_alphabetical_ascending
󱅈md_sort_alphabetical_ascending_variant
󰖿md_sort_alphabetical_descending
󱅉md_sort_alphabetical_descending_variant
󰒻md_sort_alphabetical_variant
󰒼md_sort_ascending
󱎅md_sort_bool_ascending
󱎆md_sort_bool_ascending_variant
󱎇md_sort_bool_descending
󱎈md_sort_bool_descending_variant
󱕇md_sort_calendar_ascending
󱕈md_sort_calendar_descending
󱕉md_sort_clock_ascending
󱕊md_sort_clock_ascending_outline
󱕋md_sort_clock_descending
󱕌md_sort_clock_descending_outline
󰒽md_sort_descending
󱎉md_sort_numeric_ascending
󰤍md_sort_numeric_ascending_variant
󱎊md_sort_numeric_descending
󰫒md_sort_numeric_descending_variant
󰒾md_sort_numeric_variant
󰌼md_sort_reverse_variant
󰒿md_sort_variant
󰳍md_sort_variant_lock
󰳎md_sort_variant_lock_open
󱪻md_sort_variant_off
󱅇md_sort_variant_remove
󱟛md_soundbar
󰓀md_soundcloud
󰘬md_source_branch
󱓏md_source_branch_check
󱓋md_source_branch_minus
󱓊md_source_branch_plus
󱓍md_source_branch_refresh
󱓌md_source_branch_remove
󱓎md_source_branch_sync
󰜘md_source_commit
󰜙md_source_commit_end
󰜚md_source_commit_end_local
󰜛md_source_commit_local
󰜜md_source_commit_next_local
󰜝md_source_commit_start
󰜞md_source_commit_start_next_local
󰓁md_source_fork
󰘭md_source_merge
󰓂md_source_pull
󰳏md_source_repository
󰳐md_source_repository_multiple
󰟮md_soy_sauce
󱏼md_soy_sauce_off
󰳑md_spa
󰳒md_spa_outline
󰯉md_space_invaders
󱎃md_space_station
󰹥md_spade
󰓃md_speaker
󰦢md_speaker_bluetooth
󰴸md_speaker_multiple
󰓄md_speaker_off
󰜟md_speaker_wireless
󱡅md_spear
󰓅md_speedometer
󰾅md_speedometer_medium
󰾆md_speedometer_slow
󰓆md_spellcheck
󱥔md_sphere
󱥕md_sphere_off
󱇪md_spider
󱇫md_spider_thread
󰯊md_spider_web
󱓱md_spirit_level
󱐩md_spoon_sugar
󰓇md_spotify
󰓈md_spotlight
󰓉md_spotlight_beam
󰙥md_spray
󰫠md_spray_bottle
󱁟md_sprinkler
󱦝md_sprinkler_fire
󱁠md_sprinkler_variant
󰹦md_sprout
󰹧md_sprout_outline
󰝤md_square
󱔀md_square_circle
󰤌md_square_edit_outline
󰨓md_square_medium
󰨔md_square_medium_outline
󱋮md_square_off
󱋯md_square_off_outline
󱡔md_square_opacity
󰝣md_square_outline
󰞄md_square_root
󰦣md_square_root_box
󱓻md_square_rounded
󱨇md_square_rounded_badge
󱨈md_square_rounded_badge_outline
󱓼md_square_rounded_outline
󰨕md_square_small
󱑻md_square_wave
󰫡md_squeegee
󰣀md_ssh
󰘋md_stack_exchange
󰓌md_stack_overflow
󰍙md_stackpath
󰿹md_stadium
󰜠md_stadium_variant
󰓍md_stairs
󱎞md_stairs_box
󱊾md_stairs_down
󱊽md_stairs_up
󰴹md_stamper
󰟯md_standard_definition
󰓎md_star
󰩳md_star_box
󱊆md_star_box_multiple
󱊇md_star_box_multiple_outline
󰩴md_star_box_outline
󱕦md_star_check
󱕪md_star_check_outline
󰓏md_star_circle
󰦤md_star_circle_outline
󱙨md_star_cog
󱙩md_star_cog_outline
󰥹md_star_crescent
󰥺md_star_david
󰦥md_star_face
󰫢md_star_four_points
󰫣md_star_four_points_outline
󰉆md_star_half
󰓐md_star_half_full
󱕤md_star_minus
󱕨md_star_minus_outline
󰓑md_star_off
󱕛md_star_off_outline
󰓒md_star_outline
󱕣md_star_plus
󱕧md_star_plus_outline
󱕥md_star_remove
󱕩md_star_remove_outline
󱙪md_star_settings
󱙫md_star_settings_outline
󱝁md_star_shooting
󱝂md_star_shooting_outline
󰫤md_star_three_points
󰫥md_star_three_points_outline
󱇯md_state_machine
󰓓md_steam
󰓔md_steering
󰤎md_steering_off
󰓕md_step_backward
󰓖md_step_backward_2
󰓗md_step_forward
󰓘md_step_forward_2
󰓙md_stethoscope
󱍤md_sticker
󱍥md_sticker_alert
󱍦md_sticker_alert_outline
󱍧md_sticker_check
󱍨md_sticker_check_outline
󰗐md_sticker_circle_outline
󰞅md_sticker_emoji
󱍩md_sticker_minus
󱍪md_sticker_minus_outline
󱍫md_sticker_outline
󱍬md_sticker_plus
󱍭md_sticker_plus_outline
󱍮md_sticker_remove
󱍯md_sticker_remove_outline
󱞎md_sticker_text
󱞏md_sticker_text_outline
󰓚md_stocking
󱂓md_stomach
󱥝md_stool
󱥞md_stool_outline
󰓛md_stop
󰙦md_stop_circle
󰙧md_stop_circle_outline
󱩵md_storage_tank
󱩶md_storage_tank_outline
󰓜md_store
󰓝md_store_24_hour
󱣁md_store_alert
󱣂md_store_alert_outline
󱣃md_store_check
󱣄md_store_check_outline
󱣅md_store_clock
󱣆md_store_clock_outline
󱣇md_store_cog
󱣈md_store_cog_outline
󱣉md_store_edit
󱣊md_store_edit_outline
󱣋md_store_marker
󱣌md_store_marker_outline
󱙞md_store_minus
󱣍md_store_minus_outline
󱣎md_store_off
󱣏md_store_off_outline
󱍡md_store_outline
󱙟md_store_plus
󱣐md_store_plus_outline
󱙠md_store_remove
󱣑md_store_remove_outline
󱣒md_store_search
󱣓md_store_search_outline
󱣔md_store_settings
󱣕md_store_settings_outline
󰟇md_storefront
󱃁md_storefront_outline
󰓞md_stove
󱇖md_strategy
󰼫md_stretch_to_page
󰼬md_stretch_to_page_outline
󱊺md_string_lights
󱊻md_string_lights_off
󰘌md_subdirectory_arrow_left
󰘍md_subdirectory_arrow_right
󱕬md_submarine
󰨖md_subtitles
󰨗md_subtitles_outline
󰚬md_subway
󰶝md_subway_alert_variant
󰓟md_subway_variant
󰞆md_summit
󱩷md_sun_clock
󱩸md_sun_clock_outline
󱦥md_sun_compass
󱞖md_sun_snowflake
󱩹md_sun_snowflake_variant
󱣖md_sun_thermometer
󱣗md_sun_thermometer_outline
󱟾md_sun_wireless
󱟿md_sun_wireless_outline
󰓠md_sunglasses
󱝆md_surfing
󰗅md_surround_sound
󰟰md_surround_sound_2_0
󱜩md_surround_sound_2_1
󰟱md_surround_sound_3_1
󰟲md_surround_sound_5_1
󱜪md_surround_sound_5_1_2
󰟳md_surround_sound_7_1
󰜡md_svg
󰓡md_swap_horizontal
󰯍md_swap_horizontal_bold
󰿡md_swap_horizontal_circle
󰿢md_swap_horizontal_circle_outline
󰣁md_swap_horizontal_variant
󰓢md_swap_vertical
󰯎md_swap_vertical_bold
󰿣md_swap_vertical_circle
󰿤md_swap_vertical_circle_outline
󰣂md_swap_vertical_variant
󰓣md_swim
󰓤md_switch
󰓥md_sword
󰞇md_sword_cross
󱌳md_syllabary_hangul
󱌴md_syllabary_hiragana
󱌵md_syllabary_katakana
󱌶md_syllabary_katakana_halfwidth
󱔁md_symbol
󰫦md_symfony
󰓦md_sync
󰓧md_sync_alert
󱍸md_sync_circle
󰓨md_sync_off
󰓩md_tab
󰭋md_tab_minus
󰝜md_tab_plus
󰭌md_tab_remove
󱦞md_tab_search
󰓪md_tab_unselected
󰓫md_table
󱎹md_table_account
󱎺md_table_alert
󱎻md_table_arrow_down
󱎼md_table_arrow_left
󱎽md_table_arrow_right
󱎾md_table_arrow_up
󰨘md_table_border
󱎿md_table_cancel
󱁡md_table_chair
󱏀md_table_check
󱏁md_table_clock
󱏂md_table_cog
󰠵md_table_column
󰓬md_table_column_plus_after
󰓭md_table_column_plus_before
󰓮md_table_column_remove
󰓯md_table_column_width
󰓰md_table_edit
󱂔md_table_eye
󱏃md_table_eye_off
󰖼md_table_furniture
󱈝md_table_headers_eye
󱈞md_table_headers_eye_off
󱏄md_table_heart
󱏅md_table_key
󰓱md_table_large
󰾇md_table_large_plus
󰾈md_table_large_remove
󱏆md_table_lock
󰦦md_table_merge_cells
󱏇md_table_minus
󱏈md_table_multiple
󱏉md_table_network
󰠶md_table_of_contents
󱏊md_table_off
󱝃md_table_picnic
󱠼md_table_pivot
󰩵md_table_plus
󱎠md_table_refresh
󰩶md_table_remove
󰠷md_table_row
󰓲md_table_row_height
󰓳md_table_row_plus_after
󰓴md_table_row_plus_before
󰓵md_table_row_remove
󰤏md_table_search
󰠸md_table_settings
󱐪md_table_split_cell
󱏋md_table_star
󱎡md_table_sync
󰹨md_table_tennis
󰓶md_tablet
󰓷md_tablet_android
󰦧md_tablet_cellphone
󰻎md_tablet_dashboard
󰝢md_taco
󰓹md_tag
󱜫md_tag_arrow_down
󱜬md_tag_arrow_down_outline
󱜭md_tag_arrow_left
󱜮md_tag_arrow_left_outline
󱜯md_tag_arrow_right
󱜰md_tag_arrow_right_outline
󱜱md_tag_arrow_up
󱜲md_tag_arrow_up_outline
󱩺md_tag_check
󱩻md_tag_check_outline
󰓺md_tag_faces
󰚋md_tag_heart
󰯏md_tag_heart_outline
󰤐md_tag_minus
󱈟md_tag_minus_outline
󰓻md_tag_multiple
󱋷md_tag_multiple_outline
󱈠md_tag_off
󱈡md_tag_off_outline
󰓼md_tag_outline
󰜢md_tag_plus
󱈢md_tag_plus_outline
󰜣md_tag_remove
󱈣md_tag_remove_outline
󱤇md_tag_search
󱤈md_tag_search_outline
󱈤md_tag_text
󰓽md_tag_text_outline
󱏿md_tailwind
󱪼md_tally_mark_1
󱪽md_tally_mark_2
󱪾md_tally_mark_3
󱪿md_tally_mark_4
󱫀md_tally_mark_5
󰓸md_tangram
󰴺md_tank
󰿥md_tanker_truck
󱛟md_tape_drive
󰭍md_tape_measure
󰓾md_target
󰯐md_target_account
󰩷md_target_variant
󰓿md_taxi
󰶞md_tea
󰶟md_tea_outline
󰔀md_teamviewer
󱣻md_teddy_bear
󰭎md_telescope
󰔂md_television
󱍖md_television_ambient_light
󰠹md_television_box
󰟴md_television_classic
󰠺md_television_classic_off
󰔃md_television_guide
󰠻md_television_off
󰾉md_television_pause
󰻏md_television_play
󱄐md_television_shimmer
󰾊md_television_stop
󰔄md_temperature_celsius
󰔅md_temperature_fahrenheit
󰔆md_temperature_kelvin
󰶠md_tennis
󰔇md_tennis_ball
󰔈md_tent
󱁢md_terraform
󰙨md_test_tube
󰤑md_test_tube_empty
󰤒md_test_tube_off
󰦨md_text
󱕰md_text_account
󰈚md_text_box
󰺦md_text_box_check
󰺧md_text_box_check_outline
󱩼md_text_box_edit
󱩽md_text_box_edit_outline
󰺨md_text_box_minus
󰺩md_text_box_minus_outline
󰪷md_text_box_multiple
󰪸md_text_box_multiple_outline
󰧭md_text_box_outline
󰺪md_text_box_plus
󰺫md_text_box_plus_outline
󰺬md_text_box_remove
󰺭md_text_box_remove_outline
󰺮md_text_box_search
󰺯md_text_box_search_outline
󰦪md_text_long
󱄽md_text_recognition
󱎸md_text_search
󱩾md_text_search_variant
󰙩md_text_shadow
󰦩md_text_short
󰔊md_text_to_speech
󰔋md_text_to_speech_off
󰔌md_texture
󰿦md_texture_box
󰔍md_theater
󰔎md_theme_light_dark
󰔏md_thermometer
󰸁md_thermometer_alert
󱢕md_thermometer_bluetooth
󱩿md_thermometer_check
󰸂md_thermometer_chevron_down
󰸃md_thermometer_chevron_up
󱃂md_thermometer_high
󰔐md_thermometer_lines
󱃃md_thermometer_low
󰸄md_thermometer_minus
󱔱md_thermometer_off
󰸅md_thermometer_plus
󱪀md_thermometer_water
󰎓md_thermostat
󰢑md_thermostat_box
󰟶md_thought_bubble
󰟷md_thought_bubble_outline
󰔑md_thumb_down
󰔒md_thumb_down_outline
󰔓md_thumb_up
󰔔md_thumb_up_outline
󰔕md_thumbs_up_down
󱤔md_thumbs_up_down_outline
󰔖md_ticket
󰔗md_ticket_account
󰔘md_ticket_confirmation
󱎪md_ticket_confirmation_outline
󰤓md_ticket_outline
󰜤md_ticket_percent
󱐫md_ticket_percent_outline
󰔙md_tie
󰜥md_tilde
󱣳md_tilde_off
󰔚md_timelapse
󰯑md_timeline
󰾕md_timeline_alert
󰾘md_timeline_alert_outline
󱔲md_timeline_check
󱔳md_timeline_check_outline
󱇻md_timeline_clock
󱇼md_timeline_clock_outline
󰾙md_timeline_help
󰾚md_timeline_help_outline
󱔴md_timeline_minus
󱔵md_timeline_minus_outline
󰯒md_timeline_outline
󰾖md_timeline_plus
󰾗md_timeline_plus_outline
󱔶md_timeline_remove
󱔷md_timeline_remove_outline
󰯓md_timeline_text
󰯔md_timeline_text_outline
󱎫md_timer
󰔝md_timer_3
󰔜md_timer_10
󱫌md_timer_alert
󱫍md_timer_alert_outline
󱫎md_timer_cancel
󱫏md_timer_cancel_outline
󱫐md_timer_check
󱫑md_timer_check_outline
󱤥md_timer_cog
󱤦md_timer_cog_outline
󱫒md_timer_edit
󱫓md_timer_edit_outline
󱫔md_timer_lock
󱫕md_timer_lock_open
󱫖md_timer_lock_open_outline
󱫗md_timer_lock_outline
󱫘md_timer_marker
󱫙md_timer_marker_outline
󱫚md_timer_minus
󱫛md_timer_minus_outline
󱫜md_timer_music
󱫝md_timer_music_outline
󱎬md_timer_off
󰔞md_timer_off_outline
󰔛md_timer_outline
󱫞md_timer_pause
󱫟md_timer_pause_outline
󱫠md_timer_play
󱫡md_timer_play_outline
󱫢md_timer_plus
󱫣md_timer_plus_outline
󱫤md_timer_refresh
󱫥md_timer_refresh_outline
󱫦md_timer_remove
󱫧md_timer_remove_outline
󰔟md_timer_sand
󱦟md_timer_sand_complete
󰚭md_timer_sand_empty
󰞌md_timer_sand_full
󱦠md_timer_sand_paused
󱤣md_timer_settings
󱤤md_timer_settings_outline
󱫨md_timer_star
󱫩md_timer_star_outline
󱫪md_timer_stop
󱫫md_timer_stop_outline
󱫬md_timer_sync
󱫭md_timer_sync_outline
󰔠md_timetable
󱢖md_tire
󱁣md_toaster
󱆷md_toaster_off
󰳓md_toaster_oven
󰔡md_toggle_switch
󰔢md_toggle_switch_off
󰨙md_toggle_switch_off_outline
󰨚md_toggle_switch_outline
󱨥md_toggle_switch_variant
󱨦md_toggle_switch_variant_off
󰦫md_toilet
󰦬md_toolbox
󰦭md_toolbox_outline
󱁤md_tools
󰔣md_tooltip
󰀌md_tooltip_account
󱠻md_tooltip_cellphone
󱕜md_tooltip_check
󱕝md_tooltip_check_outline
󰔤md_tooltip_edit
󱋅md_tooltip_edit_outline
󰔥md_tooltip_image
󰯕md_tooltip_image_outline
󱕞md_tooltip_minus
󱕟md_tooltip_minus_outline
󰔦md_tooltip_outline
󰯖md_tooltip_plus
󰔧md_tooltip_plus_outline
󱕠md_tooltip_remove
󱕡md_tooltip_remove_outline
󰔨md_tooltip_text
󰯗md_tooltip_text_outline
󰣃md_tooth
󰔩md_tooth_outline
󱄩md_toothbrush
󱄬md_toothbrush_electric
󱄪md_toothbrush_paste
󱘆md_torch
󰴻md_tortoise
󱊸md_toslink
󰦮md_tournament
󰠼md_tow_truck
󰚁md_tower_beach
󰚂md_tower_fire
󱡵md_town_hall
󱊈md_toy_brick
󱊉md_toy_brick_marker
󱊊md_toy_brick_marker_outline
󱊋md_toy_brick_minus
󱊌md_toy_brick_minus_outline
󱊍md_toy_brick_outline
󱊎md_toy_brick_plus
󱊏md_toy_brick_plus_outline
󱊐md_toy_brick_remove
󱊑md_toy_brick_remove_outline
󱊒md_toy_brick_search
󱊓md_toy_brick_search_outline
󰤔md_track_light
󰟸md_trackpad
󰤳md_trackpad_lock
󰢒md_tractor
󱓄md_tractor_variant
󰩸md_trademark
󱍼md_traffic_cone
󰔫md_traffic_light
󱠪md_traffic_light_outline
󰔬md_train
󰯘md_train_car
󱜳md_train_car_passenger
󱜴md_train_car_passenger_door
󱜵md_train_car_passenger_door_open
󱜶md_train_car_passenger_variant
󰣄md_train_variant
󰔭md_tram
󰿧md_tram_side
󰔮md_transcribe
󰔯md_transcribe_close
󱁥md_transfer
󰶡md_transfer_down
󰶢md_transfer_left
󰔰md_transfer_right
󰶣md_transfer_up
󰴼md_transit_connection
󱕆md_transit_connection_horizontal
󰴽md_transit_connection_variant
󰾋md_transit_detour
󱔕md_transit_skip
󰚮md_transit_transfer
󰤕md_transition
󰤖md_transition_masked
󰗊md_translate
󰸆md_translate_off
󰴾md_transmission_tower
󱤬md_transmission_tower_export
󱤭md_transmission_tower_import
󱧝md_transmission_tower_off
󰩹md_trash_can
󰩺md_trash_can_outline
󱊔md_tray
󱊕md_tray_alert
󰄠md_tray_arrow_down
󰄝md_tray_arrow_up
󱊖md_tray_full
󱊗md_tray_minus
󱊘md_tray_plus
󱊙md_tray_remove
󰜦md_treasure_chest
󰔱md_tree
󰹩md_tree_outline
󰔲md_trello
󰔳md_trending_down
󰔴md_trending_neutral
󰔵md_trending_up
󰔶md_triangle
󰔷md_triangle_outline
󱨉md_triangle_small_down
󱨊md_triangle_small_up
󱑼md_triangle_wave
󰯙md_triforce
󰔸md_trophy
󰔹md_trophy_award
󰶤md_trophy_broken
󰔺md_trophy_outline
󰔻md_trophy_variant
󰔼md_trophy_variant_outline
󰔽md_truck
󱧞md_truck_alert
󱧟md_truck_alert_outline
󱣘md_truck_cargo_container
󰳔md_truck_check
󱊚md_truck_check_outline
󰔾md_truck_delivery
󱊛md_truck_delivery_outline
󰞈md_truck_fast
󱊜md_truck_fast_outline
󱢑md_truck_flatbed
󱦮md_truck_minus
󱦽md_truck_minus_outline
󱊝md_truck_outline
󱦭md_truck_plus
󱦼md_truck_plus_outline
󱦯md_truck_remove
󱦾md_truck_remove_outline
󱦦md_truck_snowflake
󰜧md_truck_trailer
󱂖md_trumpet
󰩻md_tshirt_crew
󰔿md_tshirt_crew_outline
󰩼md_tshirt_v
󰕀md_tshirt_v_outline
󱪁md_tsunami
󰤗md_tumble_dryer
󱆺md_tumble_dryer_alert
󱆻md_tumble_dryer_off
󰘮md_tune
󱕂md_tune_variant
󰙪md_tune_vertical
󱕃md_tune_vertical_variant
󱠽md_tunnel
󱠾md_tunnel_outline
󱪂md_turbine
󱜛md_turkey
󰳕md_turnstile
󰳖md_turnstile_outline
󰳗md_turtle
󰕃md_twitch
󰕄md_twitter
󰦯md_two_factor_authentication
󰼭md_typewriter
󰯚md_ubisoft
󰕈md_ubuntu
󱃄md_ufo
󱃅md_ufo_outline
󰟹md_ultra_high_definition
󰕉md_umbraco
󰕊md_umbrella
󱢊md_umbrella_beach
󱢋md_umbrella_beach_outline
󰦰md_umbrella_closed
󱏢md_umbrella_closed_outline
󱏡md_umbrella_closed_variant
󰕋md_umbrella_outline
󰕌md_undo
󰕍md_undo_variant
󰕎md_unfold_less_horizontal
󰝠md_unfold_less_vertical
󰕏md_unfold_more_horizontal
󰝡md_unfold_more_vertical
󰕐md_ungroup
󰻐md_unicode
󱗂md_unicorn
󱗃md_unicorn_variant
󱗥md_unicycle
󰚯md_unity
󰦱md_unreal
󰚰md_update
󰕒md_upload
󱍳md_upload_lock
󱍴md_upload_lock_outline
󰠽md_upload_multiple
󰛶md_upload_network
󰳘md_upload_network_outline
󱃆md_upload_off
󱃇md_upload_off_outline
󰸇md_upload_outline
󰕓md_usb
󱊞md_usb_flash_drive
󱊟md_usb_flash_drive_outline
󱇰md_usb_port
󱦡md_vacuum
󱦢md_vacuum_outline
󱁦md_valve
󱁧md_valve_closed
󱁨md_valve_open
󰟺md_van_passenger
󰟻md_van_utility
󰟼md_vanish
󱕔md_vanish_quarter
󱇡md_vanity_light
󰫧md_variable
󱄑md_variable_box
󰕔md_vector_arrange_above
󰕕md_vector_arrange_below
󰫨md_vector_bezier
󰕖md_vector_circle
󰕗md_vector_circle_variant
󰕘md_vector_combine
󰕙md_vector_curve
󰕚md_vector_difference
󰕛md_vector_difference_ab
󰕜md_vector_difference_ba
󰢓md_vector_ellipse
󰕝md_vector_intersection
󰕞md_vector_line
󰿨md_vector_link
󰕟md_vector_point
󰕠md_vector_polygon
󱡖md_vector_polygon_variant
󰕡md_vector_polyline
󱈥md_vector_polyline_edit
󱈦md_vector_polyline_minus
󱈧md_vector_polyline_plus
󱈨md_vector_polyline_remove
󰝊md_vector_radius
󰗆md_vector_rectangle
󰕢md_vector_selection
󰀁md_vector_square
󱡗md_vector_square_close
󱣙md_vector_square_edit
󱣚md_vector_square_minus
󱡘md_vector_square_open
󱣛md_vector_square_plus
󱣜md_vector_square_remove
󰕣md_vector_triangle
󰕤md_vector_union
󰨛md_vhs
󰕦md_vibrate
󰳙md_vibrate_off
󰕧md_video
󱨜md_video_2d
󰟽md_video_3d
󱏙md_video_3d_off
󰻑md_video_3d_variant
󰠾md_video_4k_box
󰤙md_video_account
󰃽md_video_box
󰃾md_video_box_off
󱁩md_video_check
󱁪md_video_check_outline
󱔮md_video_high_definition
󰤚md_video_image
󰠿md_video_input_antenna
󰡀md_video_input_component
󰡁md_video_input_hdmi
󰾌md_video_input_scart
󰡂md_video_input_svideo
󱦩md_video_marker
󱦪md_video_marker_outline
󰦲md_video_minus
󰊺md_video_minus_outline
󰕨md_video_off
󰯛md_video_off_outline
󰯜md_video_outline
󰦳md_video_plus
󰇓md_video_plus_outline
󰤛md_video_stabilization
󰕩md_video_switch
󰞐md_video_switch_outline
󰨜md_video_vintage
󰻒md_video_wireless
󰻓md_video_wireless_outline
󰕪md_view_agenda
󱇘md_view_agenda_outline
󰕫md_view_array
󱒅md_view_array_outline
󰕬md_view_carousel
󱒆md_view_carousel_outline
󰕭md_view_column
󱒇md_view_column_outline
󰹪md_view_comfy
󱒈md_view_comfy_outline
󰹫md_view_compact
󰹬md_view_compact_outline
󰕮md_view_dashboard
󱥇md_view_dashboard_edit
󱥈md_view_dashboard_edit_outline
󰨝md_view_dashboard_outline
󰡃md_view_dashboard_variant
󱒉md_view_dashboard_variant_outline
󰕯md_view_day
󱒊md_view_day_outline
󱢈md_view_gallery
󱢉md_view_gallery_outline
󰕰md_view_grid
󱇙md_view_grid_outline
󰾍md_view_grid_plus
󱇚md_view_grid_plus_outline
󰕱md_view_headline
󰕲md_view_list
󱒋md_view_list_outline
󰕳md_view_module
󱒌md_view_module_outline
󰜨md_view_parallel
󱒍md_view_parallel_outline
󰕴md_view_quilt
󱒎md_view_quilt_outline
󰜩md_view_sequential
󱒏md_view_sequential_outline
󰯋md_view_split_horizontal
󰯌md_view_split_vertical
󰕵md_view_stream
󱒐md_view_stream_outline
󰕶md_view_week
󱒑md_view_week_outline
󰕷md_vimeo
󰘏md_violin
󰢔md_virtual_reality
󱎶md_virus
󱣡md_virus_off
󱣢md_virus_off_outline
󱎷md_virus_outline
󰕼md_vlc
󰕽md_voicemail
󱪃md_volcano
󱪄md_volcano_outline
󰦴md_volleyball
󰕾md_volume_high
󰕿md_volume_low
󰖀md_volume_medium
󰝞md_volume_minus
󰝟md_volume_mute
󰖁md_volume_off
󰝝md_volume_plus
󱄠md_volume_source
󰸈md_volume_variant_off
󱄡md_volume_vibrate
󰨟md_vote
󰨠md_vote_outline
󰖂md_vpn
󰡄md_vuejs
󰹭md_vuetify
󰖃md_walk
󰟾md_wall
󱨑md_wall_fire
󰤜md_wall_sconce
󰤝md_wall_sconce_flat
󱟉md_wall_sconce_flat_outline
󰐜md_wall_sconce_flat_variant
󱟊md_wall_sconce_flat_variant_outline
󱟋md_wall_sconce_outline
󰝈md_wall_sconce_round
󱟌md_wall_sconce_round_outline
󰤞md_wall_sconce_round_variant
󱟍md_wall_sconce_round_variant_outline
󰖄md_wallet
󰖅md_wallet_giftcard
󰖆md_wallet_membership
󰯝md_wallet_outline
󰾎md_wallet_plus
󰾏md_wallet_plus_outline
󰖇md_wallet_travel
󰸉md_wallpaper
󰖈md_wan
󰾐md_wardrobe
󰾑md_wardrobe_outline
󰾁md_warehouse
󰜪md_washing_machine
󱆼md_washing_machine_alert
󱆽md_washing_machine_off
󰖉md_watch
󰖊md_watch_export
󰢕md_watch_export_variant
󰖋md_watch_import
󰢖md_watch_import_variant
󰢗md_watch_variant
󰚱md_watch_vibrate
󰳚md_watch_vibrate_off
󰖌md_water
󱔂md_water_alert
󱔃md_water_alert_outline
󰾒md_water_boiler
󱆳md_water_boiler_alert
󱆴md_water_boiler_off
󱔄md_water_check
󱔅md_water_check_outline
󱠆md_water_circle
󱔆md_water_minus
󱔇md_water_minus_outline
󰖍md_water_off
󱔈md_water_off_outline
󱡕md_water_opacity
󰸊md_water_outline
󰖎md_water_percent
󱔉md_water_percent_alert
󱔊md_water_plus
󱔋md_water_plus_outline
󱊠md_water_polo
󰖏md_water_pump
󰾓md_water_pump_off
󱔌md_water_remove
󱔍md_water_remove_outline
󱟆md_water_sync
󱪅md_water_thermometer
󱪆md_water_thermometer_outline
󱁫md_water_well
󱁬md_water_well_outline
󱡉md_waterfall
󱒁md_watering_can
󱒂md_watering_can_outline
󰘒md_watermark
󰼮md_wave
󱑽md_waveform
󰞍md_waves
󱡙md_waves_arrow_left
󱡚md_waves_arrow_right
󱡛md_waves_arrow_up
󰯞md_waze
󰖐md_weather_cloudy
󰼯md_weather_cloudy_alert
󰹮md_weather_cloudy_arrow_right
󱣶md_weather_cloudy_clock
󰖑md_weather_fog
󰖒md_weather_hail
󰼰md_weather_hazy
󰢘md_weather_hurricane
󰖓md_weather_lightning
󰙾md_weather_lightning_rainy
󰖔md_weather_night
󰼱md_weather_night_partly_cloudy
󰖕md_weather_partly_cloudy
󰼲md_weather_partly_lightning
󰼳md_weather_partly_rainy
󰼴md_weather_partly_snowy
󰼵md_weather_partly_snowy_rainy
󰖖md_weather_pouring
󰖗md_weather_rainy
󰖘md_weather_snowy
󰼶md_weather_snowy_heavy
󰙿md_weather_snowy_rainy
󰖙md_weather_sunny
󰼷md_weather_sunny_alert
󱓤md_weather_sunny_off
󰖚md_weather_sunset
󰖛md_weather_sunset_down
󰖜md_weather_sunset_up
󰼸md_weather_tornado
󰖝md_weather_windy
󰖞md_weather_windy_variant
󰖟md_web
󰾔md_web_box
󱞐md_web_cancel
󰞉md_web_check
󱉊md_web_clock
󱂠md_web_minus
󰪎md_web_off
󰀳md_web_plus
󱞑md_web_refresh
󰕑md_web_remove
󱞒md_web_sync
󰖠md_webcam
󱜷md_webcam_off
󰘯md_webhook
󰜫md_webpack
󱉈md_webrtc
󰘑md_wechat
󰖡md_weight
󰴿md_weight_gram
󰖢md_weight_kilogram
󱅝md_weight_lifter
󰦵md_weight_pound
󰖣md_whatsapp
󱓲md_wheel_barrow
󱪇md_wheelchair
󰖤md_wheelchair_accessibility
󰦶md_whistle
󱊼md_whistle_outline
󰖥md_white_balance_auto
󰖦md_white_balance_incandescent
󰖧md_white_balance_iridescent
󰖨md_white_balance_sunny
󰜬md_widgets
󱍕md_widgets_outline
󰖩md_wifi
󱚵md_wifi_alert
󱚶md_wifi_arrow_down
󱚷md_wifi_arrow_left
󱚸md_wifi_arrow_left_right
󱚹md_wifi_arrow_right
󱚺md_wifi_arrow_up
󱚻md_wifi_arrow_up_down
󱚼md_wifi_cancel
󱚽md_wifi_check
󱚾md_wifi_cog
󱚿md_wifi_lock
󱛀md_wifi_lock_open
󱛁md_wifi_marker
󱛂md_wifi_minus
󰖪md_wifi_off
󱛃md_wifi_plus
󱛄md_wifi_refresh
󱛅md_wifi_remove
󱛆md_wifi_settings
󰸋md_wifi_star
󰤟md_wifi_strength_1
󰤠md_wifi_strength_1_alert
󰤡md_wifi_strength_1_lock
󱛋md_wifi_strength_1_lock_open
󰤢md_wifi_strength_2
󰤣md_wifi_strength_2_alert
󰤤md_wifi_strength_2_lock
󱛌md_wifi_strength_2_lock_open
󰤥md_wifi_strength_3
󰤦md_wifi_strength_3_alert
󰤧md_wifi_strength_3_lock
󱛍md_wifi_strength_3_lock_open
󰤨md_wifi_strength_4
󰤩md_wifi_strength_4_alert
󰤪md_wifi_strength_4_lock
󱛎md_wifi_strength_4_lock_open
󰤫md_wifi_strength_alert_outline
󱛏md_wifi_strength_lock_open_outline
󰤬md_wifi_strength_lock_outline
󰤭md_wifi_strength_off
󰤮md_wifi_strength_off_outline
󰤯md_wifi_strength_outline
󱛇md_wifi_sync
󰖬md_wikipedia
󱪈md_wind_power
󱪉md_wind_power_outline
󰶥md_wind_turbine
󱦫md_wind_turbine_alert
󱦬md_wind_turbine_check
󰖭md_window_close
󰖮md_window_closed
󱇛md_window_closed_variant
󰖯md_window_maximize
󰖰md_window_minimize
󰖱md_window_open
󱇜md_window_open_variant
󰖲md_window_restore
󱄜md_window_shutter
󱄝md_window_shutter_alert
󱪊md_window_shutter_cog
󱄞md_window_shutter_open
󱪋md_window_shutter_settings
󱗺md_windsock
󰫩md_wiper
󰶦md_wiper_wash
󱣟md_wiper_wash_alert
󱑷md_wizard_hat
󰖴md_wordpress
󰖶md_wrap
󰯟md_wrap_disabled
󰖷md_wrench
󱦣md_wrench_clock
󰯠md_wrench_outline
󰡅md_xamarin
󰗀md_xml
󰟿md_xmpp
󰭏md_yahoo
󰗁md_yeast
󰚀md_yin_yang
󱅼md_yoga
󰗃md_youtube
󰡈md_youtube_gaming
󰡇md_youtube_studio
󰵀md_youtube_subscription
󰑈md_youtube_tv
󱔖md_yurt
󰫪md_z_wave
󰫫md_zend
󰵁md_zigbee
󰗄md_zip_box
󰿺md_zip_box_outline
󰨣md_zip_disk
󰩽md_zodiac_aquarius
󰩾md_zodiac_aries
󰩿md_zodiac_cancer
󰪀md_zodiac_capricorn
󰪁md_zodiac_gemini
󰪂md_zodiac_leo
󰪃md_zodiac_libra
󰪄md_zodiac_pisces
󰪅md_zodiac_sagittarius
󰪆md_zodiac_scorpio
󰪇md_zodiac_taurus
󰪈md_zodiac_virgo
oct_accessibility
oct_accessibility_inset
oct_alert
oct_alert_fill
oct_apps
oct_archive
oct_arrow_both
oct_arrow_down
oct_arrow_down_left
oct_arrow_down_right
oct_arrow_left
oct_arrow_right
oct_arrow_switch
oct_arrow_up
oct_arrow_up_left
oct_arrow_up_right
oct_beaker
oct_bell
oct_bell_fill
oct_bell_slash
oct_blocked
oct_bold
oct_book
oct_bookmark
oct_bookmark_fill
oct_bookmark_slash
oct_bookmark_slash_fill
oct_briefcase
oct_broadcast
oct_browser
oct_bug
oct_cache
oct_calendar
oct_check
oct_check_circle
oct_check_circle_fill
oct_checkbox
oct_checklist
oct_chevron_down
oct_chevron_left
oct_chevron_right
oct_chevron_up
oct_circle
oct_circle_slash
oct_clock
oct_clock_fill
oct_cloud
oct_cloud_offline
oct_code
oct_code_of_conduct
oct_code_review
oct_code_square
oct_codescan
oct_codescan_checkmark
oct_codespaces
oct_columns
oct_command_palette
oct_comment
oct_comment_discussion
oct_commit
oct_container
oct_copilot
oct_copilot_error
oct_copilot_warning
oct_copy
oct_cpu
oct_credit_card
oct_cross_reference
oct_dash
oct_database
oct_dependabot
oct_desktop_download
oct_device_camera
oct_device_camera_video
oct_device_desktop
oct_device_mobile
oct_diamond
oct_diff
oct_diff_added
oct_diff_ignored
oct_diff_modified
oct_diff_removed
oct_diff_renamed
oct_discussion_closed
oct_discussion_duplicate
oct_discussion_outdated
oct_dot
oct_dot_fill
oct_download
oct_duplicate
oct_ellipsis
oct_eye
oct_eye_closed
oct_feed_discussion
oct_feed_forked
oct_feed_heart
oct_feed_merged
oct_feed_person
oct_feed_repo
oct_feed_rocket
oct_feed_star
oct_feed_tag
oct_feed_trophy
oct_file
oct_file_added
oct_file_badge
oct_file_binary
oct_file_code
oct_file_diff
oct_file_directory
oct_file_directory_fill
oct_file_directory_open_fill
oct_file_media
oct_file_moved
oct_file_removed
oct_file_submodule
oct_file_symlink_directory
oct_file_symlink_file
oct_file_zip
oct_filter
oct_fiscal_host
oct_flame
oct_fold
oct_fold_down
oct_fold_up
oct_gear
oct_gift
oct_git_branch
oct_git_commit
oct_git_compare
oct_git_merge
oct_git_merge_queue
oct_git_pull_request
oct_git_pull_request_closed
oct_git_pull_request_draft
oct_globe
oct_goal
oct_grabber
oct_graph
oct_hash
oct_heading
oct_heart
oct_heart_fill
oct_history
oct_home
oct_home_fill
oct_horizontal_rule
oct_hourglass
oct_hubot
oct_id_badge
oct_image
oct_inbox
oct_infinity
oct_info
oct_issue_closed
oct_issue_draft
oct_issue_opened
oct_issue_reopened
oct_issue_tracked_by
oct_issue_tracks
oct_italic
oct_iterations
oct_kebab_horizontal
oct_key
oct_key_asterisk
oct_law
oct_light_bulb
oct_link
oct_link_external
oct_list_ordered
oct_list_unordered
oct_location
oct_lock
oct_log
oct_logo_gist
oct_logo_github
oct_mail
oct_mark_github
oct_markdown
oct_megaphone
oct_mention
oct_meter
oct_milestone
oct_mirror
oct_moon
oct_mortar_board
oct_move_to_bottom
oct_move_to_end
oct_move_to_start
oct_move_to_top
oct_multi_select
oct_mute
oct_no_entry
oct_north_star
oct_note
oct_number
oct_organization
oct_package
oct_package_dependencies
oct_package_dependents
oct_paintbrush
oct_paper_airplane
oct_paperclip
oct_passkey_fill
oct_paste
oct_pencil
oct_people
oct_person
oct_person_add
oct_person_fill
oct_pin
oct_play
oct_plug
oct_plus
oct_plus_circle
oct_project
oct_project_roadmap
oct_project_symlink
oct_project_template
oct_pulse
oct_question
oct_quote
oct_read
oct_rel_file_path
oct_reply
oct_repo
oct_repo_clone
oct_repo_deleted
oct_repo_forked
oct_repo_locked
oct_repo_pull
oct_repo_push
oct_repo_template
oct_report
oct_rocket
oct_rows
oct_rss
oct_ruby
oct_screen_full
oct_screen_normal
oct_search
oct_server
oct_share
oct_share_android
oct_shield
oct_shield_check
oct_shield_lock
oct_shield_slash
oct_shield_x
oct_sidebar_collapse
oct_sidebar_expand
oct_sign_in
oct_sign_out
oct_single_select
oct_skip
oct_skip_fill
oct_sliders
oct_smiley
oct_sort_asc
oct_sort_desc
oct_sparkle_fill
oct_sponsor_tiers
oct_square
oct_square_fill
oct_squirrel
oct_stack
oct_star
oct_star_fill
oct_stop
oct_stopwatch
oct_strikethrough
oct_sun
oct_sync
oct_tab
oct_tab_external
oct_table
oct_tag
oct_tasklist
oct_telescope
oct_telescope_fill
oct_terminal
oct_three_bars
oct_thumbsdown
oct_thumbsup
oct_tools
oct_trash
oct_triangle_down
oct_triangle_left
oct_triangle_right
oct_triangle_up
oct_trophy
oct_typography
oct_unfold
oct_unlink
oct_unlock
oct_unmute
oct_unread
oct_unverified
oct_upload
oct_verified
oct_versions
oct_video
oct_webhook
oct_workflow
oct_x
oct_x_circle
oct_x_circle_fill
oct_zap
oct_zoom_in
oct_zoom_out
pl_branch
pl_current_line
pl_hostname
pl_left_hard_divider
pl_left_soft_divider
pl_line_number
pl_readonly
pl_right_hard_divider
pl_right_soft_divider
ple_backslash_separator
ple_backslash_separator_redundant
ple_column_number
ple_current_column
ple_flame_thick
ple_flame_thick_mirrored
ple_flame_thin
ple_flame_thin_mirrored
ple_forwardslash_separator
ple_forwardslash_separator_redundant
ple_honeycomb
ple_honeycomb_outline
ple_ice_waveform
ple_ice_waveform_mirrored
ple_left_half_circle_thick
ple_left_half_circle_thin
ple_left_hard_divider_inverse
ple_lego_block_facing
ple_lego_block_sideways
ple_lego_separator
ple_lego_separator_thin
ple_lower_left_triangle
ple_lower_right_triangle
ple_pixelated_squares_big
ple_pixelated_squares_big_mirrored
ple_pixelated_squares_small
ple_pixelated_squares_small_mirrored
ple_right_half_circle_thick
ple_right_half_circle_thin
ple_right_hard_divider_inverse
ple_trapezoid_top_bottom
ple_trapezoid_top_bottom_mirrored
ple_upper_left_triangle
ple_upper_right_triangle
pom_away
pom_clean_code
pom_external_interruption
pom_internal_interruption
pom_long_pause
pom_pair_programming
pom_pomodoro_done
pom_pomodoro_estimated
pom_pomodoro_squashed
pom_pomodoro_ticking
pom_short_pause
seti_apple
seti_argdown
seti_asm
seti_audio
seti_babel
seti_bazel
seti_bicep
seti_bower
seti_bsl
seti_c
seti_c_sharp
seti_cake
seti_cake_php
seti_checkbox
seti_checkbox_unchecked
seti_cjsx
seti_clock
seti_clojure
seti_code_climate
seti_code_search
seti_coffee
seti_coldfusion
seti_config
seti_cpp
seti_crystal
seti_crystal_embedded
seti_css
seti_csv
seti_cu
seti_d
seti_dart
seti_db
seti_default
seti_deprecation_cop
seti_docker
seti_editorconfig
seti_ejs
seti_elixir
seti_elixir_script
seti_elm
seti_error
seti_eslint
seti_ethereum
seti_f_sharp
seti_favicon
seti_firebase
seti_firefox
seti_folder
seti_font
seti_git
seti_git_folder
seti_git_ignore
seti_github
seti_gitlab
seti_go
seti_go2
seti_godot
seti_gradle
seti_grails
seti_graphql
seti_grunt
seti_gulp
seti_hacklang
seti_haml
seti_happenings
seti_haskell
seti_haxe
seti_heroku
seti_hex
seti_home
seti_html
seti_ignored
seti_illustrator
seti_image
seti_info
seti_ionic
seti_jade
seti_java
seti_javascript
seti_jenkins
seti_jinja
seti_json
seti_julia
seti_karma
seti_kotlin
seti_less
seti_license
seti_liquid
seti_livescript
seti_lock
seti_lua
seti_makefile
seti_markdown
seti_maven
seti_mdo
seti_mustache
seti_new_file
seti_nim
seti_notebook
seti_npm
seti_npm_ignored
seti_nunjucks
seti_ocaml
seti_odata
seti_pddl
seti_pdf
seti_perl
seti_photoshop
seti_php
seti_pipeline
seti_plan
seti_platformio
seti_play_arrow
seti_powershell
seti_prisma
seti_project
seti_prolog
seti_pug
seti_puppet
seti_purescript
seti_python
seti_r
seti_rails
seti_react
seti_reasonml
seti_rescript
seti_rollup
seti_ruby
seti_rust
seti_salesforce
seti_sass
seti_sbt
seti_scala
seti_search
seti_settings
seti_shell
seti_slim
seti_smarty
seti_spring
seti_stylelint
seti_stylus
seti_sublime
seti_svelte
seti_svg
seti_swift
seti_terraform
seti_tex
seti_text
seti_time_cop
seti_todo
seti_tsconfig
seti_twig
seti_typescript
seti_vala
seti_video
seti_vue
seti_wasm
seti_wat
seti_webpack
seti_wgt
seti_word
seti_xls
seti_xml
seti_yarn
seti_yml
seti_zig
seti_zip
weather_alien
weather_aliens
weather_barometer
weather_celsius
weather_cloud
weather_cloud_down
weather_cloud_refresh
weather_cloud_up
weather_cloudy
weather_cloudy_gusts
weather_cloudy_windy
weather_day_cloudy
weather_day_cloudy_gusts
weather_day_cloudy_high
weather_day_cloudy_windy
weather_day_fog
weather_day_hail
weather_day_haze
weather_day_light_wind
weather_day_lightning
weather_day_rain
weather_day_rain_mix
weather_day_rain_wind
weather_day_showers
weather_day_sleet
weather_day_sleet_storm
weather_day_snow
weather_day_snow_thunderstorm
weather_day_snow_wind
weather_day_sprinkle
weather_day_storm_showers
weather_day_sunny
weather_day_sunny_overcast
weather_day_thunderstorm
weather_day_windy
weather_degrees
weather_direction_down
weather_direction_down_left
weather_direction_down_right
weather_direction_left
weather_direction_right
weather_direction_up
weather_direction_up_left
weather_direction_up_right
weather_dust
weather_earthquake
weather_fahrenheit
weather_fire
weather_flood
weather_fog
weather_gale_warning
weather_hail
weather_horizon
weather_horizon_alt
weather_hot
weather_humidity
weather_hurricane
weather_hurricane_warning
weather_lightning
weather_lunar_eclipse
weather_meteor
weather_moon_alt_first_quarter
weather_moon_alt_full
weather_moon_alt_new
weather_moon_alt_third_quarter
weather_moon_alt_waning_crescent_1
weather_moon_alt_waning_crescent_2
weather_moon_alt_waning_crescent_3
weather_moon_alt_waning_crescent_4
weather_moon_alt_waning_crescent_5
weather_moon_alt_waning_crescent_6
weather_moon_alt_waning_gibbous_1
weather_moon_alt_waning_gibbous_2
weather_moon_alt_waning_gibbous_3
weather_moon_alt_waning_gibbous_4
weather_moon_alt_waning_gibbous_5
weather_moon_alt_waning_gibbous_6
weather_moon_alt_waxing_crescent_1
weather_moon_alt_waxing_crescent_2
weather_moon_alt_waxing_crescent_3
weather_moon_alt_waxing_crescent_4
weather_moon_alt_waxing_crescent_5
weather_moon_alt_waxing_crescent_6
weather_moon_alt_waxing_gibbous_1
weather_moon_alt_waxing_gibbous_2
weather_moon_alt_waxing_gibbous_3
weather_moon_alt_waxing_gibbous_4
weather_moon_alt_waxing_gibbous_5
weather_moon_alt_waxing_gibbous_6
weather_moon_first_quarter
weather_moon_full
weather_moon_new
weather_moon_third_quarter
weather_moon_waning_crescent_1
weather_moon_waning_crescent_2
weather_moon_waning_crescent_3
weather_moon_waning_crescent_4
weather_moon_waning_crescent_5
weather_moon_waning_crescent_6
weather_moon_waning_gibbous_1
weather_moon_waning_gibbous_2
weather_moon_waning_gibbous_3
weather_moon_waning_gibbous_4
weather_moon_waning_gibbous_5
weather_moon_waning_gibbous_6
weather_moon_waxing_crescent_1
weather_moon_waxing_crescent_2
weather_moon_waxing_crescent_3
weather_moon_waxing_crescent_4
weather_moon_waxing_crescent_5
weather_moon_waxing_crescent_6
weather_moon_waxing_gibbous_1
weather_moon_waxing_gibbous_2
weather_moon_waxing_gibbous_3
weather_moon_waxing_gibbous_4
weather_moon_waxing_gibbous_5
weather_moon_waxing_gibbous_6
weather_moonrise
weather_moonset
weather_na
weather_night_alt_cloudy
weather_night_alt_cloudy_gusts
weather_night_alt_cloudy_high
weather_night_alt_cloudy_windy
weather_night_alt_hail
weather_night_alt_lightning
weather_night_alt_partly_cloudy
weather_night_alt_rain
weather_night_alt_rain_mix
weather_night_alt_rain_wind
weather_night_alt_showers
weather_night_alt_sleet
weather_night_alt_sleet_storm
weather_night_alt_snow
weather_night_alt_snow_thunderstorm
weather_night_alt_snow_wind
weather_night_alt_sprinkle
weather_night_alt_storm_showers
weather_night_alt_thunderstorm
weather_night_clear
weather_night_cloudy
weather_night_cloudy_gusts
weather_night_cloudy_high
weather_night_cloudy_windy
weather_night_fog
weather_night_hail
weather_night_lightning
weather_night_partly_cloudy
weather_night_rain
weather_night_rain_mix
weather_night_rain_wind
weather_night_showers
weather_night_sleet
weather_night_sleet_storm
weather_night_snow
weather_night_snow_thunderstorm
weather_night_snow_wind
weather_night_sprinkle
weather_night_storm_showers
weather_night_thunderstorm
weather_rain
weather_rain_mix
weather_rain_wind
weather_raindrop
weather_raindrops
weather_refresh
weather_refresh_alt
weather_sandstorm
weather_showers
weather_sleet
weather_small_craft_advisory
weather_smog
weather_smoke
weather_snow
weather_snow_wind
weather_snowflake_cold
weather_solar_eclipse
weather_sprinkle
weather_stars
weather_storm_showers
weather_storm_warning
weather_strong_wind
weather_sunrise
weather_sunset
weather_thermometer
weather_thermometer_exterior
weather_thermometer_internal
weather_thunderstorm
weather_time_1
weather_time_2
weather_time_3
weather_time_4
weather_time_5
weather_time_6
weather_time_7
weather_time_8
weather_time_9
weather_time_10
weather_time_11
weather_time_12
weather_tornado
weather_train
weather_tsunami
weather_umbrella
weather_volcano
weather_wind_beaufort_0
weather_wind_beaufort_1
weather_wind_beaufort_2
weather_wind_beaufort_3
weather_wind_beaufort_4
weather_wind_beaufort_5
weather_wind_beaufort_6
weather_wind_beaufort_7
weather_wind_beaufort_8
weather_wind_beaufort_9
weather_wind_beaufort_10
weather_wind_beaufort_11
weather_wind_beaufort_12
weather_wind_direction
weather_wind_east
weather_wind_north
weather_wind_north_east
weather_wind_north_west
weather_wind_south
weather_wind_south_east
weather_wind_south_west
weather_wind_west
weather_windy

title: wezterm.on tags:

  • utility
  • event

wezterm.on(event_name, callback)

{{since('20201031-154415-9614e117')}}

This function follows the html/javascript naming for defining event handlers.

wezterm.on causes your specified callback to be called when event_name is emitted. Events can be emitted by wezterm itself, or through code/configuration that you specify.

wezterm.on can register multiple callbacks for the same event; internally an ordered list of callbacks is maintained for each event. When the event is emitted, each of the registered callbacks is called in the order that they were registered.

The callback will receive the following parameters:

If a callback returns false it will prevent any callbacks that were registered after it from being triggered for the current event. Some events have a defined default action; returning false will prevent that default action from being taken for the current event.

There is no way to de-register an event handler. However, since the Lua state is built from scratch when the configuration is reloaded, simply reloading the configuration will clear any existing event handlers.

See wezterm.action_callback for a helper to define a custom action callback.

Predefined Events

See Window Events for a list of pre-defined events.

Custom Events

You may register handlers for arbitrary events for which wezterm itself has no special knowledge. It is recommended that you avoid event names that are likely to be used future versions of wezterm in order to avoid unexpected behavior if/when those names might be used in future.

The wezterm.emit function and the EmitEvent key assignment can be used to emit events.

Example: opening whole scrollback in vim

In the following example, a key is assigned to capture the entire scrollback and visible area of the active pane, write it to a file and then open that file in the vim editor:

local wezterm = require 'wezterm'
local io = require 'io'
local os = require 'os'
local act = wezterm.action

wezterm.on('trigger-vim-with-scrollback', function(window, pane)
  -- Retrieve the text from the pane
  local text = pane:get_lines_as_text(pane:get_dimensions().scrollback_rows)

  -- Create a temporary file to pass to vim
  local name = os.tmpname()
  local f = io.open(name, 'w+')
  f:write(text)
  f:flush()
  f:close()

  -- Open a new window running vim and tell it to open the file
  window:perform_action(
    act.SpawnCommandInNewWindow {
      args = { 'vim', name },
    },
    pane
  )

  -- Wait "enough" time for vim to read the file before we remove it.
  -- The window creation and process spawn are asynchronous wrt. running
  -- this script and are not awaitable, so we just pick a number.
  --
  -- Note: We don't strictly need to remove this file, but it is nice
  -- to avoid cluttering up the temporary directory.
  wezterm.sleep_ms(1000)
  os.remove(name)
end)

return {
  keys = {
    {
      key = 'E',
      mods = 'CTRL',
      action = act.EmitEvent 'trigger-vim-with-scrollback',
    },
  },
}

title: wezterm.open_with tags:

  • utility
  • open
  • spawn

wezterm.open_with(path_or_url [, application])

{{since('20220101-133340-7edc5b5a')}}

This function opens the specified path_or_url with either the specified application or uses the default application if application was not passed in.

-- Opens a URL in your default browser
wezterm.open_with 'http://example.com'

-- Opens a URL specifically in firefox
wezterm.open_with('http://example.com', 'firefox')

title: wezterm.pad_left tags:

  • utility
  • string

wezterm.pad_left(string, min_width)

{{since('20210502-130208-bff6815d')}}

Returns a copy of string that is at least min_width columns (as measured by wezterm.column_width).

If the string is shorter than min_width, spaces are added to the left end of the string.

For example, wezterm.pad_left("o", 3) returns " o".

See also: wezterm.truncate_left, wezterm.pad_right.


title: wezterm.pad_right tags:

  • utility
  • string

wezterm.pad_right(string, min_width)

{{since('20210502-130208-bff6815d')}}

Returns a copy of string that is at least min_width columns (as measured by wezterm.column_width).

If the string is shorter than min_width, spaces are added to the right end of the string.

For example, wezterm.pad_right("o", 3) returns "o ".

See also: wezterm.truncate_left, wezterm.pad_left.


title: wezterm.permute_any_mods tags:

  • utility
  • keys

wezterm.permute_any_mods(table)

{{since('20201031-154415-9614e117')}}

This function is intended to help with generating key or mouse binding entries that should apply regardless of the combination of modifier keys pressed.

For each combination of modifiers CTRL, ALT, SHIFT and SUPER, the supplied table value is copied and has mods = <value> set into the copy.

An entry for NONE is NOT generated (this is the only difference between permute_any_mods and permute_any_or_no_mods).

An array holding all of those combinations is returned.

If this is your only binding, or it is the last binding, the resulting array can be unpacked into a lua table initializer and used like this:

local wezterm = require 'wezterm'

return {
  mouse_bindings = {
    table.unpack(wezterm.permute_any_mods {
      event = { Down = { streak = 1, button = 'Middle' } },
      action = 'PastePrimarySelection',
    }),
  },
}

(and if you have other bindings before and/or after, use a for loop to iterate and add each binding to your bindings table)

This is equivalent to writing this out, but is much less verbose:

return {
  mouse_bindings = {
    {
      action = 'PastePrimarySelection',
      event = {
        Down = {
          button = 'Middle',
          streak = 1,
        },
      },
      mods = 'SUPER',
    },
    {
      action = 'PastePrimarySelection',
      event = {
        Down = {
          button = 'Middle',
          streak = 1,
        },
      },
      mods = 'ALT',
    },
    {
      action = 'PastePrimarySelection',
      event = {
        Down = {
          button = 'Middle',
          streak = 1,
        },
      },
      mods = 'ALT | SUPER',
    },
    {
      action = 'PastePrimarySelection',
      event = {
        Down = {
          button = 'Middle',
          streak = 1,
        },
      },
      mods = 'SHIFT',
    },
    {
      action = 'PastePrimarySelection',
      event = {
        Down = {
          button = 'Middle',
          streak = 1,
        },
      },
      mods = 'SHIFT | SUPER',
    },
    {
      action = 'PastePrimarySelection',
      event = {
        Down = {
          button = 'Middle',
          streak = 1,
        },
      },
      mods = 'SHIFT | ALT',
    },
    {
      action = 'PastePrimarySelection',
      event = {
        Down = {
          button = 'Middle',
          streak = 1,
        },
      },
      mods = 'SHIFT | ALT | SUPER',
    },
    {
      action = 'PastePrimarySelection',
      event = {
        Down = {
          button = 'Middle',
          streak = 1,
        },
      },
      mods = 'CTRL',
    },
    {
      action = 'PastePrimarySelection',
      event = {
        Down = {
          button = 'Middle',
          streak = 1,
        },
      },
      mods = 'CTRL | SUPER',
    },
    {
      action = 'PastePrimarySelection',
      event = {
        Down = {
          button = 'Middle',
          streak = 1,
        },
      },
      mods = 'ALT | CTRL',
    },
    {
      action = 'PastePrimarySelection',
      event = {
        Down = {
          button = 'Middle',
          streak = 1,
        },
      },
      mods = 'ALT | CTRL | SUPER',
    },
    {
      action = 'PastePrimarySelection',
      event = {
        Down = {
          button = 'Middle',
          streak = 1,
        },
      },
      mods = 'SHIFT | CTRL',
    },
    {
      action = 'PastePrimarySelection',
      event = {
        Down = {
          button = 'Middle',
          streak = 1,
        },
      },
      mods = 'SHIFT | CTRL | SUPER',
    },
    {
      action = 'PastePrimarySelection',
      event = {
        Down = {
          button = 'Middle',
          streak = 1,
        },
      },
      mods = 'SHIFT | ALT | CTRL',
    },
    {
      action = 'PastePrimarySelection',
      event = {
        Down = {
          button = 'Middle',
          streak = 1,
        },
      },
      mods = 'SHIFT | ALT | CTRL | SUPER',
    },
  },
}

title: wezterm.permute_any_or_no_mods tags:

  • utility
  • keys

wezterm.permute_any_or_no_mods(table)

{{since('20201031-154415-9614e117')}}

This function is intended to help with generating key or mouse binding entries that should apply regardless of the combination of modifier keys pressed.

For each combination of modifiers CTRL, ALT, SHIFT and SUPER, the supplied table value is copied and has mods = <value> set into the copy.

In addition, an entry for NONE is generated (this is the only difference between permute_any_mods and permute_any_or_no_mods).

An array holding all of those combinations is returned.

If this is your only binding, or it is the last binding, the resulting array can be unpacked into a lua table initializer and used like this:

local wezterm = require 'wezterm'

return {
  mouse_bindings = {
    table.unpack(wezterm.permute_any_or_no_mods {
      event = { Down = { streak = 1, button = 'Middle' } },
      action = 'PastePrimarySelection',
    }),
  },
}

(and if you have other bindings before and/or after, use a for loop to iterate and add each binding to your bindings table)

This is equivalent to writing this out, but is much less verbose:

return {
  mouse_bindings = {
    {
      action = 'PastePrimarySelection',
      event = {
        Down = {
          button = 'Middle',
          streak = 1,
        },
      },
      mods = 'NONE',
    },
    {
      action = 'PastePrimarySelection',
      event = {
        Down = {
          button = 'Middle',
          streak = 1,
        },
      },
      mods = 'SUPER',
    },
    {
      action = 'PastePrimarySelection',
      event = {
        Down = {
          button = 'Middle',
          streak = 1,
        },
      },
      mods = 'ALT',
    },
    {
      action = 'PastePrimarySelection',
      event = {
        Down = {
          button = 'Middle',
          streak = 1,
        },
      },
      mods = 'ALT | SUPER',
    },
    {
      action = 'PastePrimarySelection',
      event = {
        Down = {
          button = 'Middle',
          streak = 1,
        },
      },
      mods = 'SHIFT',
    },
    {
      action = 'PastePrimarySelection',
      event = {
        Down = {
          button = 'Middle',
          streak = 1,
        },
      },
      mods = 'SHIFT | SUPER',
    },
    {
      action = 'PastePrimarySelection',
      event = {
        Down = {
          button = 'Middle',
          streak = 1,
        },
      },
      mods = 'SHIFT | ALT',
    },
    {
      action = 'PastePrimarySelection',
      event = {
        Down = {
          button = 'Middle',
          streak = 1,
        },
      },
      mods = 'SHIFT | ALT | SUPER',
    },
    {
      action = 'PastePrimarySelection',
      event = {
        Down = {
          button = 'Middle',
          streak = 1,
        },
      },
      mods = 'CTRL',
    },
    {
      action = 'PastePrimarySelection',
      event = {
        Down = {
          button = 'Middle',
          streak = 1,
        },
      },
      mods = 'CTRL | SUPER',
    },
    {
      action = 'PastePrimarySelection',
      event = {
        Down = {
          button = 'Middle',
          streak = 1,
        },
      },
      mods = 'ALT | CTRL',
    },
    {
      action = 'PastePrimarySelection',
      event = {
        Down = {
          button = 'Middle',
          streak = 1,
        },
      },
      mods = 'ALT | CTRL | SUPER',
    },
    {
      action = 'PastePrimarySelection',
      event = {
        Down = {
          button = 'Middle',
          streak = 1,
        },
      },
      mods = 'SHIFT | CTRL',
    },
    {
      action = 'PastePrimarySelection',
      event = {
        Down = {
          button = 'Middle',
          streak = 1,
        },
      },
      mods = 'SHIFT | CTRL | SUPER',
    },
    {
      action = 'PastePrimarySelection',
      event = {
        Down = {
          button = 'Middle',
          streak = 1,
        },
      },
      mods = 'SHIFT | ALT | CTRL',
    },
    {
      action = 'PastePrimarySelection',
      event = {
        Down = {
          button = 'Middle',
          streak = 1,
        },
      },
      mods = 'SHIFT | ALT | CTRL | SUPER',
    },
  },
}

title: wezterm.read_dir tags:

  • utility
  • filesystem

wezterm.read_dir(path)

{{since('20200503-171512-b13ef15f')}}

This function returns an array containing the absolute file names of the directory specified. Due to limitations in the lua bindings, all of the paths must be able to be represented as UTF-8 or this function will generate an error.

local wezterm = require 'wezterm'

-- logs the names of all of the entries under `/etc`
for _, v in ipairs(wezterm.read_dir '/etc') do
  wezterm.log_error('entry: ' .. v)
end

title: wezterm.reload_configuration tags:

  • reload

wezterm.reload_configuration()

{{since('20220807-113146-c2fee766')}}

Immediately causes the configuration to be reloaded and re-applied.

If you call this at the file scope in your config you will create an infinite loop that renders wezterm unresponsive, so don't do that!

The intent is for this to be used from an event or timer callback function.


title: wezterm.run_child_process tags:

  • utility
  • open
  • spawn

wezterm.run_child_process(args)

{{since('20200503-171512-b13ef15f')}}

This function accepts an argument list; it will attempt to spawn that command and will return a tuple consisting of the boolean success of the invocation, the stdout data and the stderr data.

local wezterm = require 'wezterm'

local success, stdout, stderr = wezterm.run_child_process { 'ls', '-l' }

See also background_child_process


title: wezterm.running_under_wsl tags:

  • utility

wezterm.running_under_wsl()

This function returns a boolean indicating whether we believe that we are running in a Windows Services for Linux (WSL) container. In such an environment the wezterm.target_triple will indicate that we are running in Linux but there will be some slight differences in system behavior (such as filesystem capabilities) that you may wish to probe for in the configuration.

local wezterm = require 'wezterm'
wezterm.log_error(
  'System '
    .. wezterm.target_triple
    .. ' '
    .. tostring(wezterm.running_under_wsl())
)

title: wezterm.shell_join_args tags:

  • utility
  • open
  • spawn
  • string

wezterm.shell_join_args({"foo", "bar"})

{{since('20220807-113146-c2fee766')}}

wezterm.shell_join_args joins together its array arguments by applying posix style shell quoting on each argument and then adding a space.

> wezterm.shell_join_args{"foo", "bar"}
"foo bar"
> wezterm.shell_join_args{"hello there", "you"}
"\"hello there\" you"

This is useful to safely construct command lines that you wish to pass to the shell.


title: wezterm.shell_quote_arg tags:

  • utility
  • open
  • spawn
  • string

wezterm.shell_quote_arg(string)

{{since('20220807-113146-c2fee766')}}

Quotes its single argument using posix shell quoting rules.

> wezterm.shell_quote_arg("hello there")
"\"hello there\""

title: wezterm.shell_split tags:

  • utility
  • open
  • spawn
  • string

wezterm.shell_split(line)

{{since('20220807-113146-c2fee766')}}

Splits a command line into an argument array according to posix shell rules.

> wezterm.shell_split("ls -a")
[
    "ls",
    "-a",
]
> wezterm.shell_split("echo 'hello there'")
[
    "echo",
    "hello there",
]

title: wezterm.sleep_ms tags:

  • utility
  • time

wezterm.sleep_ms(milliseconds)

{{since('20201031-154415-9614e117')}}

wezterm.sleep_ms suspends execution of the script for the specified number of milliseconds. After that time period has elapsed, the script continues running at the next statement.


title: wezterm.split_by_newlines tags:

  • utility
  • string

wezterm.split_by_newlines(str)

{{since('20200503-171512-b13ef15f')}}

This function takes the input string and splits it by newlines (both \n and \r\n are recognized as newlines) and returns the result as an array of strings that have the newlines removed.

local wezterm = require 'wezterm'

local example = 'hello\nthere\n'

for _, line in ipairs(wezterm.split_by_newlines(example)) do
  wezterm.log_error(line)
end

title: wezterm.strftime tags:

  • utility
  • time
  • string

wezterm.strftime(format)

{{since('20210314-114017-04b7cedd')}}

Formats the current local date/time into a string using the Rust chrono strftime syntax.

local wezterm = require 'wezterm'

local date_and_time = wezterm.strftime '%Y-%m-%d %H:%M:%S'
wezterm.log_info(date_and_time)

See also strftime_utc and wezterm.time.


title: wezterm.strftime_utc tags:

  • utility
  • time
  • string

wezterm.strftime_utc(format)

{{since('20220624-141144-bd1b7c5d')}}

Formats the current UTC date/time into a string using the Rust chrono strftime syntax.

local wezterm = require 'wezterm'

local date_and_time = wezterm.strftime_utc '%Y-%m-%d %H:%M:%S'
wezterm.log_info(date_and_time)

See also strftime and wezterm.time.


title: wezterm.target_triple tags:

  • utility
  • version

wezterm.target_triple

This constant is set to the Rust target triple for the platform on which wezterm was built. This can be useful when you wish to conditionally adjust your configuration based on the platform.

local wezterm = require 'wezterm'

if wezterm.target_triple == 'x86_64-pc-windows-msvc' then
  -- We are running on Windows; maybe we emit different
  -- key assignments here?
end

The most common triples are:

  • x86_64-pc-windows-msvc - Windows
  • x86_64-apple-darwin - macOS (Intel)
  • aarch64-apple-darwin - macOS (Apple Silicon)
  • x86_64-unknown-linux-gnu - Linux

title: wezterm.to_string tags:

  • utility

wezterm.to_string(arg)

{{since('20240127-113634-bbcac864')}}

This function returns a string representation of any Lua value. In particular this can be used to get a string representation of a table or userdata.

The intended purpose is as a human readable way to inspect lua values. It is not machine readable; do not attempt to use it as a serialization format as the format is not guaranteed to remain the same across different versions of wezterm.

This same representation is used in the [debug overlay](../keyassignment/ShowDebugOverlay.md when printing the result of an expression from the Lua REPL and for the implicit string conversions of the parameters passed to wezterm.log_info.

local wezterm = require 'wezterm'
assert(wezterm.to_string { 1, 2 } == [=[[
    1,
    2,
]]=])
assert(wezterm.to_string { a = 1, b = 2 } == [[{
    "a": 1,
    "b": 2,
}]])

title: wezterm.truncate_left tags:

  • utility
  • string

wezterm.truncate_left(string, max_width)

{{since('20210502-130208-bff6815d')}}

Returns a copy of string that is no longer than max_width columns (as measured by wezterm.column_width).

Truncation occurs by removing excess characters from the left end of the string.

For example, wezterm.truncate_left("hello", 3) returns "llo".

See also: wezterm.truncate_right, wezterm.pad_right.


title: wezterm.truncate_right tags:

  • utility
  • string

wezterm.truncate_right(string, max_width)

{{since('20210502-130208-bff6815d')}}

Returns a copy of string that is no longer than max_width columns (as measured by wezterm.column_width).

Truncation occurs by reemoving excess characters from the right end of the string.

For example, wezterm.truncate_right("hello", 3) returns "hel",

See also: wezterm.truncate_left, wezterm.pad_left.


title: wezterm.utf16_to_utf8 tags:

  • utility
  • string

wezterm.utf16_to_utf8(str)

{{since('20200503-171512-b13ef15f')}}

This function is overly specific and exists primarily to workaround this wsl.exe issue.

It takes as input a string and attempts to convert it from utf16 to utf8.

local wezterm = require 'wezterm'

local success, wsl_list, wsl_err =
  wezterm.run_child_process { 'wsl.exe', '-l' }
wsl_list = wezterm.utf16_to_utf8(wsl_list)

title: wezterm.version tags:

  • utility
  • version

wezterm.version

This constant is set to the wezterm version string that is also reported by running wezterm -V. This can potentially be used to adjust configuration according to the installed version.

The version string looks like 20200406-151651-5b700e4. You can compare the strings lexicographically if you wish to test whether a given version is newer than another; the first component is the date on which the release was made, the second component is the time and the final component is a git hash.

local wezterm = require 'wezterm'
wezterm.log_error('Version ' .. wezterm.version)

wezterm.color module

{{since('20220807-113146-c2fee766')}}

The wezterm.color module exposes functions that work with colors.

Available functions, constants

wezterm.color.extract_colors_from_image(filename [,params])

{{since('20220807-113146-c2fee766')}}

This function loads an image from the specified filename and analyzes it to determine a set of distinct colors present in the image, ordered by how often a given color is found in the image, descending. So if an image is predominantly black with a bit of white, then black will be listed first in the returned array.

This is potentially useful if you wish to generate a color scheme to match an image, for example.

The default is to extract 16 colors from an image:

> wezterm.color.extract_colors_from_image("/wallpapers/neon-nights.jpeg")
[
    "#060a14",
    "#7393d4",
    "#9f475a",
    "#305e73",
    "#4f4660",
    "#958193",
    "#c76199",
    "#689ba6",
    "#1a344e",
    "#4c2633",
    "#b17c75",
    "#854a7a",
    "#3876aa",
    "#d75f75",
    "#231725",
    "#79606f",
]

The analysis is relatively expensive and can take several seconds if used on a full 4K image file. To reduce the runtime, wezterm will by default scale down the image and skip over nearby pixels. The results of the analysis will be cached to avoid repeating the same work each time the configuration is re-evaluated.

You can specify optional parameters in a parameter table:

> wezterm.color.extract_colors_from_image("/wallpaper/neon-nights.jpeg", {
  num_colors=16,
  threshold=75
})
[
    "#060a14",
    "#48afb7",
    "#d75f74",
    "#5c6795",
    "#a88e67",
    "#64313f",
    "#639cdf",
    "#356e76",
    "#c467c5",
    "#8e8490",
    "#2b3f54",
    "#90537e",
    "#2f233c",
    "#b08279",
    "#97a16b",
    "#8f84be",
]

The following fields are allowed in the parameter table:

  • fuzziness - skip this many pixels when sampling colors, to avoid adding candidate colors that are likely similar to each other. Default is 5.
  • num_colors - how many colors should be extracted. Default is 16. Set to 0 to find all distinct colors.
  • max_width, max_height - the image will be resized (respecting its aspect ratio) to fit within these dimensions to reduce the number of pixels that need to be analyzed. Default is 640 by 480.
  • min_brightness - the minimum allowed brightness level you'd like to accept. Brightness has the range 0 through 100 with 100 being brightest. Useful to exclude very dark colors from the returned palette. Default is 0.
  • max_brightness - the maximum allowed brightness level you'd like to accept. Useful to exclude very bright colors from the returned palette. Default is 90.
  • threshold - colors are compared using CIEDE2000 DeltaE which produces values in the range 0 through 100. Smaller values are more similar, larger values are more different. If the computed DeltaE is smaller than your threshold parameter then the color candidate will be added to the returned set of colors.
  • min_contrast - if set non-zero, in addition to the DeltaE constraint, colors must have a contrast ratio of at least min_contrast. The default is 0.

If fewer than the requested num_colors were found, the threshold will be repeatedly reduced to increase the set of candidate colors until the threshold falls below the human perceptible range. If after that fewer than the requested num_colors were found, an error is raised.

When min_contrast is in use and fewer than num_colors matching colors are found, min_contrast is not automatically relaxed when retrying with a lower threshold.

This example computes a color palette for the terminal based on some other image file:

local wezterm = require 'wezterm'

local colors = wezterm.color.extract_colors_from_image '/path/to/image/jpeg'
local ansi = {}
local brights = {}

for idx, color in ipairs(colors) do
  if idx <= 8 then
    ansi[idx] = color
  else
    brights[idx - 8] = color
  end
end

return {
  colors = {
    ansi = ansi,
    brights = brights,
  },
}

wezterm.color.from_hsla(h, s, l, a)

{{since('20220807-113146-c2fee766')}}

Constructs a new color object from values in the HSL colorspace, plus alpha.

See also wezterm.color.parse()

wezterm.color.get_builtin_schemes()

{{since('20220807-113146-c2fee766')}}

(In earlier releases, you can use wezterm.get_builtin_color_schemes())

Returns a lua table keyed by color scheme name and whose values are the color scheme definition of the builtin color schemes.

This is useful for programmatically deciding things about the scheme to use based on its color, or for taking a scheme and overriding a couple of entries just from your wezterm.lua configuration file.

This example shows how to make wezterm pick a random color scheme for each newly created window:

local wezterm = require 'wezterm'

-- The set of schemes that we like and want to put in our rotation
local schemes = {}
for name, scheme in pairs(wezterm.color.get_builtin_schemes()) do
  table.insert(schemes, name)
end

wezterm.on('window-config-reloaded', function(window, pane)
  -- If there are no overrides, this is our first time seeing
  -- this window, so we can pick a random scheme.
  if not window:get_config_overrides() then
    -- Pick a random scheme name
    local scheme = schemes[math.random(#schemes)]
    window:set_config_overrides {
      color_scheme = scheme,
    }
  end
end)

return {}

This example shows how to take an existing scheme, modify a color, and then use that new scheme to override the default:

local wezterm = require 'wezterm'

local scheme = wezterm.color.get_builtin_schemes()['Gruvbox Light']
scheme.background = 'red'

return {
  color_schemes = {
    -- Override the builtin Gruvbox Light scheme with our modification.
    ['Gruvbox Light'] = scheme,

    -- We can also give it a different name if we don't want to override
    -- the default
    ['Gruvbox Red'] = scheme,
  },
  color_scheme = 'Gruvbox Light',
}

This example shows how to analyze the colors in the builtin schemes and use that to select just the dark schemes and then randomly pick one of those for each new window:

local wezterm = require 'wezterm'

local function dark_schemes()
  local schemes = wezterm.color.get_builtin_schemes()
  local dark = {}
  for name, scheme in pairs(schemes) do
    -- parse into a color object
    local bg = wezterm.color.parse(scheme.background)
    -- and extract HSLA information
    local h, s, l, a = bg:hsla()

    -- `l` is the "lightness" of the color where 0 is darkest
    -- and 1 is lightest.
    if l < 0.4 then
      table.insert(dark, name)
    end
  end

  table.sort(dark)
  return dark
end

local dark = dark_schemes()

wezterm.on('window-config-reloaded', function(window, pane)
  -- If there are no overrides, this is our first time seeing
  -- this window, so we can pick a random scheme.
  if not window:get_config_overrides() then
    -- Pick a random scheme name

    local scheme = dark[math.random(#dark)]
    window:set_config_overrides {
      color_scheme = scheme,
    }
  end
end)

return {}

wezterm.color.get_default_colors()

{{since('20220807-113146-c2fee766')}}

Returns the set of colors that would be used by default.

This is useful if you want to reference those colors in a color scheme definition.

This contrived example sets up two color schemes and overrides their background colors to red. One of the schemes is the default set of colors, while the other is one of the many built-in schemes:

local wezterm = require 'wezterm'

local my_gruvbox = wezterm.color.get_builtin_schemes()['Gruvbox Light']
my_gruvbox.background = 'red'

local my_default = wezterm.color.get_default_colors()
my_default.background = 'red'

return {
  color_schemes = {
    ['My Gruvbox'] = my_gruvbox,
    ['My Default'] = my_default,
  },
  color_scheme = 'My Gruvbox',
}

wezterm.color.gradient(gradient, num_colors)

{{since('20220807-113146-c2fee766')}}

Given a gradient spec and a number of colors, returns a table holding that many colors spaced evenly across the range of the gradient.

Each element in the returned array is a Color object.

This is useful for example to generate colors for tabs, or to do something fancy like interpolate colors across a gradient based on the time of the day.

gradient is any gradient allowed by the window_background_gradient option.

This example is what you'd see if you opened up the debug overlay to try this out in the repl:

> wezterm.color.gradient({preset="Rainbow"}, 4)
["#6e40aa", "#ff8c38", "#5dea8d", "#6e40aa"]

wezterm.color.load_base16_scheme(file_name)

{{since('20220807-113146-c2fee766')}}

Loads a yaml file in base16 format and returns it as a wezterm color scheme.

Note that wezterm ships with the base16 color schemes that were referenced via base16-schemes-source when the release was prepared so this function is primarily useful if you want to import a base16 color scheme that either isn't listed from the main list, or that was created after your version of wezterm was built.

This function returns a tuple of the the color definitions and the metadata.

For example, given a yaml file with these contents:

scheme: "Cupcake"
author: "Chris Kempson (http://chriskempson.com)"
base00: "fbf1f2"
base01: "f2f1f4"
base02: "d8d5dd"
base03: "bfb9c6"
base04: "a59daf"
base05: "8b8198"
base06: "72677E"
base07: "585062"
base08: "D57E85"
base09: "EBB790"
base0A: "DCB16C"
base0B: "A3B367"
base0C: "69A9A7"
base0D: "7297B9"
base0E: "BB99B4"
base0F: "BAA58C"

Then:

> colors, metadata = wezterm.color.load_base16_scheme("/tmp/cupcake.yaml")
> print(colors)
22:59:26.998 INFO logging > lua: {
    "ansi": [
        "#fbf1f2",
        "#d57e85",
        "#a3b367",
        "#dcb16c",
        "#7297b9",
        "#bb99b4",
        "#69a9a7",
        "#8b8198",
    ],
    "background": "#fbf1f2",
    "brights": [
        "#bfb9c6",
        "#d57e85",
        "#a3b367",
        "#dcb16c",
        "#7297b9",
        "#bb99b4",
        "#69a9a7",
        "#585062",
    ],
    "cursor_bg": "#8b8198",
    "cursor_border": "#8b8198",
    "cursor_fg": "#8b8198",
    "foreground": "#8b8198",
    "indexed": {},
    "selection_bg": "#8b8198",
    "selection_fg": "#fbf1f2",
}
> print(metadata)
22:59:29.671 INFO logging > lua: {
    "author": "Chris Kempson (http://chriskempson.com)",
    "name": "Cupcake",
}

wezterm.color.load_scheme(file_name)

{{since('20220807-113146-c2fee766')}}

Loads a wezterm color scheme from a TOML file. This function returns a tuple of the the color definitions and the metadata:

> colors, metadata = wezterm.color.load_scheme("wezterm/assets/colors/Abernathy.toml")
> print(metadata)
22:37:06.041 INFO logging > lua: {
    "name": "Abernathy",
    "origin_url": "https://github.com/mbadolato/iTerm2-Color-Schemes",
}
> print(colors)
22:37:10.416 INFO logging > lua: {
    "ansi": [
        "#000000",
        "#cd0000",
        "#00cd00",
        "#cdcd00",
        "#1093f5",
        "#cd00cd",
        "#00cdcd",
        "#faebd7",
    ],
    "background": "#111416",
    "brights": [
        "#404040",
        "#ff0000",
        "#00ff00",
        "#ffff00",
        "#11b5f6",
        "#ff00ff",
        "#00ffff",
        "#ffffff",
    ],
    "cursor_bg": "#bbbbbb",
    "cursor_border": "#bbbbbb",
    "cursor_fg": "#ffffff",
    "foreground": "#eeeeec",
    "indexed": {},
    "selection_bg": "#eeeeec",
    "selection_fg": "#333333",
}

wezterm.color.load_terminal_sexy_scheme(file_name)

{{since('20220807-113146-c2fee766')}}

Loads a json file exported from terminal.sexy and returns it as a wezterm color scheme.

Note that wezterm ships with all of the pre-defined terminal.sexy color schemes, so this function is primarily useful if you want to design a color scheme using terminal.sexy and then import it to wezterm.

This function returns a tuple of the the color definitions and the metadata.

For example, given a json file with these contents:

{
  "name": "",
  "author": "",
  "color": [
    "#282a2e",
    "#a54242",
    "#8c9440",
    "#de935f",
    "#5f819d",
    "#85678f",
    "#5e8d87",
    "#707880",
    "#373b41",
    "#cc6666",
    "#b5bd68",
    "#f0c674",
    "#81a2be",
    "#b294bb",
    "#8abeb7",
    "#c5c8c6"
  ],
  "foreground": "#c5c8c6",
  "background": "#1d1f21"
}

Then:

> colors, metadata = wezterm.color.load_terminal_sexy_scheme("/path/to/file.json")
> print(colors)
22:37:10.416 INFO logging > lua: {
    "ansi": [
      "#282a2e",
      "#a54242",
      "#8c9440",
      "#de935f",
      "#5f819d",
      "#85678f",
      "#5e8d87",
      "#707880",
    ],
    "background": "#1d1f21",
    "brights": [
      "#373b41",
      "#cc6666",
      "#b5bd68",
      "#f0c674",
      "#81a2be",
      "#b294bb",
      "#8abeb7",
      "#c5c8c6"
    ],
    "foreground": "#c5c8c6",
}
> print(metadata)
22:37:06.041 INFO logging > lua: {
    "name": "",
    "author": ""
}

wezterm.color.parse(string)

{{since('20220807-113146-c2fee766')}}

Parses the passed color and returns a Color object. Color objects evaluate as strings but have a number of methods that allow transforming and comparing colors.

> wezterm.color.parse("black")
#000000

This example picks a foreground color, computes its complement in the "artist's color wheel" to produce a purple color and then darkens it to use it as a background color:

local wezterm = require 'wezterm'

local fg = wezterm.color.parse 'yellow'
local bg = fg:complement_ryb():darken(0.2)

return {
  colors = {
    foreground = fg,
    background = bg,
  },
}

wezterm.color.save_scheme(colors, metadata, file_name)

{{since('20220807-113146-c2fee766')}}

Saves a color scheme as a wezterm TOML file. This is useful when sharing your custom color scheme with others. While you could share the lua representation of the scheme, the TOML file is recommended for sharing as it is purely declarative: no executable logic is present in the TOML color scheme which makes it safe to consume "random" schemes from the internet.

This example demonstrates importing a base16 scheme and exporting it as a wezterm scheme.

Given a yaml file with these contents:

scheme: "Cupcake"
author: "Chris Kempson (http://chriskempson.com)"
base00: "fbf1f2"
base01: "f2f1f4"
base02: "d8d5dd"
base03: "bfb9c6"
base04: "a59daf"
base05: "8b8198"
base06: "72677E"
base07: "585062"
base08: "D57E85"
base09: "EBB790"
base0A: "DCB16C"
base0B: "A3B367"
base0C: "69A9A7"
base0D: "7297B9"
base0E: "BB99B4"
base0F: "BAA58C"

Then:

> colors, metadata = wezterm.color.load_base16_scheme("/tmp/cupcake.yaml")
> wezterm.color.save_scheme(colors, metadata, "/tmp/cupcacke.toml")

produces a toml file with these contents:

[colors]
ansi = [
    '#fbf1f2',
    '#d57e85',
    '#a3b367',
    '#dcb16c',
    '#7297b9',
    '#bb99b4',
    '#69a9a7',
    '#8b8198',
]
background = '#fbf1f2'
brights = [
    '#bfb9c6',
    '#d57e85',
    '#a3b367',
    '#dcb16c',
    '#7297b9',
    '#bb99b4',
    '#69a9a7',
    '#585062',
]
cursor_bg = '#8b8198'
cursor_border = '#8b8198'
cursor_fg = '#8b8198'
foreground = '#8b8198'
selection_bg = '#8b8198'
selection_fg = '#fbf1f2'

[colors.indexed]

[metadata]
author = 'Chris Kempson (http://chriskempson.com)'
name = 'Cupcake'

wezterm.gui module

{{since('20220807-113146-c2fee766')}}

The wezterm.gui module exposes functions that operate on the gui layer.

The multiplexer may not be connected to a GUI, so attempting to resolve this module from the mux server will return nil.

You will typically use something like:

local wezterm = require 'wezterm'
local gui = wezterm.gui
if gui then
  -- do something that depends on the gui layer
end

Available functions, constants

wezterm.gui.default_key_tables()

{{since('20221119-145034-49b9839f')}}

Returns a table holding the effective default set of key_tables. That is the set of keys that is used as a base if there was no configuration file.

This is useful in cases where you want to override a key table assignment without replacing the entire set of key tables.

This example shows how to add a key assignment for Backspace to copy_mode, without having to manually specify the entire key table:

local wezterm = require 'wezterm'
local act = wezterm.action

local copy_mode = nil
if wezterm.gui then
  copy_mode = wezterm.gui.default_key_tables().copy_mode
  table.insert(
    copy_mode,
    { key = 'Backspace', mods = 'NONE', action = act.CopyMode 'MoveLeft' }
  )
end

return {
  key_tables = {
    copy_mode = copy_mode,
  },
}

wezterm.gui.default_keys()

{{since('20221119-145034-49b9839f')}}

Returns a table holding the effective default values for key assignments. That is the set of keys that is used as a base if there was no configuration file.

wezterm.gui.enumerate_gpus()

{{since('20221119-145034-49b9839f')}}

Returns the list of available Gpus supported by WebGpu.

This is useful in conjunction with webgpu_preferred_adapter

> wezterm.gui.enumerate_gpus()
[
    {
        "backend": "Vulkan",
        "device": 29730,
        "device_type": "DiscreteGpu",
        "driver": "radv",
        "driver_info": "Mesa 22.3.4",
        "name": "AMD Radeon Pro W6400 (RADV NAVI24)",
        "vendor": 4098,
    },
    {
        "backend": "Vulkan",
        "device": 0,
        "device_type": "Cpu",
        "driver": "llvmpipe",
        "driver_info": "Mesa 22.3.4 (LLVM 15.0.7)",
        "name": "llvmpipe (LLVM 15.0.7, 256 bits)",
        "vendor": 65541,
    },
    {
        "backend": "Gl",
        "device": 0,
        "device_type": "Other",
        "name": "AMD Radeon Pro W6400 (navi24, LLVM 15.0.7, DRM 3.49, 6.1.9-200.fc37.x86_64)",
        "vendor": 4098,
    },
]

wezterm.gui.get_appearance()

{{since('20220807-113146-c2fee766')}}

This function returns the appearance of the window environment. The appearance can be one of the following 4 values:

  • "Light" - the normal appearance, with dark text on a light background
  • "Dark" - "dark mode", with predominantly dark colors and probably a lighter, lower contrasting, text color on a dark background
  • "LightHighContrast" - light mode but with high contrast colors (not reported on all systems)
  • "DarkHighContrast" - dark mode but with high contrast colors (not reported on all systems)

wezterm is able to detect when the appearance has changed and will reload the configuration when that happens.

This example configuration shows how you can have your color scheme automatically adjust to the current appearance:

local wezterm = require 'wezterm'

-- wezterm.gui is not available to the mux server, so take care to
-- do something reasonable when this config is evaluated by the mux
function get_appearance()
  if wezterm.gui then
    return wezterm.gui.get_appearance()
  end
  return 'Dark'
end

function scheme_for_appearance(appearance)
  if appearance:find 'Dark' then
    return 'Builtin Solarized Dark'
  else
    return 'Builtin Solarized Light'
  end
end

return {
  color_scheme = scheme_for_appearance(get_appearance()),
}

Wayland GNOME Appearance

wezterm uses XDG Desktop Portal to determine the appearance in a desktop-environment independent way.

wezterm.gui.gui_window_for_mux_window(window_id)

{{since('20220807-113146-c2fee766')}}

Attempts to resolve a mux window to its corresponding Gui Window.

This may not succeed for a couple of reasons:

  • If called by the multiplexer daemon, there is no gui, so this will never succeed
  • If the mux window is part of a workspace that is not the active workspace

wezterm.gui.gui_windows()

{{since('20230320-124340-559cb7b0')}}

Returns an array table listing all GUI Window objects in a stable/consistent order.

wezterm.gui.screens()

{{since('20220807-113146-c2fee766')}}

Returns information about the screens connected to the system.

The follow example was typed into the Debug Overlay (by default: press CTRL-SHIFT-L) on a macbook:

> wezterm.gui.screens()
{
    "active": {
        "height": 1800,
        "name": "Built-in Retina Display",
        "width": 2880,
        "x": 0,
        "y": 0,
    },
    "by_name": {
        "Built-in Retina Display": {
            "height": 1800,
            "name": "Built-in Retina Display",
            "width": 2880,
            "x": 0,
            "y": 0,
        },
    },
    "main": {
        "height": 1800,
        "name": "Built-in Retina Display",
        "width": 2880,
        "x": 0,
        "y": 0,
    },
    "origin_x": 0,
    "origin_y": 0,
    "virtual_height": 1800,
    "virtual_width": 2880,
}

The return value is a table with the following keys:

  • active - contains information about the active screen. The active screen is the one which has input focus. On some systems, wezterm will return the same information as the main screen screen.
  • main - contains information about the main screen. The main screen is the primary screen: the one that has the menu bar or task bar.
  • by_name - a table containing information about each screen, indexed by their name
  • origin_x, origin_y, virtual_height, virtual_width - the bounds of the combined desktop geometry spanning all connected screens

The screen information is a table with the following keys:

  • name - the name of the screen.
  • x, y, width, height - the bounds of this screen
  • max_fps - the maximum refresh rate supported by the screen, if known, or nil otherwise. {{since('20220903-194523-3bb1ed61', inline=True)}}

wezterm.mux module

{{since('20220624-141144-bd1b7c5d')}}

The wezterm.mux module exposes functions that operate on the multiplexer layer.

The multiplexer manages the set of running programs into panes, tabs, windows and workspaces.

The multiplexer may not be connected to a GUI so certain operations that require a running Window management system are not present in the interface exposed by this module.

You will typically use something like:

local wezterm = require 'wezterm'
local mux = wezterm.mux

at the top of your configuration file to access it.

Important Note!

You should avoid using, at the file scope in your config, mux functions that cause new splits, tabs or windows to be created. The configuration file can be evaluated multiple times in various contexts. If you want to spawn new programs when wezterm starts up, look at the gui-startup and mux-startup events.

Available functions, constants

wezterm.mux.all_domains()

{{since('20230320-124340-559cb7b0')}}

Returns an array table holding all of the known MuxDomain objects.

wezterm.mux.all_windows()

{{since('20220807-113146-c2fee766')}}

Returns an array table holding all of the known MuxWindow objects.

wezterm.mux.get_active_workspace()

{{since('20220624-141144-bd1b7c5d')}}

Returns the name of the active workspace.

wezterm.mux.get_domain(name_or_id)

{{since('20230320-124340-559cb7b0')}}

Resolves name_or_id to a domain and returns a MuxDomain object representation of it.

name_or_id can be:

  • A domain name string to resolve the domain by name
  • A domain id to resolve the domain by id
  • nil or omitted to return the current default domain
  • other lua types will generate a lua error

If the name or id don't map to a valid domain, this function will return nil.

wezterm.mux.get_pane(PANE_ID)

{{since('20220624-141144-bd1b7c5d')}}

Given a pane ID, verifies that the ID is a valid pane known to the mux and returns a Pane object that can be used to operate on the pane.

This is useful for situations where you have obtained a pane id from some other source and want to use the various Pane methods with it.

wezterm.mux.get_tab(TAB_ID)

{{since('20220624-141144-bd1b7c5d')}}

Given a tab ID, verifies that the ID is a valid tab known to the mux and returns a MuxTab object that can be used to operate on the tab.

This is useful for situations where you have obtained a tab id from some other source and want to use the various MuxTab methods with it.

wezterm.mux.get_window(WINDOW_ID)

{{since('20220624-141144-bd1b7c5d')}}

Given a window ID, verifies that the ID is a valid window known to the mux and returns a MuxWindow object that can be used to operate on the window.

This is useful for situations where you have obtained a window id from some other source and want to use the various MuxWindow methods with it.

wezterm.mux.get_workspace_names()

{{since('20220624-141144-bd1b7c5d')}}

Returns a table containing the names of the workspaces known to the mux.

wezterm.mux.rename_workspace(old, new)

{{since('20230408-112425-69ae8472')}}

Renames the workspace old to new.

wezterm.mux.rename_workspace(
  wezterm.mux.get_active_workspace(),
  'something different'
)

wezterm.mux.set_active_workspace(WORKSPACE)

{{since('20220624-141144-bd1b7c5d')}}

Sets the active workspace name.

If the requested name doesn't correspond to an existing workspace, then an error is raised.

wezterm.mux.set_default_domain(MuxDomain)

{{since('20230320-124340-559cb7b0')}}

Assign a new default domain in the mux.

The domain that you assign here will override any configured default_domain or the implicit assignment of the default domain that may have happened as a result of starting wezterm via wezterm connect or wezterm serial.

wezterm.mux.spawn_window{}

{{since('20220624-141144-bd1b7c5d')}}

Spawns a program into a new window, returning the MuxTab, Pane and MuxWindow objects associated with it:

local tab, pane, window = wezterm.mux.spawn_window {}

When no arguments are passed, the default program is spawned.

The following parameters are supported:

args

Specifies the argument array for the command that should be spawned. If omitted the default program for the domain will be spawned.

wezterm.mux.spawn_window { args = { 'top' } }

cwd

Specify the current working directory that should be used for the program.

If unspecified, follows the rules from default_cwd

wezterm.mux.spawn_window { cwd = '/tmp' }

set_environment_variables

Sets additional environment variables in the environment for this command invocation.

wezterm.mux.spawn_window { set_environment_variables = { FOO = 'BAR' } }

domain

Specifies the multiplexer domain into which the program should be spawned. The default value is assumed to be "DefaultDomain", which causes the default domain to be used.

You may specify the name of one of the multiplexer domains defined in your configuration using the following:

wezterm.mux.spawn_window { domain = { DomainName = 'my.name' } }

width and height

Only valid when width and height are used together, allows specifying the number of column and row cells that the window should have.

wezterm.mux.spawn_window { width = 60, height = 30 }

workspace

Specifies the name of the workspace that the newly created window will be associated with. If omitted, the currently active workspace name will be used.

wezterm.mux.spawn_window { workspace = { 'coding' } }

position

{{since('20230320-124340-559cb7b0')}}

Specify the initial position for the GUI window that will be created to display this mux window.

The value is a lua table:

wezterm.mux.spawn_window {
  position = {
    x = 10,
    y = 300,
    -- Optional origin to use for x and y.
    -- Possible values:
    -- * "ScreenCoordinateSystem" (this is the default)
    -- * "MainScreen" (the primary or main screen)
    -- * "ActiveScreen" (whichever screen hosts the active/focused window)
    -- * {Named="HDMI-1"} - uses a screen by name. See wezterm.gui.screens()
    -- origin = "ScreenCoordinateSystem"
  },
}

See also wezterm.gui.screens()

wezterm.plugin module

{{since('20230320-124340-559cb7b0')}}

The wezterm.plugin module provides functions to manage Wezterm plugins.

Available functions

list function

{{since('20230320-124340-559cb7b0')}}

Will return a table array listing all the plugin repos in the plugin directory

Each entry has three fields:

  • url: The URL of the plugin repo, as provided to the wezterm.plugin.require function
  • component: The encoded name of the plugin, derived from the repo URL
  • plugin_dir: The absolute location of the plugin checkout in the Wezterm runtime directory. Use this to set the plugin path if needed

Function require

{{since('20230320-124340-559cb7b0')}}

Will clone the plugin repo if it doesn't already exist and store it in the runtime dir under plugins/NAME where NAME is derived from the repo URL. Once cloned, the repo is NOT automatically updated when require is called again.

The function takes a single string parameter, the Git repo URL

Only HTTP(S) or local filesystem repos are allowed for the git URL.

local remote_plugin = wezterm.plugin.require 'https://github.com/owner/repo'
local local_plugin =
  wezterm.plugin.require 'file:///Users/developer/projects/my.Plugin'

update_all function

{{since('20230320-124340-559cb7b0')}}

Attempt to fast-forward or pull --rebase each of the repos in the plugin directory.

!!! Note

The configuration is **not** reloaded afterwards; the user will need to do that themselves.

!!! Tip

Run the [`wezterm.reload_configuration()`](../wezterm/reload_configuration.md) function to reload the configuration.

wezterm.procinfo module

{{since('20220807-113146-c2fee766')}}

The wezterm.procinfo module exposes functions that allow querying information about processes that are running on the local system.

Available functions

wezterm.procinfo.current_working_dir_for_pid(pid)

{{since('20220807-113146-c2fee766')}}

Returns the current working directory for the specified process id.

This function may return nil if it was unable to return the info.

> wezterm.procinfo.current_working_dir_for_pid(wezterm.procinfo.pid())
"/home/wez/wez-personal/wezterm"

wezterm.procinfo.executable_path_for_pid(pid)

{{since('20220807-113146-c2fee766')}}

Returns the path to the executable image for the specified process id.

This function may return nil if it was unable to return the info.

> wezterm.procinfo.executable_path_for_pid(wezterm.procinfo.pid())
"/home/wez/wez-personal/wezterm/target/debug/wezterm-gui"

wezterm.procinfo.get_info_for_pid(pid)

{{since('20220807-113146-c2fee766')}}

Returns a LocalProcessInfo object for the specified process id.

This function may return nil if it was unable to return the info.

> wezterm.procinfo.get_info_for_pid(wezterm.procinfo.pid())
{
    "argv": [
        "/home/wez/wez-personal/wezterm/target/debug/wezterm-gui",
    ],
    "children": {
        540513: {
            "argv": [
                "-zsh",
            ],
            "children": {},
            "cwd": "/home/wez",
            "executable": "/usr/bin/zsh",
            "name": "zsh",
            "pid": 540513,
            "ppid": 540450,
            "start_time": 232656896,
            "status": "Sleep",
        },
    },
    "cwd": "/home/wez/wez-personal/wezterm",
    "executable": "/home/wez/wez-personal/wezterm/target/debug/wezterm-gui",
    "name": "wezterm-gui",
    "pid": 540450,
    "ppid": 425276,
    "start_time": 8671498240,
    "status": "Run",
}

wezterm.procinfo.pid()

{{since('20220807-113146-c2fee766')}}

Returns the process id for the current process.

wezterm.serde module

{{since('nightly')}}

The wezterm.serde module provides functions for parsing the given string as json, yaml, or toml, returning the corresponding Lua values, and vice versa.

Available functions

wezterm.serde.json_decode(string)

{{since('nightly')}}

Parses the supplied string as json and returns the equivalent lua values:

> wezterm.serde.json_decode('{"foo":"bar"}')
{
    "foo": "bar",
}

wezterm.serde.json_encode(value)

{{since('nightly')}}

Encodes the supplied lua value as json:

> wezterm.serde.json_encode({foo = "bar"})
"{\"foo\":\"bar\"}"

wezterm.serde.json_encode_pretty(value)

{{since('nightly')}}

Encodes the supplied lua value as a pretty-printed string of json:

> wezterm.serde.json_encode_pretty({foo = "bar"})
"{\n  \"foo\": \"bar\"\n}"

wezterm.serde.toml_decode(string)

{{since('nightly')}}

Parses the supplied string as toml and returns the equivalent lua values:

> wezterm.serde.toml_decode('foo = "bar"')
{
    "foo": "bar",
}

wezterm.serde.toml_encode(value)

{{since('nightly')}}

Encodes the supplied lua value as toml:

> wezterm.serde.toml_encode({foo = { "bar", "baz", "qux" } })
"foo = [\"bar\", \"baz\", \"qux\"]\n"

wezterm.serde.toml_encode_pretty(value)

{{since('nightly')}}

Encodes the supplied lua value as a pretty-printed string of toml:

> wezterm.serde.toml_encode_pretty({foo = { "bar", "baz", "qux" } })
"foo = [\n    \"bar\",\n    \"baz\",\n    \"qux\",\n]\n"

wezterm.serde.yaml_decode(string)

{{since('nightly')}}

Parses the supplied string as yaml and returns the equivalent lua values:

> wezterm.serde.yaml_decode('---\n# comment\nfoo: "bar"')
{
    "foo": "bar",
}

wezterm.serde.yaml_encode(value)

{{since('nightly')}}

Encodes the supplied lua value as yaml:

> wezterm.serde.yaml_encode({foo = "bar"})
"foo: bar\n"

wezterm.time module

{{since('20220807-113146-c2fee766')}}

The wezterm.time module exposes functions that allow working with time.

Available functions

wezterm.time.call_after(interval_seconds, function)

{{since('20220807-113146-c2fee766')}}

Arranges to call your callback function after the specified number of seconds have elapsed.

Here's a contrived example that demonstrates a configuration that varies based on the time. In this case, the idea is that the background color is derived from the current number of minutes past the hour.

In order for the value to be picked up for the next minute, call_after is used to schedule a callback 60 seconds later and it then generates a background color by extracting the current minute value and scaing it to the range 0-255 and using that to assign a background color:

local wezterm = require 'wezterm'

-- Reload the configuration every minute
wezterm.time.call_after(60, function()
  wezterm.reload_configuration()
end)

local amount =
  math.ceil((tonumber(wezterm.time.now():format '%M') / 60) * 255)

return {
  colors = {
    background = 'rgb(' .. amount .. ',' .. amount .. ',' .. amount .. ')',
  },
}

With great power comes great responsibility: if you schedule a lot of frequent callbacks, or frequently reload your configuration in this way, you may increase the CPU load on your system because you are asking it to work harder.

{{since('20230320-124340-559cb7b0')}}

You can use fractional seconds to delay by more precise intervals.

wezterm.time.now()

{{since('20220807-113146-c2fee766')}}

Returns a Time object representing the time at which wezterm.time.now() was called.

wezterm.time.parse(str, format)

{{since('20220807-113146-c2fee766')}}

Parses a string that is formatted according to the supplied format string:

> wezterm.time.parse("1983 Apr 13 12:09:14.274 +0000", "%Y %b %d %H:%M:%S%.3f %z")
"Time(utc: 1983-04-13T12:09:14.274+00:00)"

The format string supports the set of formatting placeholders described here.

wezterm.time.parse_rfc3339(str)

{{since('20220807-113146-c2fee766')}}

Parses a string that is formatted according to RFC 3339 and returns a Time object representing that time.

Will raise an error if the input string cannot be parsed according to RFC 3339.

wezterm.url module

{{since('20240127-113634-bbcac864')}}

The wezterm.url module exposes functions that allow working with URLs.

Available functions and objects

Url object

{{since('20240127-113634-bbcac864')}}

The Url object represents a parsed Url. It has the following fields:

  • scheme - the URL scheme such as "file", or "https"
  • file_path - decodes the path field and interprets it as a file path
  • username - the username portion of the URL, or an empty string if none is specified
  • password - the password portion of the URL, or nil if none is specified
  • host - the hostname portion of the URL, with IDNA decoded to UTF-8
  • path - the path portion of the URL, complete with percent encoding
  • fragment - the fragment portion of the URL
  • query - the query portion of the URL
local wezterm = require 'wezterm'

local url = wezterm.url.parse 'file://myhost/some/path%20with%20spaces'
assert(url.scheme == 'file')
assert(url.file_path == '/some/path with spaces')

local url =
  wezterm.url.parse 'https://github.com/rust-lang/rust/issues?labels=E-easy&state=open'
assert(url.scheme == 'https')
assert(url.username == '')
assert(url.password == nil)
assert(url.host == 'github.com')
assert(url.path == '/rust-lang/rust/issues')
assert(url.query == 'labels=E-easy&state=open')

wezterm.url.parse(URL_STRING)

{{since('20240127-113634-bbcac864')}}

Attempts to parse the provided URL_STRING as a URL. If success, returns a Url object representing that URL.

KeyAssignment enumeration

A KeyAssignment represents a pre-defined function that can be applied to control the Window, Tab, Pane state typically when a key or mouse event is triggered.

Internally, in the underlying Rust code, KeyAssignment is an enum type with a variant for each possible action known to wezterm. In Lua, enums get represented as a table with a single key corresponding to the variant name.

In most cases the wezterm.action function is used to create an instance of KeyAssignment and make it a bit more clear and convenient.

Available Key Assignments

ActivateCommandPalette

{{since('20230320-124340-559cb7b0')}}

Activates the Command Palette, a modal overlay that enables discovery and activation of various commands.

config.keys = {
  {
    key = 'P',
    mods = 'CTRL',
    action = wezterm.action.ActivateCommandPalette,
  },
}

CTRL + SHIFT + P is the default key assignment for ActivateCommandPalette.

The command palette shows a list of possible actions ranked by frecency of use from the command palette.

Command Palette

Key Assignments

ActionKey Assignment
Exit command paletteEsc
Highlight previous itemUpArrow
Highlight next itemDownArrow
Clear the selectionCTRL + u
Activate the selectionEnter

Typing text (and using Backspace) allows you to fuzzy match possible actions. Each keystroke will reduce the list of candidate actions to those that fuzzy match, ranked in decreasing order of the match score.

Activating the selected item will close the command palette and then invoke the action.

See also:

ActivateCopyMode

{{since('20200607-144723-74889cd4')}}

Activates copy mode!

config.keys = {
  { key = 'X', mods = 'CTRL', action = wezterm.action.ActivateCopyMode },
}

Learn more about copy mode

ActivateKeyTable

{{since('20220408-101518-b908e2dd')}}

Activates a named key table.

See Key Tables for a detailed example.

The following parameters are possible:

  • name - the name of the table to activate. The name must match up to an entry in the key_tables configuration.

  • timeout_milliseconds - an optional duration expressed in milliseconds. If specified, then the activation will automatically expire and pop itself from the key table stack once that duration elapses. If omitted, this activation will not expire due to time.

    • {{since('20220807-113146-c2fee766', inline=True)}}: the timer is reset each time you press a key that matches this key table activation, allowing for repeated key presses
  • one_shot - an optional boolean that controls whether the activation will pop itself after a single additional key press. The default if left unspecified is one_shot=true. When set to false, pressing a key will not automatically pop the activation and you will need to use either a timeout or an explicit key assignment that triggers PopKeyTable to cancel the activation.

  • replace_current - an optional boolean. Defaults to false if unspecified. If set to true then behave as though PopKeyTable was triggered before pushing this new activation on the stack. This is most useful for key assignments in a table that was activated using one_shot=false.

  • until_unknown - an optional boolean. Defaults to false if unspecified. If set to true then a key press that doesn't match any entries in the named key table will implicitly pop this entry from the stack. This can be used together with timeout_milliseconds. {{since('20220807-113146-c2fee766', inline=True)}}

  • prevent_fallback - an optional boolean. Defaults to false if unspecified. If set to true then a key press that doesn't match any entries in the named key table will halt any further key table stack matching, allowing only key assignments that are defined in the current key table activation to match. Use with care: if you haven't defined an explicit PopKeyTable assignment in the key table, you can lock yourself out of the keyboard and will need to reload the configuration file (eg: by re-saving it) to get back in. {{since('20221119-145034-49b9839f', inline=True)}}

ActivateLastTab

{{since('20210404-112810-b63a949d')}}

Activate the previously active tab. If there is none, it will do nothing.

config.leader = { key = 'a', mods = 'CTRL' }
config.keys = {
  -- CTRL-a, followed by CTRL-o will switch back to the last active tab
  {
    key = 'o',
    mods = 'LEADER|CTRL',
    action = wezterm.action.ActivateLastTab,
  },
}

See ActivateTab for a way to activate a tab based on its position/index.

ActivatePaneByIndex

{{since('20220319-142410-0fcdea07')}}

ActivatePaneByIndex activates the pane with the specified index within the current tab. Invalid indices are ignored.

This example causes ALT-a, ALT-b, ALT-c to switch to the 0th, 1st and 2nd panes, respectively:

local wezterm = require 'wezterm'
local act = wezterm.action
local config = {}

config.keys = {
  { key = 'a', mods = 'ALT', action = act.ActivatePaneByIndex(0) },
  { key = 'b', mods = 'ALT', action = act.ActivatePaneByIndex(1) },
  { key = 'c', mods = 'ALT', action = act.ActivatePaneByIndex(2) },
}

return config

ActivatePaneDirection

{{since('20201031-154415-9614e117')}}

ActivatePaneDirection activate an adjacent pane in the specified direction. In cases where there are multiple adjacent panes in the intended direction, wezterm will choose the pane that has the largest edge intersection.

If the active pane is zoomed, behavior is determined by the unzoom_on_switch_pane flag.

local wezterm = require 'wezterm'
local act = wezterm.action
local config = {}

config.keys = {
  {
    key = 'LeftArrow',
    mods = 'CTRL|SHIFT',
    action = act.ActivatePaneDirection 'Left',
  },
  {
    key = 'RightArrow',
    mods = 'CTRL|SHIFT',
    action = act.ActivatePaneDirection 'Right',
  },
  {
    key = 'UpArrow',
    mods = 'CTRL|SHIFT',
    action = act.ActivatePaneDirection 'Up',
  },
  {
    key = 'DownArrow',
    mods = 'CTRL|SHIFT',
    action = act.ActivatePaneDirection 'Down',
  },
}
return config

{{since('20220101-133340-7edc5b5a')}}

You may now use "Next" and "Prev" as directions. These cycle through the panes according to their position in the pane tree.

"Next" moves to the next highest pane index, wrapping around to 0 if the active pane is already the highest pane index.

"Prev" moves to the next lowest pane index, wrapping around to the highest of the active pane is already the lowest pane index.

{{since('20220903-194523-3bb1ed61')}}

Ambiguous moves are now resolved by selecting the most recently activated pane in a given direction, instead of based on the edge intersection.

ActivateTab

Activate the tab specified by the argument value. eg: 0 activates the leftmost tab, while 1 activates the second tab from the left, and so on.

{{since('20200620-160318-e00b076c')}}

ActivateTab now accepts negative numbers; these wrap around from the start of the tabs to the end, so -1 references the right-most tab, -2 the tab to its left and so on.

local wezterm = require 'wezterm'
local act = wezterm.action
local config = {}

config.keys = {}
for i = 1, 8 do
  -- CTRL+ALT + number to activate that tab
  table.insert(config.keys, {
    key = tostring(i),
    mods = 'CTRL|ALT',
    action = act.ActivateTab(i - 1),
  })
  -- F1 through F8 to activate that tab
  table.insert(config.keys, {
    key = 'F' .. tostring(i),
    action = act.ActivateTab(i - 1),
  })
end

return config

ActivateTabRelative

Activate a tab relative to the current tab. The argument value specifies an offset. eg: -1 activates the tab to the left of the current tab, while 1 activates the tab to the right.

local wezterm = require 'wezterm'
local act = wezterm.action
local config = {}

config.keys = {
  { key = '{', mods = 'ALT', action = act.ActivateTabRelative(-1) },
  { key = '}', mods = 'ALT', action = act.ActivateTabRelative(1) },
}

return config

See also ActivateTabRelativeNoWrap

ActivateTabRelativeNoWrap

{{since('20220101-133340-7edc5b5a')}}

Activate a tab relative to the current tab. The argument value specifies an offset. eg: -1 activates the tab to the left of the current tab, while 1 activates the tab to the right.

This is almost identical to ActivateTabRelative but this one will not wrap around; for example, if the first tab is active ActivateTabRelativeNoWrap=-1 will not move to the last tab and vice versa.

local wezterm = require 'wezterm'
local act = wezterm.action
local config = {}

config.keys = {
  { key = '{', mods = 'ALT', action = act.ActivateTabRelativeNoWrap(-1) },
  { key = '}', mods = 'ALT', action = act.ActivateTabRelativeNoWrap(1) },
}
return config

ActivateWindow(n)

{{since('20230320-124340-559cb7b0')}}

Activates the nth GUI window, zero-based.

Performing this action is equivalent to executing this lua code fragment:

wezterm.gui.gui_windows()[n + 1]:focus()

Here's an example of setting up hotkeys to activate specific windows:

local wezterm = require 'wezterm'
local act = wezterm.action
local config = {}

config.keys = {}
for i = 1, 8 do
  -- CMD+ALT + number to activate that window
  table.insert(config.keys, {
    key = tostring(i),
    mods = 'CMD|ALT',
    action = act.ActivateWindow(i - 1),
  })
end

return config

See also ActivateWindowRelative, ActivateWindowRelativeNoWrap.

ActivateWindowRelative(delta)

{{since('20230320-124340-559cb7b0')}}

Activates a GUI window relative to the current window.

ActivateWindowRelative(1) activates the next window, while ActivateWindowRelative(-1) activates the previous window.

This action will wrap around and activate the appropriate window at the start/end.

Here's an example of setting up (not very useful) hotkeys to cycle between windows:

local wezterm = require 'wezterm'
local act = wezterm.action
local config = {}

config.keys = {
  { key = 'r', mods = 'ALT', action = act.ActivateWindowRelative(1) },
  { key = 'e', mods = 'ALT', action = act.ActivateWindowRelative(-1) },
}
return config

See also ActivateWindowRelativeNoWrap, ActivateWindow.

ActivateWindowRelative(delta)

{{since('20230320-124340-559cb7b0')}}

Activates a GUI window relative to the current window.

ActivateWindowRelativeNoWrap(1) activates the next window, while ActivateWindowRelativeNoWrap(-1) activates the previous window.

This action will NOT wrap around; if the current window is the first/last, then this action will not change the current window.

Here's an example of setting up (not very useful) hotkeys to cycle between windows:

local wezterm = require 'wezterm'
local act = wezterm.action
local config = {}

config.keys = {
  {
    key = 'r',
    mods = 'ALT',
    action = act.ActivateWindowRelativeNoWrap(1),
  },
  {
    key = 'e',
    mods = 'ALT',
    action = act.ActivateWindowRelativeNoWrap(-1),
  },
}
return config

See also ActivateWindowRelative, ActivateWindow.

AdjustPaneSize

{{since('20201031-154415-9614e117')}}

AdjustPaneSize manipulates the size of the active pane, allowing the size to be adjusted by an integer amount in a specific direction.

If the pane is on the right hand side of a split and you adjust the size left by 1 then the split grows larger by 1 cell by expanding its size to the left. The pane to its left is reduced in size by 1 cell to accommodate the growth. If you were to adjust this same right hand side right by 1 cell, then the pane will shrink by 1 cell and move the split 1 cell to the right.

Here's a sample configuration that uses CTRL-A H to increase the size of the active pane by 5 cells in the left direction. The other vi style motion keys are used to adjust the size in their conventional directions, respectively.

local wezterm = require 'wezterm'
local act = wezterm.action
local config = {}

config.leader = { key = 'a', mods = 'CTRL' }
config.keys = {
  {
    key = 'H',
    mods = 'LEADER',
    action = act.AdjustPaneSize { 'Left', 5 },
  },
  {
    key = 'J',
    mods = 'LEADER',
    action = act.AdjustPaneSize { 'Down', 5 },
  },
  { key = 'K', mods = 'LEADER', action = act.AdjustPaneSize { 'Up', 5 } },
  {
    key = 'L',
    mods = 'LEADER',
    action = act.AdjustPaneSize { 'Right', 5 },
  },
}
return config

AttachDomain(domain_name)

{{since('20220624-141144-bd1b7c5d')}}

Attempts to attach the named multiplexing domain. The name can be any of the names used in your ssh_domains, unix_domains or tls_clients configurations.

Attaching a domain will attempt to import the windows, tabs and panes from the remote system into those of the local GUI.

If there are no remote panes in that domain, wezterm will spawn a default program into it.

This action is not bound to any keys by default. The Launcher Menu (default: right click on the new tab + button in the tab bar) will synthesize entries with this action.

The example below shows how to bind a key to trigger attaching to an ssh domain:

config.ssh_domains = {
  {
    name = 'devhost',
    remote_address = 'devhost.example.com',
  },
}
config.keys = {
  {
    key = 'U',
    mods = 'CTRL|SHIFT',
    action = wezterm.action.AttachDomain 'devhost',
  },
}

See also: DetachDomain

CharSelect

{{since('20220903-194523-3bb1ed61')}}

Activates Character Selection Mode, which is a pop-over modal that allows you to browse characters by category as well as fuzzy search by name or hex unicode codepoint value.

Characters are categorized into the following groups:

  • "RecentlyUsed" - recently selected characters, ordered by frecency
  • "SmileysAndEmotion"
  • "PeopleAndBody"
  • "AnimalsAndNature"
  • "FoodAndDrink"
  • "TravelAndPlaces"
  • "Activities"
  • "Objects"
  • "Symbols"
  • "Flags"
  • "NerdFonts" - glyphs that are present in Nerd Fonts
  • "UnicodeNames" - all codepoints defined in unicode

The following key assignments are available (they are not currently configurable):

KeyAction
UpArrowMove Up
DownArrowMove Down
EnterAccept the current item, copy it to the clipboard, insert it into the active pane, and cancel the modal
EscCancel the modal
CTRL-gCancel the modal
CTRL-rCycle to the next group of characters
CTRL-SHIFT-rCycle to the previous group of characters
CTRL-uClear text input

Typing a name or a hex unicode codepoint value will fuzzy search across all possible groups (not just the current group) and filter the results.

This action is by default assigned to CTRL-SHIFT-U (U for Unicode).

The default assignment is equivalent to this config:

-- Control the size of the font.
-- Uses the same font as window_frame.font
-- char_select_font_size = 18.0,

config.keys = {
  {
    key = 'u',
    mods = 'SHIFT|CTRL',
    action = wezterm.action.CharSelect {
      copy_on_select = true,
      copy_to = 'ClipboardAndPrimarySelection',
    },
  },
}

The CharSelect action accepts a lua table with the following fields:

  • copy_on_select - a boolean that controls whether hitting Enter to select an item will copy to the clipboard, in addition to sending the item to the active pane. The default is true, but you can set it to false if you prefer.
  • copy_to - allows you to control where the item will be copied to. Accepts the same values as CopyTo. The default is 'ClipboardAndPrimarySelection'.
  • group - an optional group to pre-select. You may use any of the groups listed above (eg: "SmileysAndEmotion"). If omitted, wezterm will default to "RecentlyUsed" if you have previously selected an item, or "SmileysAndEmotion" otherwise.

See also:

ClearKeyTableStack

{{since('20220408-101518-b908e2dd')}}

Clears the entire key table stack.

Note that this is triggered implicitly when the configuration is reloaded.

ClearScrollback

Clears the lines that have scrolled off the top of the viewport, resetting the scrollbar thumb to the full height of the window.

{{since('20210203-095643-70a364eb')}}

Added a parameter that allows additionally clear the viewport:

local wezterm = require 'wezterm'
local act = wezterm.action

config.keys = {
  -- Clears only the scrollback and leaves the viewport intact.
  -- You won't see a difference in what is on screen, you just won't
  -- be able to scroll back until you've output more stuff on screen.
  -- This is the default behavior.
  {
    key = 'K',
    mods = 'CTRL|SHIFT',
    action = act.ClearScrollback 'ScrollbackOnly',
  },
  -- Clears the scrollback and viewport leaving the prompt line the new first line.
  {
    key = 'K',
    mods = 'CTRL|SHIFT',
    action = act.ClearScrollback 'ScrollbackAndViewport',
  },
  -- Clears the scrollback and viewport, and then sends CTRL-L to ask the
  -- shell to redraw its prompt
  {
    key = 'K',
    mods = 'CTRL|SHIFT',
    action = act.Multiple {
      act.ClearScrollback 'ScrollbackAndViewport',
      act.SendKey { key = 'L', mods = 'CTRL' },
    },
  },
}

ClearSelection

{{since('20220624-141144-bd1b7c5d')}}

Clears the selection in the current pane.

This example shows how to rebind CTRL-C to copy to the clipboard when there is a selection present (clearing it afterwards) or sending CTRL-C to the terminal when there is no selection:

local wezterm = require 'wezterm'
local act = wezterm.action

config.keys = {
  {
    key = 'c',
    mods = 'CTRL',
    action = wezterm.action_callback(function(window, pane)
      local has_selection = window:get_selection_text_for_pane(pane) ~= ''
      if has_selection then
        window:perform_action(act.CopyTo 'ClipboardAndPrimarySelection', pane)

        window:perform_action(act.ClearSelection, pane)
      else
        window:perform_action(act.SendKey { key = 'c', mods = 'CTRL' }, pane)
      end
    end),
  },
}

CloseCurrentPane

Closes the current pane. If that was the last pane in the tab, closes the tab. If that was the last tab, closes that window. If that was the last window, wezterm terminates.

The act of closing a pane shuts down the PTY associated with the pane and then kills the process associated with that pane.

config.keys = {
  {
    key = 'w',
    mods = 'CMD',
    action = wezterm.action.CloseCurrentPane { confirm = true },
  },
}

When confirm is true, an overlay will render over the pane to ask you to confirm whether you want to close it. See also skip_close_confirmation_for_processes_named.

If confirm is false then this action will immediately close the pane without prompting.

CloseCurrentTab

Closes the current tab, terminating all contained panes. If that was the last tab, closes that window. If that was the last window, wezterm terminates.

config.keys = {
  {
    key = 'w',
    mods = 'CMD',
    action = wezterm.action.CloseCurrentTab { confirm = true },
  },
}

When confirm is true, an overlay will render over the tab to ask you to confirm whether you want to close it. See also skip_close_confirmation_for_processes_named.

If confirm is false then this action will immediately close the tab and terminates its panes without prompting.

CompleteSelection

Completes an active text selection process; the selection range is marked closed and then the selected text is copied as though the Copy action was executed.

{{since('20210203-095643-70a364eb')}}

CompleteSelection now requires a destination parameter to specify which clipboard buffer the selection will populate; the copy action is now equivalent to CopyTo.

config.mouse_bindings = {
  -- Change the default click behavior so that it only selects
  -- text and doesn't open hyperlinks, and that it populates
  -- the Clipboard rather the PrimarySelection which is part
  -- of the default assignment for a left mouse click.
  {
    event = { Up = { streak = 1, button = 'Left' } },
    mods = 'NONE',
    action = wezterm.action.CompleteSelection 'Clipboard',
  },
}

CompleteSelectionOrOpenLinkAtMouseCursor

If a selection is in progress, acts as though CompleteSelection was triggered. Otherwise acts as though OpenLinkAtMouseCursor was triggered.

{{since('20210203-095643-70a364eb')}}

CompleteSelectionOrOpenLinkAtMouseCursor now requires a destination parameter to specify which clipboard buffer the selection will populate. The copy action is now equivalent to CopyTo.

config.mouse_bindings = {
  -- Change the default click behavior so that it populates
  -- the Clipboard rather the PrimarySelection.
  {
    event = { Up = { streak = 1, button = 'Left' } },
    mods = 'NONE',
    action = wezterm.action.CompleteSelectionOrOpenLinkAtMouseCursor 'Clipboard',
  },
}

Copy

Copy the selection to the clipboard.

{{since('20210203-095643-70a364eb')}}

This action is considered to be deprecated and will be removed in a future release; please use CopyTo instead.

{{since('20230320-124340-559cb7b0')}}

!!! warning This action has been removed. Please use CopyTo instead.

CopyTo(destination)

Copy the selection to the specified clipboard buffer.

Possible values for destination are:

  • Clipboard - copy the text to the system clipboard.
  • PrimarySelection - Copy the text to the primary selection buffer (applicable to X11 and some Wayland systems only)
  • ClipboardAndPrimarySelection - Copy to both the clipboard and the primary selection.
config.keys = {
  {
    key = 'C',
    mods = 'CTRL',
    action = wezterm.action.CopyTo 'ClipboardAndPrimarySelection',
  },
}

{{since('20220319-142410-0fcdea07')}}

PrimarySelection is now also supported on Wayland systems that support primary-selection-unstable-v1 or the older Gtk primary selection protocol.

DecreaseFontSize

Decreases the font size of the current window by 10%

config.keys = {
  { key = '-', mods = 'CTRL', action = wezterm.action.DecreaseFontSize },
}

See also adjust_window_size_when_changing_font_size

DetachDomain(domain)

{{since('20220624-141144-bd1b7c5d')}}

Attempts to detach the specified domain. Detaching a domain causes it to disconnect and remove its set of windows, tabs and panes from the local GUI. Detaching does not cause those panes to close; if or when you later attach to the domain, they'll still be there.

Not every domain supports detaching, and will log an error to the error log/debug overlay.

local wezterm = require 'wezterm'
local act = wezterm.action

config.ssh_domains = {
  {
    name = 'devhost',
    remote_address = 'devhost.example.com',
  },
}
config.keys = {
  { key = 'U', mods = 'CTRL|SHIFT', action = act.AttachDomain 'devhost' },
  -- Detaches the domain associated with the current pane
  {
    key = 'D',
    mods = 'CTRL|SHIFT',
    action = act.DetachDomain 'CurrentPaneDomain',
  },
  -- Detaches the "devhost" domain
  {
    key = 'E',
    mods = 'CTRL|SHIFT',
    action = act.DetachDomain { DomainName = 'devhost' },
  },
}

See also: AttachDomain

DisableDefaultAssignment

Has no special meaning of its own; this action will undo the registration of a default assignment if that key/mouse/modifier combination is one of the default assignments and cause the key press to be propagated through to the tab for processing.

config.keys = {
  -- Turn off the default CMD-m Hide action, allowing CMD-m to
  -- be potentially recognized and handled by the tab
  {
    key = 'm',
    mods = 'CMD',
    action = wezterm.action.DisableDefaultAssignment,
  },
}

EmitEvent

{{since('20201031-154415-9614e117')}}

This action causes the equivalent of wezterm.emit(name, window, pane) to be called in the context of the current pane.

See the Custom Events example for a detailed example of using this action.

ExtendSelectionToMouseCursor

Extends the current text selection to the current mouse cursor position. The mode argument can be one of Cell, Word or Line to control the scope of the selection.

{{since('20220624-141144-bd1b7c5d')}}

The mode argument can also be "Block" to enable a rectangular block selection.

config.mouse_bindings = {
  {
    event = { Up = { streak = 1, button = 'Left' } },
    mods = 'SHIFT',
    action = wezterm.action.ExtendSelectionToMouseCursor 'Word',
  },
}

Hide

Hides (or minimizes, depending on the platform) the current window.

config.keys = {
  { key = 'h', mods = 'CMD', action = wezterm.action.Hide },
}

HideApplication

On macOS, hide the WezTerm application.

config.keys = {
  { key = 'h', mods = 'CMD', action = wezterm.action.HideApplication },
}

IncreaseFontSize

Increases the font size of the current window by 10%

config.keys = {
  { key = '=', mods = 'CTRL', action = wezterm.action.IncreaseFontSize },
}

See also adjust_window_size_when_changing_font_size

InputSelector

{{since('20230408-112425-69ae8472')}}

Activates an overlay to display a list of choices for the user to select from.

When the user accepts a line, emits an event that allows you to act upon the input.

InputSelector accepts the following fields:

  • title - the title that will be set for the overlay pane
  • choices - a lua table consisting of the potential choices. Each entry is itself a table with a label field and an optional id field. The label will be shown in the list, while the id can be a different string that is meaningful to your action. The label can be used together with wezterm.format to produce styled text.
  • action - and event callback registered via wezterm.action_callback. The callback's function signature is (window, pane, id, label) where window and pane are the Window and Pane objects from the current pane and window, and id and label hold the corresponding fields from the selected choice. Both will be nil if the overlay is cancelled without selecting anything.
  • fuzzy - a boolean that defaults to false. If true, InputSelector will start in its fuzzy finding mode (this is equivalent to starting the InputSelector and pressing / in the default mode).

{{since('20240127-113634-bbcac864')}}

These additional fields are also available:

  • alphabet - a string of unique characters. The characters in the string are used to calculate one or two click shortcuts that can be used to quickly choose from the InputSelector when in the default mode. Defaults to: "1234567890abcdefghilmnopqrstuvwxyz". (Without j/k so they can be used for movement up and down.)
  • description - a string to display when in the default mode. Defaults to: "Select an item and press Enter = accept, Esc = cancel, / = filter".
  • fuzzy_description - a string to display when in fuzzy finding mode. Defaults to: "Fuzzy matching: ".

Key Assignments

The default key assignments in the InputSelector are as follows:

ActionKey Assignment
Add to selection string until a match is found (if in the default mode)Any key in alphabet {{since('20240127-113634-bbcac864', inline=True)}}
Select matching number (if in the default mode)1 to 9 {{since('20230408-112425-69ae8472', inline=True)}}
Start fuzzy search (if in the default mode)/
Add to filtering string (if in fuzzy finding mode)Any key not listed below
Remove from selection or filtering stringBackspace
Pick currently highlighted lineEnter
LeftClick (with mouse)
Move DownDownArrow
Ctrl + N
Ctrl + J {{since('20240127-113634-bbcac864', inline=True)}}
j (if not in alphabet)
Move UpUpArrow
Ctrl + P
Ctrl + K {{since('20240127-113634-bbcac864', inline=True)}}
k (if not in alphabet)
QuitCtrl + G
Ctrl + C {{since('20240127-113634-bbcac864', inline=True)}}
Escape

Note: If the InputSelector is started with fuzzy set to false, then Backspace can go from fuzzy finding mode back to the default mode when pressed while the filtering string is empty.

Example of choosing some canned text to enter into the terminal

local wezterm = require 'wezterm'
local act = wezterm.action
local config = wezterm.config_builder()

config.keys = {
  {
    key = 'E',
    mods = 'CTRL|SHIFT',
    action = act.InputSelector {
      action = wezterm.action_callback(function(window, pane, id, label)
        if not id and not label then
          wezterm.log_info 'cancelled'
        else
          wezterm.log_info('you selected ', id, label)
          pane:send_text(id)
        end
      end),
      title = 'I am title',
      choices = {
        -- This is the first entry
        {
          -- Here we're using wezterm.format to color the text.
          -- You can just use a string directly if you don't want
          -- to control the colors
          label = wezterm.format {
            { Foreground = { AnsiColor = 'Red' } },
            { Text = 'No' },
            { Foreground = { AnsiColor = 'Green' } },
            { Text = ' thanks' },
          },
          -- This is the text that we'll send to the terminal when
          -- this entry is selected
          id = 'Regretfully, I decline this offer.',
        },
        -- This is the second entry
        {
          label = 'WTF?',
          id = 'An interesting idea, but I have some questions about it.',
        },
        -- This is the third entry
        {
          label = 'LGTM',
          id = 'This sounds like the right choice',
        },
      },
    },
  },
}

return config

Example of dynamically constructing a list

local wezterm = require 'wezterm'
local act = wezterm.action
local config = wezterm.config_builder()

config.keys = {
  {
    key = 'R',
    mods = 'CTRL|SHIFT',
    action = wezterm.action_callback(function(window, pane)
      -- We're going to dynamically construct the list and then
      -- show it.  Here we're just showing some numbers but you
      -- could read or compute data from other sources

      local choices = {}
      for n = 1, 20 do
        table.insert(choices, { label = tostring(n) })
      end

      window:perform_action(
        act.InputSelector {
          action = wezterm.action_callback(function(window, pane, id, label)
            if not id and not label then
              wezterm.log_info 'cancelled'
            else
              wezterm.log_info('you selected ', id, label)
              -- Since we didn't set an id in this example, we're
              -- sending the label
              pane:send_text(label)
            end
          end),
          title = 'I am title',
          choices = choices,
          alphabet = '123456789',
          description = 'Write the number you want to choose or press / to search.',
        },
        pane
      )
    end),
  },
}

return config

Example of switching between a list of workspaces with the InputSelector

local wezterm = require 'wezterm'
local act = wezterm.action
local config = wezterm.config_builder()

config.keys = {
  {
    key = 'S',
    mods = 'CTRL|SHIFT',
    action = wezterm.action_callback(function(window, pane)
      -- Here you can dynamically construct a longer list if needed

      local home = wezterm.home_dir
      local workspaces = {
        { id = home, label = 'Home' },
        { id = home .. '/work', label = 'Work' },
        { id = home .. '/personal', label = 'Personal' },
        { id = home .. '/.config', label = 'Config' },
      }

      window:perform_action(
        act.InputSelector {
          action = wezterm.action_callback(
            function(inner_window, inner_pane, id, label)
              if not id and not label then
                wezterm.log_info 'cancelled'
              else
                wezterm.log_info('id = ' .. id)
                wezterm.log_info('label = ' .. label)
                inner_window:perform_action(
                  act.SwitchToWorkspace {
                    name = label,
                    spawn = {
                      label = 'Workspace: ' .. label,
                      cwd = id,
                    },
                  },
                  inner_pane
                )
              end
            end
          ),
          title = 'Choose Workspace',
          choices = workspaces,
          fuzzy = true,
          fuzzy_description = 'Fuzzy find and/or make a workspace',
        },
        pane
      )
    end),
  },
}

return config

See also PromptInputLine.

MoveTab

Move the tab so that it has the index specified by the argument. eg: 0 moves the tab to be leftmost, while 1 moves the tab so that it is second tab from the left, and so on.

local wezterm = require 'wezterm'
local config = {}

config.keys = {}

for i = 1, 8 do
  -- CTRL+ALT + number to move to that position
  table.insert(config.keys, {
    key = tostring(i),
    mods = 'CTRL|ALT',
    action = wezterm.action.MoveTab(i - 1),
  })
end

return config

MoveTabRelative

Move the current tab relative to its peers. The argument specifies an offset. eg: -1 moves the tab to the left of the current tab, while 1 moves the tab to the right.

local act = wezterm.action

config.keys = {
  { key = '{', mods = 'SHIFT|ALT', action = act.MoveTabRelative(-1) },
  { key = '}', mods = 'SHIFT|ALT', action = act.MoveTabRelative(1) },
}

Multiple

{{since('20211204-082213-a66c61ee9')}}

Performs a sequence of multiple assignments. This is useful when you want a single key press to trigger multiple actions.

The example below causes LeftArrow to effectively type left:

local act = wezterm.action

config.keys = {
  {
    key = 'LeftArrow',
    action = act.Multiple {
      act.SendKey { key = 'l' },
      act.SendKey { key = 'e' },
      act.SendKey { key = 'f' },
      act.SendKey { key = 't' },
    },
  },
}

Nop

Causes the key press to have no effect; it behaves as though those keys were not pressed.

If instead of this you want the key presses to pass through to the terminal, look at DisableDefaultAssignment.

config.keys = {
  -- Turn off any side effects from pressing CMD-m
  { key = 'm', mods = 'CMD', action = wezterm.action.Nop },
}

OpenLinkAtMouseCursor

If the current mouse cursor position is over a cell that contains a hyperlink, this action causes that link to be opened.

config.mouse_bindings = {
  -- Ctrl-click will open the link under the mouse cursor
  {
    event = { Up = { streak = 1, button = 'Left' } },
    mods = 'CTRL',
    action = wezterm.action.OpenLinkAtMouseCursor,
  },
}

PaneSelect

{{since('20220624-141144-bd1b7c5d')}}

This action activates the pane selection modal display. In this mode, each pane will be overlayed with a one- or two-character label taken from the selection alphabet.

Pane Select

Typing the label will select the pane, take an action and exit selection mode. Pressing Escape or CTRL-g will exit pane selection mode without taking any action.

The available actions are:

  • mode="Activate" - activate the selected pane. This is the default mode.
  • mode="SwapWithActive" - swap the position of the active pane with the selected pane, switching focus to the selected pane

The selection alphabet defaults to the same value as quick_select_alphabet, but can be explicitly via the alphabet field:

{{since('20240127-113634-bbcac864')}}

Additional modes are now supported:

  • mode="MoveToNewTab" - moves the selected pane into a new tab in the same window, and activates it
  • mode="MoveToNewWindow" - moves the selected pane into a new window, and activates it
  • mode="SwapWithActiveKeepFocus" - swap the position of the active pane with the selected pane, retaining focus on the currently active pane but in its new position

You may now also set show_pane_ids=true to show the pane id alongside the label.

local wezterm = require 'wezterm'
local act = wezterm.action

-- 36 is the default, but you can choose a different size.
-- Uses the same font as window_frame.font
-- config.pane_select_font_size=36,

config.keys = {
  -- activate pane selection mode with the default alphabet (labels are "a", "s", "d", "f" and so on)
  { key = '8', mods = 'CTRL', action = act.PaneSelect },
  -- activate pane selection mode with numeric labels
  {
    key = '9',
    mods = 'CTRL',
    action = act.PaneSelect {
      alphabet = '1234567890',
    },
  },
  -- show the pane selection mode, but have it swap the active and selected panes
  {
    key = '0',
    mods = 'CTRL',
    action = act.PaneSelect {
      mode = 'SwapWithActive',
    },
  },
}

See also RotatePanes.

Paste

Paste the clipboard to the current pane.

{{since('20210203-095643-70a364eb')}}

This action is considered to be deprecated and will be removed in a future release; please use PasteFrom instead.

{{since('20230320-124340-559cb7b0')}}

!!! warning This action has been removed. Please use PasteFrom instead.

PasteFrom(source)

Paste the specified clipboard to the current pane.

This is only really meaningful on X11 and some Wayland systems that have multiple clipboards.

Possible values for source are:

  • Clipboard - paste from the system clipboard
  • PrimarySelection - paste from the primary selection buffer
local wezterm = require 'wezterm'
local act = wezterm.action

config.keys = {
  -- paste from the clipboard
  { key = 'V', mods = 'CTRL', action = act.PasteFrom 'Clipboard' },

  -- paste from the primary selection
  { key = 'V', mods = 'CTRL', action = act.PasteFrom 'PrimarySelection' },
}

{{since('20220319-142410-0fcdea07')}}

PrimarySelection is now also supported on Wayland systems that support primary-selection-unstable-v1 or the older Gtk primary selection protocol.

PastePrimarySelection

X11: Paste the Primary Selection to the current tab. On other systems, this behaves identically to Paste.

{{since('20210203-095643-70a364eb')}}

This action is considered to be deprecated and will be removed in a future release; please use PasteFrom instead.

{{since('20230320-124340-559cb7b0')}}

This action has been removed. Please use PasteFrom instead.

Example

local wezterm = require 'wezterm'
local act = wezterm.action

config.keys = {
  { key = 'v', mods = 'SHIFT|CTRL', action = act.PastePrimarySelection },
}

-- Middle mouse button pastes the primary selection.
config.mouse_bindings = {
  {
    event = { Up = { streak = 1, button = 'Middle' } },
    mods = 'NONE',
    action = act.PastePrimarySelection,
  },
}

PopKeyTable

{{since('20220408-101518-b908e2dd')}}

Pops the current key table, if any, from the activation stack.

See Key Tables for a detailed example.

PromptInputLine

{{since('20230408-112425-69ae8472')}}

Activates an overlay to display a prompt and request a line of input from the user.

When the user enters the line, emits an event that allows you to act upon the input.

PromptInputLine accepts four fields:

  • description - the text to show at the top of the display area. You may embed escape sequences and/or use wezterm.format.
  • action - and event callback registered via wezterm.action_callback. The callback's function signature is (window, pane, line) where window and pane are the Window and Pane objects from the current pane and window, and line is the text that the user entered. line may be nil if they hit Escape without entering anything, or CTRL-C to cancel the input.
  • prompt - the text to show as the prompt. You may embed escape sequences and/or use wezterm.format. Defaults to: "> ". {{since('nightly', inline=True)}}
  • initial_value - optional. If provided, the initial content of the input field will be set to this value. The user may edit it prior to submitting the input. {{since('nightly', inline=True)}}

Example of interactively renaming the current tab

local wezterm = require 'wezterm'
local act = wezterm.action

local config = wezterm.config_builder()
config.keys = {
  {
    key = 'E',
    mods = 'CTRL|SHIFT',
    action = act.PromptInputLine {
      description = 'Enter new name for tab',
      initial_value = 'My Tab Name',
      action = wezterm.action_callback(function(window, pane, line)
        -- line will be `nil` if they hit escape without entering anything
        -- An empty string if they just hit enter
        -- Or the actual line of text they wrote
        if line then
          window:active_tab():set_title(line)
        end
      end),
    },
  },
}

return config

Example of interactively picking a name and creating a new workspace

Similar to the above, but prompts for a name prior to creating the workspace.

This example also shows the use of wezterm.format to emit colored text.

local wezterm = require 'wezterm'
local act = wezterm.action

local config = wezterm.config_builder()
config.keys = {
  {
    key = 'N',
    mods = 'CTRL|SHIFT',
    action = act.PromptInputLine {
      description = wezterm.format {
        { Attribute = { Intensity = 'Bold' } },
        { Foreground = { AnsiColor = 'Fuchsia' } },
        { Text = 'Enter name for new workspace' },
      },
      action = wezterm.action_callback(function(window, pane, line)
        -- line will be `nil` if they hit escape without entering anything
        -- An empty string if they just hit enter
        -- Or the actual line of text they wrote
        if line then
          window:perform_action(
            act.SwitchToWorkspace {
              name = line,
            },
            pane
          )
        end
      end),
    },
  },
}

return config

See also InputSelector.

QuickSelect

{{since('20210502-130208-bff6815d')}}

Activates Quick Select Mode.

local wezterm = require 'wezterm'

config.keys = {
  { key = ' ', mods = 'SHIFT|CTRL', action = wezterm.action.QuickSelect },
}

See also QuickSelectArgs

QuickSelectArgs

{{since('20220101-133340-7edc5b5a')}}

Activates Quick Select Mode but with the option to override the global configuration.

This example shows how to pop up a quick select that is scoped solely to a very basic http regex; it will only match those regexes regardless of the default or the quick_select_patterns configuration:

local wezterm = require 'wezterm'

config.keys = {
  {
    key = 'P',
    mods = 'CTRL',
    action = wezterm.action.QuickSelectArgs {
      patterns = {
        'https?://\\S+',
      },
    },
  },
}

The QuickSelectArgs struct allows for the following fields:

  • patterns - if present, completely overrides the normal set of patterns and uses only the patterns specified
  • alphabet - if present, this alphabet is used instead of quick_select_alphabet
  • action - if present, this key assignment action is performed as if by window:perform_action when an item is selected. The normal clipboard action is NOT performed in this case.
  • skip_action_on_paste - overrides whether action is performed after an item is selected using a capital value (when paste occurs). {{since('nightly', inline=True)}}
  • label - if present, replaces the string "copy" that is shown at the bottom of the overlay; you can use this to indicate which action will happen if you are using action.
  • scope_lines - Specify the number of lines to search above and below the current viewport. The default is 1000 lines. The scope will be increased to the current viewport height if it is smaller than the viewport. {{since('20220807-113146-c2fee766', inline=True)}}. In earlier releases, the entire scrollback was always searched).

Here's an example that shows how to trigger some lua code to operate on the quick-selected text, instead of copying it to the clipboard. Here, we open the selected URL using the web browser:

local wezterm = require 'wezterm'

config.keys = {
  {
    key = 'P',
    mods = 'CTRL',
    action = wezterm.action.QuickSelectArgs {
      label = 'open url',
      patterns = {
        'https?://\\S+',
      },
      skip_action_on_paste = true,
      action = wezterm.action_callback(function(window, pane)
        local url = window:get_selection_text_for_pane(pane)
        wezterm.log_info('opening: ' .. url)
        wezterm.open_with(url)
      end),
    },
  },
}

See also wezterm.open_with.

QuitApplication

Terminate the WezTerm application, killing all tabs.

local wezterm = require 'wezterm'

config.keys = {
  { key = 'q', mods = 'CMD', action = wezterm.action.QuitApplication },
}

ReloadConfiguration

Explicitly reload the configuration.

config.keys = {
  {
    key = 'r',
    mods = 'CMD|SHIFT',
    action = wezterm.action.ReloadConfiguration,
  },
}

ResetFontAndWindowSize

{{since('20210314-114017-04b7cedd')}}

Reset both the font size and the terminal dimensions for the current window to the values specified by your font, initial_rows, and initial_cols configuration.

config.keys = {
  {
    key = '0',
    mods = 'CTRL',
    action = wezterm.action.ResetFontAndWindowSize,
  },
}

ResetFontSize

Reset the font size for the current window to the value in your configuration

config.keys = {
  { key = '0', mods = 'CTRL', action = wezterm.action.ResetFontSize },
}

ResetTerminal

{{since('20221119-145034-49b9839f')}}

Sends the RIS "Reset to Initial State" escape sequence (ESC-c) to the output side of the current pane, causing the terminal emulator to reset its state.

This will reset tab stops, margins, modes, graphic rendition, palette, activate the primary screen, erase the display and move the cursor to the home position.

RotatePanes

{{since('20220624-141144-bd1b7c5d')}}

Rotates the sequence of panes within the active tab, preserving the sizes based on the tab positions.

Panes within a tab have an ordering that follows the creation order of the splits.

As an example, if you have three panes created in sequence using horizontal splits, their indices from left to right are 0, 1, 2:

|--------|----|----|
|   0    |  1 |  2 |
|--------|----|----|

If you perform a clockwise rotation on that tab, the indices are rearranged so that the panes are now 2, 0, 1.

|--------|----|----|
|   2    |  0 |  1 |
|--------|----|----|

If you instead perform a counter-clockwise rotation then the indices are rearranged so that the panes are now 1, 2, 0

|--------|----|----|
|   1    |  2 |  0 |
|--------|----|----|

The sizes of original positions are preserved; as you can see from the examples above, the left-most pane is still the largest of the panes despite rotating the panes withing those placements.

local act = wezterm.action

config.keys = {
  {
    key = 'b',
    mods = 'CTRL',
    action = act.RotatePanes 'CounterClockwise',
  },
  { key = 'n', mods = 'CTRL', action = act.RotatePanes 'Clockwise' },
}

See also PaneSelect.

ScrollByCurrentEventWheelDelta

{{since('20220807-113146-c2fee766')}}

Adjusts the scroll position by the number of lines in the vertical mouse wheel delta field of the current mouse event, provided that it is a vertical mouse wheel event.

This example demonstrates a mouse assignment that is actually the default, so there's not much point adding this to your config unless you also have set disable_default_mouse_bindings to true.

local act = wezterm.action

config.mouse_bindings = {
  {
    event = { Down = { streak = 1, button = { WheelUp = 1 } } },
    mods = 'NONE',
    action = act.ScrollByCurrentEventWheelDelta,
  },
  {
    event = { Down = { streak = 1, button = { WheelDown = 1 } } },
    mods = 'NONE',
    action = act.ScrollByCurrentEventWheelDelta,
  },
}

ScrollByLine

{{since('20210314-114017-04b7cedd')}}

Adjusts the scroll position by the number of lines specified by the argument. Negative values scroll upwards, while positive values scroll downwards.

local act = wezterm.action

config.keys = {
  { key = 'UpArrow', mods = 'SHIFT', action = act.ScrollByLine(-1) },
  { key = 'DownArrow', mods = 'SHIFT', action = act.ScrollByLine(1) },
}

ScrollByPage

Adjusts the scroll position by the number of pages specified by the argument. Negative values scroll upwards, while positive values scroll downwards.

local act = wezterm.action

config.keys = {
  { key = 'PageUp', mods = 'SHIFT', action = act.ScrollByPage(-1) },
  { key = 'PageDown', mods = 'SHIFT', action = act.ScrollByPage(1) },
}

{{since('20220319-142410-0fcdea07')}}

You may now use floating point values to scroll by partial pages. This example shows how to make the PageUp/PageDown scroll by half a page at a time:

local act = wezterm.action

config.keys = {
  { key = 'PageUp', mods = 'SHIFT', action = act.ScrollByPage(-0.5) },
  { key = 'PageDown', mods = 'SHIFT', action = act.ScrollByPage(0.5) },
}

ScrollToBottom

{{since('20220101-133340-7edc5b5a')}}

This action scrolls the viewport to the bottom of the scrollback.

ScrollToPrompt

{{since('20210203-095643-70a364eb')}}

This action operates on Semantic Zones defined by applications that use OSC 133 Semantic Prompt Escapes and requires configuring your shell to emit those sequences.

OSC 133 escapes allow marking regions of output as Output (from the commands that you run), Input (that you type) and Prompt ("chrome" from your shell).

This action allows scrolling to the start of a Prompt zone; it takes an argument that specifies the number of zones to move and the direction to move in; -1 means to move to the previous zone while 1 means to move to the next zone.

This can make it convenient to skip over large amounts of output.

This action is not bound by default.

For the purposes of scrolling, the "current zone" is considered to be the one closest to the top of the viewport.

local act = wezterm.action

config.keys = {
  { key = 'UpArrow', mods = 'SHIFT', action = act.ScrollToPrompt(-1) },
  { key = 'DownArrow', mods = 'SHIFT', action = act.ScrollToPrompt(1) },
}

ScrollToTop

{{since('20220101-133340-7edc5b5a')}}

This action scrolls the viewport to the top of the scrollback.

Search

{{since('20200607-144723-74889cd4')}}

This action will trigger the search overlay for the current tab. It accepts a typed pattern string as its parameter, allowing for Regex, CaseSensitiveString and CaseInSensitiveString as pattern matching types.

The supported regular expression syntax is described here.

local act = wezterm.action

config.keys = {
  -- search for things that look like git hashes
  {
    key = 'H',
    mods = 'SHIFT|CTRL',
    action = act.Search {
      Regex = '[a-f0-9]{6,}',
    },
  },
  -- search for the lowercase string "hash" matching the case exactly
  {
    key = 'H',
    mods = 'SHIFT|CTRL',
    action = act.Search { CaseSensitiveString = 'hash' },
  },
  -- search for the string "hash" matching regardless of case
  {
    key = 'H',
    mods = 'SHIFT|CTRL',
    action = act.Search { CaseInSensitiveString = 'hash' },
  },
}

Learn more about the search overlay

{{since('20220624-141144-bd1b7c5d')}}

You may now use wezterm.action.Search("CurrentSelectionOrEmptyString") to have the search take the currently selected text as the item to search.

The selection text is adjusted to be a single line.

SelectTextAtMouseCursor

Initiates selection of text at the current mouse cursor position. The mode argument can be one of Cell, Word or Line to control the scope of the selection.

{{since('20210203-095643-70a364eb')}}

The mode argument can be SemanticZone which causes the selection to take the surrounding semantic zone.

In this example, the triple-left-click mouse action is set to automatically select the entire command output when clicking on any character within that region:

config.mouse_bindings = {
  {
    event = { Down = { streak = 3, button = 'Left' } },
    action = wezterm.action.SelectTextAtMouseCursor 'SemanticZone',
    mods = 'NONE',
  },
}

See Shell Integration docs for more details on how to set up your shell to define semantic zones.

{{since('20220624-141144-bd1b7c5d')}}

The mode argument can also be "Block" to enable a rectangular block selection.

SendKey

{{since('20211204-082213-a66c61ee9')}}

Send the specified key press to the current pane. This is useful to rebind the effect of a key combination.

Note that this rebinding effect only applies to the input that is about to be sent to the pane; it doesn't get re-evaluated against the key assignments you've configured in wezterm again.

For example, macOS users often prefer to rebind Option+LeftArrow and Option+RightArrow to match the behavior of Terminal.app, where those key sequences are remapped to ALT-b and ALT-f which generally causes the the cursor to move backwards or forwards by one word in most common unix shells and applications.

The following configuration achieves that same effect:

local act = wezterm.action

config.keys = {
  -- Rebind OPT-Left, OPT-Right as ALT-b, ALT-f respectively to match Terminal.app behavior
  {
    key = 'LeftArrow',
    mods = 'OPT',
    action = act.SendKey {
      key = 'b',
      mods = 'ALT',
    },
  },
  {
    key = 'RightArrow',
    mods = 'OPT',
    action = act.SendKey { key = 'f', mods = 'ALT' },
  },
}

See also Multiple for combining multiple actions in a single press.

SendString

Sends the string specified argument to the terminal in the current tab, as though that text were literally typed into the terminal.

config.keys = {
  { key = 'm', mods = 'CMD', action = wezterm.action.SendString 'Hello' },
}

You can also emit escape sequences using SendString. This example shows how to bind Alt-LeftArrow/RightArrow to the Alt-b/f, an emacs style keybinding for moving backwards/forwards through a word in a line editor.

\x1b is the ESC character:

local act = wezterm.action

config.keys = {
  -- Make Option-Left equivalent to Alt-b which many line editors interpret as backward-word
  { key = 'LeftArrow', mods = 'OPT', action = act.SendString '\x1bb' },
  -- Make Option-Right equivalent to Alt-f; forward-word
  { key = 'RightArrow', mods = 'OPT', action = act.SendString '\x1bf' },
}

See also SendKey which makes the example above much more convenient, and Multiple for combining multiple actions in a single press.

SetPaneZoomState(bool)

{{since('20220807-113146-c2fee766')}}

Sets the zoom state of the current pane. A Zoomed pane takes up all available space in the tab, hiding all other panes while it is zoomed. Switching its zoom state off will restore the prior split arrangement.

Setting the zoom state to true zooms the pane if it wasn't already zoomed. Setting the zoom state to false un-zooms the pane if it was zoomed.

See also: unzoom_on_switch_pane, TogglePaneZoomState, MuxTab:set_zoomed().

SetWindowLevel

{{since('20240127-113634-bbcac864')}}

Set window level specified by the argument value. eg: AlwaysOnTop keeps the current window on top of other windows.

Accepted values:

  • "AlwaysOnBottom"
  • "Normal" (this is the default)
  • "AlwaysOnTop"
config.keys = {
  {
    key = '[',
    mods = 'CMD',
    action = wezterm.action.SetWindowLevel 'AlwaysOnBottom',
  },
  {
    key = '0',
    mods = 'CMD|SHIFT',
    action = wezterm.action.SetWindowLevel 'Normal',
  },
  {
    key = ']',
    mods = 'CMD',
    action = wezterm.action.SetWindowLevel 'AlwaysOnTop',
  },
}

!!! note This functionality is currently only implemented on macOS. The assigned values for window level will have no effect on other operating systems.

Show

Shows the current window.

ShowDebugOverlay

{{since('20210814-124438-54e29167')}}

Overlays the current tab with the debug overlay, which is a combination of a debug log and a lua REPL.

The REPL has the following globals available:

  • wezterm - the wezterm module is pre-imported
  • window - the window object for the current window

The lua context in the REPL is not connected to any global state; you cannot use it to dynamically assign event handlers for example. It is primarily useful for prototyping lua snippets before you integrate them fully into your config.

config.keys = {
  -- CTRL-SHIFT-l activates the debug overlay
  { key = 'L', mods = 'CTRL', action = wezterm.action.ShowDebugOverlay },
}

ShowLauncher

Activate the Launcher Menu in the current tab.

config.keys = {
  { key = 'l', mods = 'ALT', action = wezterm.action.ShowLauncher },
}

ShowLauncherArgs

{{since('20220319-142410-0fcdea07')}}

Activate the Launcher Menu in the current tab, scoping it to a set of items and with an optional title.

The arguments are a lua table with the following keys:

  • flags - required; the set of flags that specifies what to show in the launcher
  • title - optional; the title to show in the tab while the launcher is active
  • help_text - a string to display when in the default mode. Defaults to: "Select an item and press Enter=launch Esc=cancel /=filter" {{since('nightly', inline=True)}}
  • fuzzy_help_text - a string to display when in fuzzy finding mode. Defaults to: "Fuzzy matching: " {{since('nightly', inline=True)}}

The possible flags are listed below. You must explicitly list each item that you want to include in the launcher. If you only specify "FUZZY" then you will see an empty launcher:

  • "FUZZY" - activate in fuzzy-only mode. By default the launcher will allow using the number keys to select from the first few items, as well as vi movement keys to select items. Pressing / will enter fuzzy filtering mode, allowing you to type a search term and reduce the set of matches. When you use the "FUZZY" flag, the launcher activates directly in fuzzy filtering mode.
  • "TABS" - include the list of tabs from the current window
  • "LAUNCH_MENU_ITEMS" - include the launch_menu items
  • "DOMAINS" - include multiplexing domains
  • "KEY_ASSIGNMENTS" - include items taken from your key assignments
  • "WORKSPACES" - include workspaces
  • "COMMANDS" - include a number of default commands {{since('20220408-101518-b908e2dd', inline=True)}}

The flags can be joined together using a | character, so "TABS|DOMAINS" is an example of a set of flags that will include both tabs and domains in the list.

This example shows how to make ALT-9 activate the launcher directly in fuzzy matching mode, and have it show only tabs:

config.keys = {
  {
    key = '9',
    mods = 'ALT',
    action = wezterm.action.ShowLauncherArgs { flags = 'FUZZY|TABS' },
  },
}

ShowTabNavigator

Activate the tab navigator UI in the current tab. The tab navigator displays a list of tabs and allows you to select and activate a tab from that list.

config.keys = {
  { key = 'F9', mods = 'ALT', action = wezterm.action.ShowTabNavigator },
}

{{since('nightly')}}

The choice corresponding to the current tab is initially selected.

SpawnCommandInNewTab

Spawn a new tab into the current window. The argument is a SpawnCommand struct that is discussed in more detail in the SpawnCommand docs.

config.keys = {
  -- CMD-y starts `top` in a new tab
  {
    key = 'y',
    mods = 'CMD',
    action = wezterm.action.SpawnCommandInNewTab {
      args = { 'top' },
    },
  },
}

SpawnCommandInNewWindow

Spawn a new tab into a brand new window. The argument is a SpawnCommand struct that is discussed in more detail in the SpawnCommand docs.

config.keys = {
  -- CMD-y starts `top` in a new window
  {
    key = 'y',
    mods = 'CMD',
    action = wezterm.action.SpawnCommandInNewWindow {
      args = { 'top' },
    },
  },
}

SpawnTab

Create a new tab in the current window. The argument defines to which domain the tab belongs:

local act = wezterm.action

config.keys = {
  -- Create a new tab in the same domain as the current pane.
  -- This is usually what you want.
  {
    key = 't',
    mods = 'SHIFT|ALT',
    action = act.SpawnTab 'CurrentPaneDomain',
  },
  -- Create a new tab in the default domain
  { key = 't', mods = 'SHIFT|ALT', action = act.SpawnTab 'DefaultDomain' },
  -- Create a tab in a named domain
  {
    key = 't',
    mods = 'SHIFT|ALT',
    action = act.SpawnTab {
      DomainName = 'unix',
    },
  },
}

See SpawnCommandInNewTab for a more flexible action that allows more control over the spawned command.

SpawnWindow

Create a new window containing a tab from the default tab domain.

config.keys = {
  { key = 'n', mods = 'SHIFT|CTRL', action = wezterm.action.SpawnWindow },
}

SplitHorizontal

{{since('20201031-154415-9614e117')}}

Splits the current pane in half horizontally such that the current pane becomes the left half and the new right half spawns a new command.

config.keys = {
  -- This will create a new split and run your default program inside it
  {
    key = '%',
    mods = 'CTRL|SHIFT|ALT',
    action = wezterm.action.SplitHorizontal { domain = 'CurrentPaneDomain' },
  },
}

SplitHorizontal requires a SpawnCommand parameter to specify what should be spawned into the new split.

config.keys = {
  -- This will create a new split and run the `top` program inside it
  {
    key = '%',
    mods = 'CTRL|SHIFT|ALT',
    action = wezterm.action.SplitHorizontal {
      args = { 'top' },
    },
  },
}

See also: SplitPane.

SplitPane

{{since('20220624-141144-bd1b7c5d')}}

Splits the active pane in a particular direction, spawning a new command into the newly created pane.

This assignment has a number of fields that control the overall action:

  • direction - can be one of "Up", "Down", "Left", "Right". Specifies where the new pane will end up. This field is required.
  • size - controls the size of the new pane. Can be {Cells=10} to specify eg: 10 cells or {Percent=50} to specify 50% of the available space. If omitted, {Percent=50} is the default
  • command - the SpawnCommand that specifies what program to launch into the new pane. If omitted, the default_prog is used
  • top_level - if set to true, rather than splitting the active pane, the split will be made at the root of the tab and effectively split the entire tab across the full extent possible. The default is false.
config.keys = {
  -- This will create a new split and run the `top` program inside it
  {
    key = '%',
    mods = 'CTRL|SHIFT|ALT',
    action = wezterm.action.SplitPane {
      direction = 'Left',
      command = { args = { 'top' } },
      size = { Percent = 50 },
    },
  },
}

See also: SplitHorizontal, SplitVertical and wezterm cli split-pane --help.

SplitVertical

{{since('20201031-154415-9614e117')}}

Splits the current pane in half vertically such that the current pane becomes the top half and the new bottom half spawns a new command.

config.keys = {
  -- This will create a new split and run your default program inside it
  {
    key = '"',
    mods = 'CTRL|SHIFT|ALT',
    action = wezterm.action.SplitVertical { domain = 'CurrentPaneDomain' },
  },
}

SplitVertical requires a SpawnCommand parameter to specify what should be spawned into the new split.

config.keys = {
  -- This will create a new split and run the `top` program inside it
  {
    key = '"',
    mods = 'CTRL|SHIFT|ALT',
    action = wezterm.action.SplitVertical {
      args = { 'top' },
    },
  },
}

See also: SplitPane.

StartWindowDrag

{{since('20210314-114017-04b7cedd')}}

Places the window in the drag-to-move state, which means that the window will move to follow your mouse pointer until the mouse button is released.

By default this is bound to SUPER + left mouse drag, as well as CTRL-SHIFT + left mouse drag.

config.mouse_bindings = {
  {
    event = { Drag = { streak = 1, button = 'Left' } },
    mods = 'SUPER',
    action = wezterm.action.StartWindowDrag,
  },
  {
    event = { Drag = { streak = 1, button = 'Left' } },
    mods = 'CTRL|SHIFT',
    action = wezterm.action.StartWindowDrag,
  },
}

SwitchToWorkspace

{{since('20220319-142410-0fcdea07')}}

Switch to a different workspace, creating it if it doesn't already exist.

SwitchToWorkspace accepts two optional parameters:

  • name - the name of the workspace. If omitted, a randomly generated name will be chosen.
  • spawn - a SpawnCommand describing the command that should be started in the workspace if it doesn't already exist. If omitted, the default program will be spawned in the newly created workspace.
local act = wezterm.action

wezterm.on('update-right-status', function(window, pane)
  window:set_right_status(window:active_workspace())
end)

config.keys = {
  -- Switch to the default workspace
  {
    key = 'y',
    mods = 'CTRL|SHIFT',
    action = act.SwitchToWorkspace {
      name = 'default',
    },
  },
  -- Switch to a monitoring workspace, which will have `top` launched into it
  {
    key = 'u',
    mods = 'CTRL|SHIFT',
    action = act.SwitchToWorkspace {
      name = 'monitoring',
      spawn = {
        args = { 'top' },
      },
    },
  },
  -- Create a new workspace with a random name and switch to it
  { key = 'i', mods = 'CTRL|SHIFT', action = act.SwitchToWorkspace },
  -- Show the launcher in fuzzy selection mode and have it list all workspaces
  -- and allow activating one.
  {
    key = '9',
    mods = 'ALT',
    action = act.ShowLauncherArgs {
      flags = 'FUZZY|WORKSPACES',
    },
  },
}

return config

Prompting for the workspace name

{{since('20230408-112425-69ae8472')}}

local act = wezterm.action

wezterm.on('update-right-status', function(window, pane)
  window:set_right_status(window:active_workspace())
end)

config.keys = {
  -- Prompt for a name to use for a new workspace and switch to it.
  {
    key = 'W',
    mods = 'CTRL|SHIFT',
    action = act.PromptInputLine {
      description = wezterm.format {
        { Attribute = { Intensity = 'Bold' } },
        { Foreground = { AnsiColor = 'Fuchsia' } },
        { Text = 'Enter name for new workspace' },
      },
      action = wezterm.action_callback(function(window, pane, line)
        -- line will be `nil` if they hit escape without entering anything
        -- An empty string if they just hit enter
        -- Or the actual line of text they wrote
        if line then
          window:perform_action(
            act.SwitchToWorkspace {
              name = line,
            },
            pane
          )
        end
      end),
    },
  },
}

return config

SwitchWorkspaceRelative

{{since('20220319-142410-0fcdea07')}}

Switch to the workspace relative to the current workspace. Workspaces are ordered lexicographically based on their names.

The argument value specifies an offset. eg: -1 switches to the workspace immediately prior to the current workspace, while 1 switches to the workspace immediately following the current workspace.

This example binds CTRL-N and CTRL-P to move forwards, backwards through workspaces. It shows the active workspace in the title bar. The launcher menu can be used to create workspaces.

local wezterm = require 'wezterm'
local act = wezterm.action

wezterm.on('update-right-status', function(window, pane)
  window:set_right_status(window:active_workspace())
end)

config.keys = {
  {
    key = '9',
    mods = 'ALT',
    action = act.ShowLauncherArgs { flags = 'FUZZY|WORKSPACES' },
  },
  { key = 'n', mods = 'CTRL', action = act.SwitchWorkspaceRelative(1) },
  { key = 'p', mods = 'CTRL', action = act.SwitchWorkspaceRelative(-1) },
}

ToggleAlwaysOnBottom

{{since('20240127-113634-bbcac864')}}

Toggles the window to remain behind all other windows.

config.keys = {
  {
    key = ']',
    mods = 'CMD|SHIFT',
    action = wezterm.action.ToggleAlwaysOnBottom,
  },
}

!!! note This functionality is currently only implemented on macOS. The assigned values for window level will have no effect on other operating systems.

ToggleAlwaysOnTop

{{since('20240127-113634-bbcac864')}}

Toggles the window between floating and non-floating states to stay on top of other windows.

config.keys = {
  {
    key = ']',
    mods = 'CMD|SHIFT',
    action = wezterm.action.ToggleAlwaysOnTop,
  },
}

!!! note This functionality is currently only implemented on macOS. The assigned values for window level will have no effect on other operating systems.

ToggleFullScreen

Toggles full screen mode for the current window.

local wezterm = require 'wezterm'

config.keys = {
  {
    key = 'n',
    mods = 'SHIFT|CTRL',
    action = wezterm.action.ToggleFullScreen,
  },
}

See also: native_macos_fullscreen_mode.

TogglePaneZoomState

{{since('20201031-154415-9614e117')}}

Toggles the zoom state of the current pane. A Zoomed pane takes up all available space in the tab, hiding all other panes while it is zoomed. Switching its zoom state off will restore the prior split arrangement.

config.keys = {
  {
    key = 'Z',
    mods = 'CTRL',
    action = wezterm.action.TogglePaneZoomState,
  },
}

See also: unzoom_on_switch_pane, SetPaneZoomState.

CopyModeAssignment enumeration

Represents a pre-defined function that can be applied to control CopyMode and Search Mode.

Available Key Assignments

CopyMode AcceptPattern

{{since('20220624-141144-bd1b7c5d')}}

Take CopyMode/SearchMode out of editing mode: keyboard input will no longer be directed to the search pattern editor.

See also EditPattern.

CopyMode ClearPattern

{{since('20220624-141144-bd1b7c5d')}}

Clear the CopyMode/SearchMode search pattern.

local wezterm = require 'wezterm'
local act = wezterm.action

return {
  key_tables = {
    search_mode = {
      { key = 'u', mods = 'CTRL', action = act.CopyMode 'ClearPattern' },
    },
  },
}

CopyMode ClearSelectionMode

{{since('20220807-113146-c2fee766')}}

Clears the current CopyMode selection mode without leaving CopyMode.

local wezterm = require 'wezterm'
local act = wezterm.action

return {
  key_tables = {
    copy_mode = {
      {
        key = 'y',
        mods = 'NONE',
        action = act.Multiple {
          act.CopyTo 'PrimarySelection',
          act.ClearSelection,
          -- clear the selection mode, but remain in copy mode
          act.CopyMode { 'ClearSelectionMode' },
        },
      },
    },
  },
}

See also: SetSelectionMode.

CopyMode Close

{{since('20220624-141144-bd1b7c5d')}}

Close copy mode.

local wezterm = require 'wezterm'
local act = wezterm.action

return {
  key_tables = {
    copy_mode = {
      { key = 'q', mods = 'NONE', action = act.CopyMode 'Close' },
    },
  },
}

CopyMode CycleMatchType

{{since('20220624-141144-bd1b7c5d')}}

Move the CopyMode/SearchMode cycle between case-sensitive, case-insensitive and regular expression match types.

local wezterm = require 'wezterm'
local act = wezterm.action

return {
  key_tables = {
    search_mode = {
      { key = 'r', mods = 'CTRL', action = act.CopyMode 'CycleMatchType' },
    },
  },
}

CopyMode EditPattern

{{since('20220624-141144-bd1b7c5d')}}

Put CopyMode/SearchMode into editing mode: keyboard input will be directed to the search pattern editor.

local wezterm = require 'wezterm'
local act = wezterm.action

return {
  key_tables = {
    search_mode = {
      -- This action is not bound by default in wezterm
      { key = 'e', mods = 'CTRL', action = act.CopyMode 'EditPattern' },
    },
  },
}

See also AcceptPattern.

CopyMode MoveBackwardSemanticZone

{{since('20220903-194523-3bb1ed61')}}

Moves the CopyMode cursor position one semantic zone to the left.

See Shell Integration for more information about semantic zones.

local wezterm = require 'wezterm'
local act = wezterm.action

return {
  key_tables = {
    copy_mode = {
      {
        key = 'z',
        mods = 'NONE',
        action = act.CopyMode 'MoveBackwardSemanticZone',
      },
    },
  },
}

CopyMode { MoveBackwardSemanticZone = ZONE }

{{since('20220903-194523-3bb1ed61')}}

Moves the CopyMode cursor position to the first semantic zone of the specified type that precedes the current zone.

See Shell Integration for more information about semantic zones.

Possible values for ZONE are:

  • "Output"
  • "Input"
  • "Prompt"
local wezterm = require 'wezterm'
local act = wezterm.action

return {
  key_tables = {
    copy_mode = {
      {
        key = 'z',
        mods = 'ALT',
        action = act.CopyMode { MoveBackwardZoneOfType = 'Output' },
      },
    },
  },
}

CopyMode MoveBackwardWord

{{since('20220624-141144-bd1b7c5d')}}

Moves the CopyMode cursor position one word to the left.

local wezterm = require 'wezterm'
local act = wezterm.action

return {
  key_tables = {
    copy_mode = {
      { key = 'b', mods = 'NONE', action = act.CopyMode 'MoveBackwardWord' },
    },
  },
}

CopyMode MoveDown

{{since('20220624-141144-bd1b7c5d')}}

Moves the CopyMode cursor position one cell down.

local wezterm = require 'wezterm'
local act = wezterm.action

return {
  key_tables = {
    copy_mode = {
      { key = 'DownArrow', mods = 'NONE', action = act.CopyMode 'MoveDown' },
    },
  },
}

CopyMode MoveForwardSemanticZone

{{since('20220903-194523-3bb1ed61')}}

Moves the CopyMode cursor position one semantic zone to the right.

See Shell Integration for more information about semantic zones.

local wezterm = require 'wezterm'
local act = wezterm.action

return {
  key_tables = {
    copy_mode = {
      {
        key = 'Z',
        mods = 'NONE',
        action = act.CopyMode 'MoveForwardSemanticZone',
      },
    },
  },
}

CopyMode { MoveForwardSemanticZone = ZONE }

{{since('20220903-194523-3bb1ed61')}}

Moves the CopyMode cursor position to the next semantic zone of the specified type that follows the current zone.

See Shell Integration for more information about semantic zones.

Possible values for ZONE are:

  • "Output"
  • "Input"
  • "Prompt"
local wezterm = require 'wezterm'
local act = wezterm.action

return {
  key_tables = {
    copy_mode = {
      {
        key = 'Z',
        mods = 'ALT',
        action = act.CopyMode { MoveForwardZoneOfType = 'Output' },
      },
    },
  },
}

CopyMode MoveForwardWord

{{since('20220624-141144-bd1b7c5d')}}

Moves the CopyMode cursor position one word to the right.

local wezterm = require 'wezterm'
local act = wezterm.action

return {
  key_tables = {
    copy_mode = {
      { key = 'w', mods = 'NONE', action = act.CopyMode 'MoveForwardWord' },
    },
  },
}

CopyMode MoveForwardWord

{{since('20230320-124340-559cb7b0')}}

Moves the CopyMode cursor position forward to the end of word.

local wezterm = require 'wezterm'
local act = wezterm.action

return {
  key_tables = {
    copy_mode = {
      {
        key = 'e',
        mods = 'NONE',
        action = act.CopyMode 'MoveForwardWordEnd',
      },
    },
  },
}

CopyMode MoveLeft

{{since('20220624-141144-bd1b7c5d')}}

Moves the CopyMode cursor position one cell to the left.

local wezterm = require 'wezterm'
local act = wezterm.action

return {
  key_tables = {
    copy_mode = {
      { key = 'h', mods = 'NONE', action = act.CopyMode 'MoveLeft' },
      { key = 'LeftArrow', mods = 'NONE', action = act.CopyMode 'MoveLeft' },
    },
  },
}

CopyMode MoveRight

{{since('20220624-141144-bd1b7c5d')}}

Moves the CopyMode cursor position one cell to the right.

local wezterm = require 'wezterm'
local act = wezterm.action

return {
  key_tables = {
    copy_mode = {
      {
        key = 'RightArrow',
        mods = 'NONE',
        action = act.CopyMode 'MoveRight',
      },
    },
  },
}

CopyMode MoveToEndOfLineContent

{{since('20220624-141144-bd1b7c5d')}}

Moves the CopyMode cursor position to the last non-space cell in the current line.

local wezterm = require 'wezterm'
local act = wezterm.action

return {
  key_tables = {
    copy_mode = {
      {
        key = '$',
        mods = 'NONE',
        action = act.CopyMode 'MoveToEndOfLineContent',
      },
    },
  },
}

CopyMode MoveToScrollbackBottom

{{since('20220624-141144-bd1b7c5d')}}

Moves the CopyMode cursor position to the bottom of the scrollback.

local wezterm = require 'wezterm'
local act = wezterm.action

return {
  key_tables = {
    copy_mode = {
      {
        key = 'G',
        mods = 'NONE',
        action = act.CopyMode 'MoveToScrollbackBottom',
      },
    },
  },
}

CopyMode MoveToScrollbackTop

{{since('20220624-141144-bd1b7c5d')}}

Moves the CopyMode cursor position to the top of the scrollback.

local wezterm = require 'wezterm'
local act = wezterm.action

return {
  key_tables = {
    copy_mode = {
      {
        key = 'g',
        mods = 'NONE',
        action = act.CopyMode 'MoveToScrollbackTop',
      },
    },
  },
}

CopyMode MoveToSelectionOtherEnd

{{since('20220624-141144-bd1b7c5d')}}

Moves the CopyMode cursor position to the other end of the selection; if the cursor is at the top left corner and the starting point is the bottom right corner, then the cursor and starting point are swapped, with the cursor now positioned at the bottom right corner.

local wezterm = require 'wezterm'
local act = wezterm.action

return {
  key_tables = {
    copy_mode = {
      {
        key = 'o',
        mods = 'NONE',
        action = act.CopyMode 'MoveToSelectionOtherEnd',
      },
    },
  },
}

CopyMode MoveToSelectionOtherEndHoriz

{{since('20220624-141144-bd1b7c5d')}}

Moves the CopyMode cursor position to the other horizontal end of the selection without changing the y-coordinate; if the cursor at the left end and the starting point at the right end, then the cursor and starting point are swapped, with the cursor now positioned at the right end.

local wezterm = require 'wezterm'
local act = wezterm.action

return {
  key_tables = {
    copy_mode = {
      {
        key = 'O',
        mods = 'NONE',
        action = act.CopyMode 'MoveToSelectionOtherEndHoriz',
      },
    },
  },
}

CopyMode MoveToStartOfLine

{{since('20220624-141144-bd1b7c5d')}}

Moves the CopyMode cursor position to the first cell in the current line.

local wezterm = require 'wezterm'
local act = wezterm.action

return {
  key_tables = {
    copy_mode = {
      {
        key = '0',
        mods = 'NONE',
        action = act.CopyMode 'MoveToStartOfLine',
      },
    },
  },
}

CopyMode MoveToStartOfLineContent

{{since('20220624-141144-bd1b7c5d')}}

Moves the CopyMode cursor position to the first non-space cell in the current line.

local wezterm = require 'wezterm'
local act = wezterm.action

return {
  key_tables = {
    copy_mode = {
      {
        key = '^',
        mods = 'NONE',
        action = act.CopyMode 'MoveToStartOfLineContent',
      },
    },
  },
}

CopyMode MoveToStartOfNextLine

{{since('20220624-141144-bd1b7c5d')}}

Moves the CopyMode cursor position to the first cell in the next line.

local wezterm = require 'wezterm'
local act = wezterm.action

return {
  key_tables = {
    copy_mode = {
      {
        key = 'Enter',
        mods = 'NONE',
        action = act.CopyMode 'MoveToStartOfNextLine',
      },
    },
  },
}

CopyMode MoveToViewportBottom

{{since('20220624-141144-bd1b7c5d')}}

Moves the CopyMode cursor position to the bottom of the viewport.

local wezterm = require 'wezterm'
local act = wezterm.action

return {
  key_tables = {
    copy_mode = {
      {
        key = 'L',
        mods = 'NONE',
        action = act.CopyMode 'MoveToViewportBottom',
      },
    },
  },
}

CopyMode MoveToViewportMiddle

{{since('20220624-141144-bd1b7c5d')}}

Moves the CopyMode cursor position to the middle of the viewport.

local wezterm = require 'wezterm'
local act = wezterm.action

return {
  key_tables = {
    copy_mode = {
      {
        key = 'M',
        mods = 'NONE',
        action = act.CopyMode 'MoveToViewportMiddle',
      },
    },
  },
}

CopyMode MoveToViewportTop

{{since('20220624-141144-bd1b7c5d')}}

Moves the CopyMode cursor position to the top of the viewport.

local wezterm = require 'wezterm'
local act = wezterm.action

return {
  key_tables = {
    copy_mode = {
      {
        key = 'H',
        mods = 'NONE',
        action = act.CopyMode 'MoveToViewportTop',
      },
    },
  },
}

CopyMode MoveUp

{{since('20220624-141144-bd1b7c5d')}}

Moves the CopyMode cursor position one cell up.

local wezterm = require 'wezterm'
local act = wezterm.action

return {
  key_tables = {
    copy_mode = {
      { key = 'UpArrow', mods = 'NONE', action = act.CopyMode 'MoveUp' },
    },
  },
}

CopyMode NextMatch

{{since('20220624-141144-bd1b7c5d')}}

Move the CopyMode/SearchMode selection to the next matching text, if any.

local wezterm = require 'wezterm'
local act = wezterm.action

return {
  key_tables = {
    search_mode = {
      { key = 'n', mods = 'CTRL', action = act.CopyMode 'NextMatch' },
    },
  },
}

CopyMode NextMatchPage

{{since('20220624-141144-bd1b7c5d')}}

Move the CopyMode/SearchMode selection to the next matching text on the next page of the screen, if any.

local wezterm = require 'wezterm'
local act = wezterm.action

return {
  key_tables = {
    search_mode = {
      {
        key = 'PageDown',
        mods = 'CTRL',
        action = act.CopyMode 'NextMatchPage',
      },
    },
  },
}

CopyMode PriorMatch

{{since('20220624-141144-bd1b7c5d')}}

Move the CopyMode/SearchMode selection to the previous matching text, if any.

local wezterm = require 'wezterm'
local act = wezterm.action

return {
  key_tables = {
    search_mode = {
      { key = 'Enter', mods = 'NONE', action = act.CopyMode 'PriorMatch' },
    },
  },
}

CopyMode PriorMatchPage

{{since('20220624-141144-bd1b7c5d')}}

Move the CopyMode/SearchMode selection to the previous matching text on the previous page of the screen, if any.

local wezterm = require 'wezterm'
local act = wezterm.action

return {
  key_tables = {
    search_mode = {
      {
        key = 'PageUp',
        mods = 'CTRL',
        action = act.CopyMode 'PriorMatchPage',
      },
    },
  },
}

CopyMode { SetSelectionMode = MODE }

{{since('20220624-141144-bd1b7c5d')}}

Sets the CopyMode selection mode.

MODE can be one of:

  • "Cell" - selection expands a single cell at a time
  • "Word" - selection expands by a word at a time
  • "Line" - selection expands by a line at a time
  • "Block" - selection expands to define a rectangular block using the starting point and current cursor position as the corners
  • "SemanticZone" - selection expands to the current semantic zone. See Shell Integration. {{since('20220903-194523-3bb1ed61', inline=True)}}.
local wezterm = require 'wezterm'
local act = wezterm.action

return {
  key_tables = {
    copy_mode = {
      {
        key = 'v',
        mods = 'NONE',
        action = act.CopyMode { SetSelectionMode = 'Cell' },
      },
    },
  },
}

See also: ClearSelectionMode.

Color object

Color objects can be created by calling wezterm.color.parse() and may also be returned by various wezterm functions and methods.

They represent a color that is internally stored in SRGBA.

Color objects have a number of methods that are helpful to compare and compute other color values, which is helpful when programmatically generating color schemes.

Available methods

color:adjust_hue_fixed(degrees)

{{since('20220807-113146-c2fee766')}}

Adjust the hue angle by the specified number of degrees.

180 degrees gives the complementary color. Three colors separated by 120 degrees form the triad. Four colors separated by 90 degrees form the square.

See also color:adjust_hue_fixed_ryb().

color:adjust_hue_fixed_ryb(degrees)

{{since('20220807-113146-c2fee766')}}

Adjust the hue angle by the specified number of degrees.

This method uses the RYB color model, which more closely matches how artists think of mixing colors and which is sometimes referred to as the "artist's color wheel".

180 degrees gives the complementary color. Three colors separated by 120 degrees form the triad. Four colors separated by 90 degrees form the square.

See also color:adjust_hue_fixed().

color:complement()

{{since('20220807-113146-c2fee766')}}

Returns the complement of the color. The complement is computed by converting to HSL, rotating by 180 degrees and converting back to RGBA.

See also: color:complement_ryb().

color:complement_ryb()

{{since('20220807-113146-c2fee766')}}

Returns the complement of the color using the RYB color model, which more closely matches how artists think of mixing colors.

The complement is computed by converting to HSL, converting the hue angle to the equivalent RYB angle, rotating by 180 degrees and and then converting back to RGBA.

See also: color:complement().

color:contrast_ratio(color)

{{since('20220807-113146-c2fee766')}}

Computes the contrast ratio between the two colors.

> wezterm.color.parse("red"):contrast_ratio(wezterm.color.parse("yellow"))
1
> wezterm.color.parse("red"):contrast_ratio(wezterm.color.parse("navy"))
1.8273614734023298

The contrast ratio is computed by first converting to HSL, taking the L components, and diving the lighter one by the darker one.

A contrast ratio of 1 means no contrast.

The maximum possible contrast ratio is 21:

> wezterm.color.parse("black"):contrast_ratio(wezterm.color.parse("white"))
21

color:darken(factor)

{{since('20220807-113146-c2fee766')}}

Scales the color towards the minimum lightness by the provided factor, which should be in the range 0.0 through 1.0.

color:darken_fixed(amount)

{{since('20220807-113146-c2fee766')}}

Decrease the lightness by amount, a value ranging from 0.0 to 1.0.

color:delta_e(color)

{{since('20220807-113146-c2fee766')}}

Computes the CIEDE2000 DeltaE value representing the difference between the two colors.

A value:

  • <= 1.0: difference is not perceptible by the human eye
  • 1-2: difference is perceptible through close observation
  • 2-10: difference is perceptible at a glance
  • 11-49: Colors are more similar than the opposite
  • 50-99: Colors are more opposite than similar
  • 100: Colors are exactly the opposite

color:desaturate(factor)

{{since('20220807-113146-c2fee766')}}

Scales the color towards the minimum saturation by the provided factor, which should be in the range 0.0 through 1.0.

color:desaturate_fixed(amount)

{{since('20220807-113146-c2fee766')}}

Decrease the saturation by amount, a value ranging from 0.0 to 1.0.

color:hsla()

{{since('20220807-113146-c2fee766')}}

Converts the color to the HSL colorspace and returns those values + alpha:

local h, s, l, a = color:hsla()

color:laba()

{{since('20220807-113146-c2fee766')}}

Converts the color to the LAB colorspace and returns those values + alpha:

local l, a, b, alpha = color:laba()

color:lighten(factor)

{{since('20220807-113146-c2fee766')}}

Scales the color towards the maximum lightness by the provided factor, which should be in the range 0.0 through 1.0.

color:lighten_fixed(amount)

{{since('20220807-113146-c2fee766')}}

Increase the lightness by amount, a value ranging from 0.0 to 1.0.

color:linear_rgba()

{{since('20220807-113146-c2fee766')}}

Returns a tuple of the colors converted to linear RGBA and expressed as floating point numbers in the range 0.0-1.0:

> r, g, b, a = wezterm.color.parse("purple"):linear_rgba()
> print(r, g, b, a)
07:32:17.734 INFO logging > lua: 0.2158605307340622 0 0.2158605307340622 1

color:saturate(factor)

{{since('20220807-113146-c2fee766')}}

Scales the color towards the maximum saturation by the provided factor, which should be in the range 0.0 through 1.0.

color:saturate_fixed(amount)

{{since('20220807-113146-c2fee766')}}

Increase the saturation by amount, a value ranging from 0.0 to 1.0.

color:square()

{{since('20220807-113146-c2fee766')}}

Returns the other three colors that form a square. The other colors are 90 degrees apart on the HSL color wheel.

local a, b, c = wezterm.color.parse("yellow"):square()

color:srgba_u8()

{{since('20220807-113146-c2fee766')}}

Returns a tuple of the internal SRGBA colors expressed as unsigned 8-bit integers in the range 0-255:

> r, g, b, a = wezterm.color.parse("purple"):srgba_u8()
> print(r, g, b, a)
07:30:20.045 INFO logging > lua: 128 0 128 255

color:triad()

{{since('20220807-113146-c2fee766')}}

Returns the other two colors that form a triad. The other colors are at +/- 120 degrees in the HSL color wheel.

local a, b = wezterm.color.parse('yellow'):triad()

ExecDomain

{{since('20220807-113146-c2fee766')}}

An ExecDomain defines a local-execution multiplexer domain. In simple terms, rather than directly executing the requested program, an ExecDomain allows you wrap up that command invocation by passing it through some other process.

For example, if you wanted to make it more convenient to work with tabs and panes inside a docker container, you might want to define an ExecDomain that causes the commands to be run via docker exec. While you could just ask wezterm to explicitly spawn a command that runs docker exec, you would also need to adjust the default key assignments for splitting panes to know about that preference. Using an ExecDomain allows that preference to be associated with the pane so that things work more intuitively.

Defining an ExecDomain

You must use the wezterm.exec_domain function to define a domain. It accepts the following parameters:

wezterm.exec_domain(NAME, FIXUP [, LABEL])
  • name - uniquely identifies the domain. Must be different from any other multiplexer domains.
  • fixup - a lua function that will be called to fixup the requested command and return the revised command
  • label - optional. Can be either a string to serve as a label in the Launcher Menu, or a lua function that will return the label.

fixup

The simplest fixup function looks like this:

wezterm.exec_domain('myname', function(cmd)
  return cmd
end)

The cmd parameter is a SpawnCommand that contains information about the command that is to be executed. This will either be something that the user configured as a key assignment or will be an equivalent generated in response to a request to spawn a new tab or split a pane.

It is expected that your fixup function will adjust the various fields of the provided command and then return it. The adjusted command is what wezterm will execute in order to satisfy the user's request to spawn a new program.

label

The label is visible in the Launcher Menu. You may set it a static string or set it to a lua callback. The default behavior is equivalent to this callback function definition:

-- domain_name is the same name you used as the first parameter to
-- wezterm.exec_domain()
wezterm.exec_domains(domain_name, fixup_func, function(domain_name)
  return domain_name
end)

Using a callback function allows you to produce an amended label just in time for the launcher menu to be rendered. That is useful for example to adjust it to represent some status information. If you were defining an ExecDomain for a docker container or VM, then you could have the label reflect whether it is currently running.

Both the static string and the generated string may include escape sequences that affect the styling of the text. You may wish to use wezterm.format() to manage that.

Example: Running commands in their own systemd scope

local wezterm = require 'wezterm'
local config = {}

-- Equivalent to POSIX basename(3)
-- Given "/foo/bar" returns "bar"
-- Given "c:\\foo\\bar" returns "bar"
local function basename(s)
  return string.gsub(s, '(.*[/\\])(.*)', '%2')
end

config.exec_domains = {
  -- Defines a domain called "scoped" that will run the requested
  -- command inside its own individual systemd scope.
  -- This defines a strong boundary for resource control and can
  -- help to avoid OOMs in one pane causing other panes to be
  -- killed.
  wezterm.exec_domain('scoped', function(cmd)
    -- The "cmd" parameter is a SpawnCommand object.
    -- You can log it to see what's inside:
    wezterm.log_info(cmd)

    -- Synthesize a human understandable scope name that is
    -- (reasonably) unique. WEZTERM_PANE is the pane id that
    -- will be used for the newly spawned pane.
    -- WEZTERM_UNIX_SOCKET is associated with the wezterm
    -- process id.
    local env = cmd.set_environment_variables
    local ident = 'wezterm-pane-'
      .. env.WEZTERM_PANE
      .. '-on-'
      .. basename(env.WEZTERM_UNIX_SOCKET)

    -- Generate a new argument array that will launch a
    -- program via systemd-run
    local wrapped = {
      '/usr/bin/systemd-run',
      '--user',
      '--scope',
      '--description=Shell started by wezterm',
      '--same-dir',
      '--collect',
      '--unit=' .. ident,
    }

    -- Append the requested command
    -- Note that cmd.args may be nil; that indicates that the
    -- default program should be used. Here we're using the
    -- shell defined by the SHELL environment variable.
    for _, arg in ipairs(cmd.args or { os.getenv 'SHELL' }) do
      table.insert(wrapped, arg)
    end

    -- replace the requested argument array with our new one
    cmd.args = wrapped

    -- and return the SpawnCommand that we want to execute
    return cmd
  end),
}

-- Making the domain the default means that every pane/tab/window
-- spawned by wezterm will have its own scope
config.default_domain = 'scoped'

return config

Example: docker domains

This example shows how to add each running docker container as a domain, so that you can spawn a shell into it and/or split it:

{% raw %}

local wezterm = require 'wezterm'
local config = wezterm.config_builder()

function docker_list()
  local docker_list = {}
  local success, stdout, stderr = wezterm.run_child_process {
    'docker',
    'container',
    'ls',
    '--format',
    '{{.ID}}:{{.Names}}',
  }
  for _, line in ipairs(wezterm.split_by_newlines(stdout)) do
    local id, name = line:match '(.-):(.+)'
    if id and name then
      docker_list[id] = name
    end
  end
  return docker_list
end

function make_docker_label_func(id)
  return function(name)
    local success, stdout, stderr = wezterm.run_child_process {
      'docker',
      'inspect',
      '--format',
      '{{.State.Running}}',
      id,
    }
    local running = stdout == 'true\n'
    local color = running and 'Green' or 'Red'
    return wezterm.format {
      { Foreground = { AnsiColor = color } },
      { Text = 'docker container named ' .. name },
    }
  end
end

function make_docker_fixup_func(id)
  return function(cmd)
    cmd.args = cmd.args or { '/bin/sh' }
    local wrapped = {
      'docker',
      'exec',
      '-it',
      id,
    }
    for _, arg in ipairs(cmd.args) do
      table.insert(wrapped, arg)
    end

    cmd.args = wrapped
    return cmd
  end
end

function compute_exec_domains()
  local exec_domains = {}
  for id, name in pairs(docker_list()) do
    table.insert(
      exec_domains,
      wezterm.exec_domain(
        'docker:' .. name,
        make_docker_fixup_func(id),
        make_docker_label_func(id)
      )
    )
  end
  return exec_domains
end

config.exec_domains = compute_exec_domains()

return config

{% endraw %}

With something like the config above, each time the config is reloaded, the list of available domains will be updated.

Opening the launcher menu will show them and their status and allow you to launch programs inside those containers.

LocalProcessInfo

{{since('20220101-133340-7edc5b5a')}}

LocalProcessInfo represents a process running on the local machine.

It has the following fields:

  • pid - the process id
  • ppid - the parent process id
  • name - a short name for the process. Due to platform limitations, this may be inaccurate and truncated; you probably should prefer to look at the executable or argv fields instead of this one
  • status - a string holding the status of the process; it can be Idle, Run, Sleep, Stop, Zombie, Tracing, Dead, Wakekill, Waking, Parked, LockBlocked, Unknown.
  • argv - a table holding the argument array for the process
  • executable - the full path to the executable image for the process (may be empty)
  • cwd - the current working directory for the process (may be empty)
  • children - a table keyed by child process id and whose values are themselves LocalProcessInfo objects that describe the child processes

See mux-is-process-stateful and pane:get_foreground_process_info()

MuxDomain object

{{since('20230320-124340-559cb7b0')}}

MuxDomain represents a domain that is managed by the multiplexer.

It has the following methods:

domain:attach()

{{since('20230320-124340-559cb7b0')}}

Attempts to attach the domain.

Attaching a domain will attempt to import the windows, tabs and panes from the remote system into those of the local GUI.

Unlike the AttachDomain key assignment, calling domain:attach() will not implicitly spawn a new pane into the domain if the domain contains no panes. This is to provide flexibility when used in the gui-startup event.

If the domain is already attached, calling this method again has no effect.

See also: domain:detach() and domain:state().

domain:detach()

{{since('20230320-124340-559cb7b0')}}

Attempts to detach the domain.

Detaching a domain causes it to disconnect and remove its set of windows, tabs and panes from the local GUI. Detaching does not cause those panes to close; if or when you later attach to the domain, they'll still be there.

Not every domain supports detaching, and will log an error to the error log/debug overlay.

domain:domain_id()

{{since('20230320-124340-559cb7b0')}}

Returns the domain id.

domain:has_any_panes()

{{since('20230320-124340-559cb7b0')}}

Returns true if the mux has any panes that belong to this domain.

This can be useful when deciding whether to spawn additional panes after attaching to a domain.

domain:is_spawnable()

{{since('20230320-124340-559cb7b0')}}

Returns false if this domain will never be able to spawn a new pane/tab/window, true otherwise.

Serial ports are represented by a serial domain that is not spawnable.

domain:label()

{{since('20230320-124340-559cb7b0')}}

Computes a label describing the name and state of the domain. The label can change depending on the state of the domain.

See also: domain:name().

domain:name()

{{since('20230320-124340-559cb7b0')}}

Returns the name of the domain. Domain names are unique; no two domains can have the same name, and the name is fixed for the lifetime of the domain.

See also: domain:label().

domain:state()

{{since('20230320-124340-559cb7b0')}}

Returns whether the domain is attached or not. The result is a string that is either:

  • "Attached" - the domain is attached
  • "Detached" - the domain is not attached

See also: domain:detach() and domain:detach().

MuxWindow object

{{since('20220624-141144-bd1b7c5d')}}

MuxWindow represents a window that is managed by the multiplexer.

It has the following methods:

window:active_pane()

{{since('20230408-112425-69ae8472')}}

A convenience accessor for returning the active pane in the active tab of the window.

In earlier versions of wezterm, you could obtain this via:

function active_tab(window)
  for _, item in ipairs(window:tabs_with_info()) do
    if item.is_active then
      return item.tab
    end
  end
end

function active_pane(tab)
  for _, item in ipairs(tab:panes_with_info()) do
    if item.is_active then
      return item.pane
    end
  end
end

See also gui_window:active_pane(), which is similar to this method, but which can return overlay panes that are not visible to the mux layer of the API.

window:active_tab()

{{since('20230408-112425-69ae8472')}}

A convenience accessor for returning the active tab within the window.

In earlier versions of wezterm, you could obtain this via:

function active_tab(window)
  for _, item in ipairs(window:tabs_with_info()) do
    if item.is_active then
      return item.tab
    end
  end
end

window:get_title()

{{since('20220807-113146-c2fee766')}}

Returns the window title as set by OSC 0, OSC 2 in a contained pane, or through window:set_title().

window:get_workspace()

{{since('20220624-141144-bd1b7c5d')}}

Returns the name of the workspace to which the window belongs.

window:gui_window()

{{since('20220807-113146-c2fee766')}}

Attempts to resolve this mux window to its corresponding Gui Window.

This may not succeed for a couple of reasons:

  • If called by the multiplexer daemon, there is no gui, so this will never succeed
  • If the mux window is part of a workspace that is not the active workspace

This method is the inverse of window:mux_window.

window:set_title(TITLE)

{{since('20220807-113146-c2fee766')}}

Sets the window title to the provided string. Note that applications may subsequently change the title via escape sequences.

window:set_title 'my title'

window:set_workspace("something")

{{since('20220624-141144-bd1b7c5d')}}

Changes the name of the workspace to which the window belongs.

window:spawn_tab{}

{{since('20220624-141144-bd1b7c5d')}}

Spawns a program into a new tab within this window, returning the MuxTab, Pane and MuxWindow objects associated with it:

local tab, pane, window = window:spawn_tab {}

When no arguments are passed, the default program is spawned.

The following parameters are supported:

args

Specifies the argument array for the command that should be spawned. If omitted the default program for the domain will be spawned.

window:spawn_tab { args = { 'top' } }

cwd

Specify the current working directory that should be used for the program.

If unspecified, follows the rules from default_cwd

window:spawn_tab { cwd = '/tmp' }

set_environment_variables

Sets additional environment variables in the environment for this command invocation.

window:spawn_tab { set_environment_variables = { FOO = 'BAR' } }

domain

Specifies the multiplexer domain into which the program should be spawned. The default value is assumed to be "CurrentPaneDomain", which causes the domain from the currently active pane to be used.

You may specify the name of one of the multiplexer domains defined in your configuration using the following:

window:spawn_tab { domain = { DomainName = 'my.name' } }

window:tabs()

{{since('20220807-113146-c2fee766')}}

Returns an array table holding each of the MuxTab objects contained within this window.

window:tabs_with_info()

{{since('20220807-113146-c2fee766')}}

Returns an array table holding an extended info entry for each of the tabs contained within this window.

Each element is a lua table with the following fields:

  • index - the 0-based tab index
  • is_active - a boolean indicating whether this is the active tab within the window
  • tab - the MuxTab object

window:window_id()

{{since('20220624-141144-bd1b7c5d')}}

Returns the window multiplexer id.

MuxTab object

{{since('20220624-141144-bd1b7c5d')}}

MuxTab represents a tab that is managed by the multiplexer.

It has the following methods:

tab:activate()

{{since('20230408-112425-69ae8472')}}

Activates (focuses) the tab.

tab:active_pane()

{{since('20230408-112425-69ae8472')}}

A convenience accessor for returning the active pane in the tab.

In earlier versions of wezterm, you could obtain this via:

function active_pane(tab)
  for _, item in ipairs(tab:panes_with_info()) do
    if item.is_active then
      return item.pane
    end
  end
end

tab:get_pane_direction(direction)

{{since('20230320-124340-559cb7b0')}}

Returns pane adjacent to the active pane in tab in the direction direction.

Valid values for direction are:

  • "Left"
  • "Right"
  • "Up"
  • "Down"
  • "Prev"
  • "Next"

See ActivatePaneDirection for more information about how panes are selected given direction.

tab:get_size()

{{since('20230320-124340-559cb7b0')}}

Returns the overall size of the tab, taking into account all of the contained panes.

The return value is a lua table with the following fields:

  • rows - the number of rows (height)
  • cols - the number of columns (width)
  • pixel_width - the total width, measured in pixels
  • pixel_height - the total height, measured in pixels
  • dpi - the resolution of the tab.

Note that pixel_width, pixel_height and dpi may be inaccurate when there is no GUI client associated with the tab.

tab:get_title()

{{since('20220807-113146-c2fee766')}}

Returns the tab title as set by tab:set_title().

tab:panes()

{{since('20220807-113146-c2fee766')}}

Returns an array table containing the set of Pane objects contained by this tab.

tab:panes_with_info()

{{since('20220807-113146-c2fee766')}}

Returns an array table containing an extended info entry for each of the panes contained by this tab.

Each element is a lua table with the following fields:

  • index - the topological pane index
  • is_active - a boolean indicating whether this is the active pane within the tab
  • is_zoomed - a boolean indicating whether this pane is zoomed
  • left - The offset from the top left corner of the containing tab to the top left corner of this pane, in cells.
  • top - The offset from the top left corner of the containing tab to the top left corner of this pane, in cells.
  • width - The width of this pane in cells
  • height - The height of this pane in cells
  • pixel_width - The width of this pane in pixels
  • pixel_height - The height of this pane in pixels
  • pane - The Pane object

tab:rotate_clockwise()

{{since('20230320-124340-559cb7b0')}}

Rotates the panes in the clockwise direction.

See also tab:rotate_counter_clockwise().

tab:rotate_counter_clockwise()

{{since('20230320-124340-559cb7b0')}}

Rotates the panes in the counter clockwise direction.

See also tab:rotate_clockwise().

tab:set_title(TITLE)

{{since('20220807-113146-c2fee766')}}

Sets the tab title to the provided string.

tab:set_title 'my title'

Example of interactively changing the title

tab:set_zoomed(bool)

{{since('20220807-113146-c2fee766')}}

Sets the zoomed state for the active pane within this tab.

A zoomed pane takes up all available space in the tab, hiding all other panes while it is zoomed. Switching its zoom state off will restore the prior split arrangement.

Setting the zoom state to true zooms the pane if it wasn't already zoomed. Setting the zoom state to false un-zooms the pane if it was zoomed.

Returns the prior zoom state.

See also: unzoom_on_switch_pane, SetPaneZoomState.

tab:tab_id()

{{since('20220624-141144-bd1b7c5d')}}

Returns the tab id

tab:window()

{{since('20220807-113146-c2fee766')}}

Returns the MuxWindow object that contains this tab.

PaneInformation

The PaneInformation struct describes a pane. Unlike the Pane object, PaneInformation is a snapshot of some of the key characteristics of the pane, intended for use in synchronous, fast, event callbacks that format GUI elements such as the window and tab title bars.

The PaneInformation struct contains the following fields:

  • pane_id - the pane identifier number
  • pane_index - the logical position of the pane within its containing layout
  • is_active - is true if the pane is the active pane within its containing tab
  • is_zoomed - is true if the pane is in the zoomed state
  • left - the cell x coordinate of the left edge of the pane
  • top - the cell y coordinate of the top edge of the pane
  • width - the width of the pane in cells
  • height - the height of the pane in cells
  • pixel_width - the width of the pane in pixels
  • pixel_height - the height of the pane in pixels
  • title - the title of the pane, per pane:get_title() at the time the pane information was captured
  • user_vars - the user variables defined for the pane, per pane:get_user_vars() at the time the pane information was captured.
  • progress - the progress state, per pane:get_progress() at the time the pane information was captured. {{since('nightly', inline=True)}}

{{since('20220101-133340-7edc5b5a')}}

Additional fields are available; note that accessing these may not be cheap to compute and may slow down wezterm. Unlike the fields listed above, these are not pre-computed snapshots of information, so if you don't use them, you won't pay the cost of computing them.

This example places the executable name in the tab titles:

local wezterm = require 'wezterm'

-- Equivalent to POSIX basename(3)
-- Given "/foo/bar" returns "bar"
-- Given "c:\\foo\\bar" returns "bar"
function basename(s)
  return string.gsub(s, '(.*[/\\])(.*)', '%2')
end

wezterm.on(
  'format-tab-title',
  function(tab, tabs, panes, config, hover, max_width)
    local pane = tab.active_pane
    local title = basename(pane.foreground_process_name)
      .. ' '
      .. pane.pane_id
    local color = 'navy'
    if tab.is_active then
      color = 'blue'
    end
    return {
      { Background = { Color = color } },
      { Text = ' ' .. title .. ' ' },
    }
  end
)

return {}

{{since('20220319-142410-0fcdea07')}}

The has_unseen_output field returns true if the there has been output in the pane since the last time it was focused.

This example shows how to use this event to change the color of the tab in the tab bar when there is unseen output.

local wezterm = require 'wezterm'
local config = {}

wezterm.on(
  'format-tab-title',
  function(tab, tabs, panes, config, hover, max_width)
    if tab.is_active then
      return {
        { Background = { Color = 'blue' } },
        { Text = ' ' .. tab.active_pane.title .. ' ' },
      }
    end
    local has_unseen_output = false
    for _, pane in ipairs(tab.panes) do
      if pane.has_unseen_output then
        has_unseen_output = true
        break
      end
    end
    if has_unseen_output then
      return {
        { Background = { Color = 'Orange' } },
        { Text = ' ' .. tab.active_pane.title .. ' ' },
      }
    end
    return tab.active_pane.title
  end
)

return config

{{since('20220624-141144-bd1b7c5d')}}

The domain_name field returns the name of the domain with which the pane is associated.

This example shows the domain name of the active pane appended to the tab title:

local wezterm = require 'wezterm'
local config = {}

wezterm.on('format-tab-title', function(tab)
  local pane = tab.active_pane
  local title = pane.title
  if pane.domain_name then
    title = title .. ' - (' .. pane.domain_name .. ')'
  end
  return title
end)

return config

{{since('20230408-112425-69ae8472')}}

The tty_name field returns the tty name with the same constraints as described in pane:get_tty_name().

TabInformation

The TabInformation struct describes a tab. TabInformation is purely a snapshot of some of the key characteristics of the tab, intended for use in synchronous, fast, event callbacks that format GUI elements such as the window and tab title bars.

The TabInformation struct contains the following fields:

  • tab_id - the identifier for the tab
  • tab_index - the logical tab position within its containing window, with 0 indicating the leftmost tab
  • is_active - is true if this tab is the active tab
  • active_pane - the PaneInformation for the active pane in this tab
  • window_id - the ID of the window that contains this tab {{since('20220807-113146-c2fee766', inline=True)}}
  • window_title - the title of the window that contains this tab {{since('20220807-113146-c2fee766', inline=True)}}
  • tab_title - the title of the tab {{since('20220807-113146-c2fee766', inline=True)}}

SshDomain

The SshDomain struct specifies information about an individual SSH Domain.

It is a lua object with the following fields:

config.ssh_domains = {
  {
    -- The name of this specific domain.  Must be unique amongst
    -- all types of domain in the configuration file.
    name = 'my.server',

    -- identifies the host:port pair of the remote server
    -- Can be a DNS name or an IP address with an optional
    -- ":port" on the end.
    remote_address = '192.168.1.1',

    -- Whether agent auth should be disabled.
    -- Set to true to disable it.
    -- no_agent_auth = false,

    -- The username to use for authenticating with the remote host
    username = 'yourusername',

    -- If true, connect to this domain automatically at startup
    -- connect_automatically = true,

    -- Specify an alternative read timeout
    -- timeout = 60,

    -- The path to the wezterm binary on the remote host.
    -- Primarily useful if it isn't installed in the $PATH
    -- that is configure for ssh.
    -- remote_wezterm_path = "/home/yourusername/bin/wezterm"
  },
}

{{since('20220101-133340-7edc5b5a')}}

You may now specify a table with ssh config overrides:

config.ssh_domains = {
  {
    name = 'my.server',
    remote_address = '192.168.1.1',
    ssh_option = {
      identityfile = '/path/to/id_rsa.pub',
    },
  },
}

{{since('20220319-142410-0fcdea07')}}

You may now specify the type of multiplexing used by an ssh domain. The following values are possible:

  • "WezTerm" - this is the default; use wezterm's multiplexing client. Having wezterm installed on the server is required to use this mode.
  • "None" - don't use any multiplexing. The connection is an ssh connection using the same mechanism as is used by wezterm ssh; losing connectivity will lose any panes/tabs. This mode of operation is convenient when using SSH to connect automatically into eg: a locally hosted WSL instance, together with the default_domain option.

A new assume_shell option, when coupled with multiplexing = "None", allows wezterm to assume that the remote host uses a specific shell command language dialect, which in turn allows wezterm to respect the current working directory as set by OSC 7 / Shell Integration on the remote host when spawning new panes and tabs. The following values are recognized for assume_shell:

  • "Unknown" - this is the default. We can't make any assumptions about the remote shell.
  • "Posix" - the remote host uses a POSIX/Bourne Shell compatible environment that allows the syntax env -c DIR ENV1=VAL1 ENV2=VAL2 CMD and env -c DIR ENV1=VAL1 ENV2=VAL2 $SHELL.
config.ssh_domains = {
  {
    name = 'my.server',
    remote_address = '192.168.1.1',
    multiplexing = 'None',

    -- When multiplexing == "None", default_prog can be used
    -- to specify the default program to run in new tabs/panes.
    -- Due to the way that ssh works, you cannot specify default_cwd,
    -- but you could instead change your default_prog to put you
    -- in a specific directory.
    default_prog = { 'fish' },

    -- assume that we can use syntax like:
    -- "env -C /some/where $SHELL"
    -- using whatever the default command shell is on this
    -- remote host, so that shell integration will respect
    -- the current directory on the remote host.
    assume_shell = 'Posix',
  },
}

config.default_domain = 'my.server'

You may now specify the round-trip latency threshold for enabling predictive local echo using local_echo_threshold_ms. If the measured round-trip latency between the wezterm client and the server exceeds the specified threshold, the client will attempt to predict the server's response to key events and echo the result of that prediction locally without waiting, hence hiding latency to the user. This option only applies when multiplexing = "WezTerm".

config.ssh_domains = {
  {
    name = 'my.server',
    remote_address = '192.168.1.1',
    local_echo_threshold_ms = 10,
  },
}

{{since('20221119-145034-49b9839f')}}

The lag indicator now defaults to disabled. It is recommended to display the lag information in your status bar using this example.

If you prefer to have the information overlaid on the content area, then you can set overlay_lag_indicator = true, but note that I'd like to remove that functionality in the future.

SpawnCommand

The SpawnCommand struct specifies information about a new command to be spawned.

It is a lua object with the following fields; all of the fields have reasonable defaults and can be omitted.

wezterm.action.SpawnCommandInNewWindow {
  -- An optional label.
  -- The label is only used for SpawnCommands that are listed in
  -- the `launch_menu` configuration section.
  -- If the label is omitted, a default will be produced based
  -- on the `args` field.
  label = 'List all the files!',

  -- The argument array specifying the command and its arguments.
  -- If omitted, the default program for the target domain will be
  -- spawned.
  args = { 'ls', '-al' },

  -- The current working directory to set for the command.
  -- If omitted, wezterm will infer a value based on the active pane
  -- at the time this action is triggered.  If the active pane
  -- matches the domain specified in this `SpawnCommand` instance
  -- then the current working directory of the active pane will be
  -- used.
  -- If the current working directory cannot be inferred then it
  -- will typically fall back to using the home directory of
  -- the current user.
  cwd = '/some/path',

  -- Sets addditional environment variables in the environment for
  -- this command invocation.
  set_environment_variables = {
    SOMETHING = 'a value',
  },

  -- Specifiy that the multiplexer domain of the currently active pane
  -- should be used to start this process.  This is usually what you
  -- want to happen and this is the default behavior if you omit
  -- the domain.
  domain = 'CurrentPaneDomain',

  -- Specify that the default multiplexer domain be used for this
  -- command invocation.  The default domain is typically the "local"
  -- domain, which spawns processes locally.  However, if you started
  -- wezterm using `wezterm connect` or `wezterm serial` then the default
  -- domain will not be "local".
  domain = 'DefaultDomain',

  -- Specify a named multiplexer domain that should be used to spawn
  -- this new command.
  -- This is useful if you want to assign a hotkey to always start
  -- a process in a remote multiplexer rather than based on the
  -- current pane.
  -- See the Multiplexing section of the docs for more on this topic.
  domain = { DomainName = 'my.server' },

  -- Since: 20230320-124340-559cb7b0
  -- Specify the initial position for a GUI window when this command
  -- is used in a context that will create a new window, such as with
  -- wezterm.mux.spawn_window, SpawnCommandInNewWindow
  position = {
    x = 10,
    y = 300,
    -- Optional origin to use for x and y.
    -- Possible values:
    -- * "ScreenCoordinateSystem" (this is the default)
    -- * "MainScreen" (the primary or main screen)
    -- * "ActiveScreen" (whichever screen hosts the active/focused window)
    -- * {Named="HDMI-1"} - uses a screen by name. See wezterm.gui.screens()
    -- origin = "ScreenCoordinateSystem"
  },
}

Time object

Represents a date and time that is tracked internally as UTC.

Using tostring() on a Time object will show the internally tracked UTC time information.

Available methods

Time:format(format)

{{since('20220807-113146-c2fee766')}}

Formats the time object as a string, using the local date/time representation of the time.

The format string supports the set of formatting placeholders described here.

> wezterm.time.now():format("%Y-%m-%d %H:%M:%S")
"2022-07-17 11:14:15"
> wezterm.time.now():format_utc("%Y-%m-%d %H:%M:%S")
"2022-07-17 18:14:15"

See also Time:format_utc().

Time:format_utc(format)

{{since('20220807-113146-c2fee766')}}

Formats the time object as a string, using UTC date/time representation of the time.

The format string supports the set of formatting placeholders described here.

> wezterm.time.now():format_utc("%Y-%m-%d %H:%M:%S")
"2022-07-17 18:14:15"
> wezterm.time.now():format("%Y-%m-%d %H:%M:%S")
"2022-07-17 11:14:15"

See also Time:format().

Time:sun_times(lat, lon)

{{since('20220807-113146-c2fee766')}}

For the date component of the time object, compute the times of the sun rise and sun set for the given latitude and longitude.

For the time component of the time object, compute whether the sun is currently up, and the progression of the sun through either the day or night.

Returns that information as a table:

> wezterm.time.now():sun_times(33.44, -112)
{
    "progression": 0.41843971631205673,
    "rise": "Time(utc: 2022-07-17T12:29:42.493449687+00:00)",
    "set": "Time(utc: 2022-07-18T02:36:40.776247739+00:00)",
    "up": true,
}

The example above computes the information for Phoenix, Arizona at the time this documentation was being written.

The sun is presently up (up == true) and is about 41% (progression=0.41843971631205673) of its way through the daylight portion of the day.

If the sun would be down at the time portion of the time object, then up == false and the progression would indicate the proportion of the way through the night.

This information is potentially useful if you want to vary color scheme or other configuration based on the time of day.

If the provided latitude and longitude specify a location at one of the poles, then the day or night may be longer than 24 hours. In that case rise and set will be nil, progression will be 0 and up will indicate if it is polar daytime (up==true) or polar night time (up == false).

TlsDomainClient

The TlsDomainClient struct specifies information about how to connect to a TLS Domain.

It is a lua object with the following fields:

config.tls_clients = {
  {
    -- The name of this specific domain.  Must be unique amongst
    -- all types of domain in the configuration file.
    name = 'server.name',

    -- If set, use ssh to connect, start the server, and obtain
    -- a certificate.
    -- The value is "user@host:port", just like "wezterm ssh" accepts.
    bootstrap_via_ssh = 'server.hostname',

    -- identifies the host:port pair of the remote server.
    remote_address = 'server.hostname:8080',

    -- the path to an x509 PEM encoded private key file.
    -- Omit this if you are using `bootstrap_via_ssh`.
    -- pem_private_key = "/some/path/key.pem",

    -- the path to an x509 PEM encoded certificate file
    -- Omit this if you are using `bootstrap_via_ssh`.
    -- pem_cert = "/some/path/cert.pem",

    -- the path to an x509 PEM encoded CA chain file
    -- Omit this if you are using `bootstrap_via_ssh`.
    -- pem_ca = "/some/path/ca.pem",

    -- A set of paths to load additional CA certificates.
    -- Each entry can be either the path to a directory or to a PEM encoded
    -- CA file.  If an entry is a directory, then its contents will be
    -- loaded as CA certs and added to the trust store.
    -- Omit this if you are using `bootstrap_via_ssh`.
    -- pem_root_certs = { "/some/path/ca1.pem", "/some/path/ca2.pem" },

    -- explicitly control whether the client checks that the certificate
    -- presented by the server matches the hostname portion of
    -- `remote_address`.  The default is true.  This option is made
    -- available for troubleshooting purposes and should not be used outside
    -- of a controlled environment as it weakens the security of the TLS
    -- channel.
    -- accept_invalid_hostnames = false,

    -- the hostname string that we expect to match against the common name
    -- field in the certificate presented by the server.  This defaults to
    -- the hostname portion of the `remote_address` configuration and you
    -- should not normally need to override this value.
    -- expected_cn = "other.name",

    -- If true, connect to this domain automatically at startup
    -- connect_automatically = false,

    -- Specify an alternate read timeout
    -- read_timeout = 60,

    -- Specify an alternate write timeout
    -- write_timeout = 60,

    -- The path to the wezterm binary on the remote host
    -- remote_wezterm_path = "/home/myname/bin/wezterm"
  },
}

{{since('20220319-142410-0fcdea07')}}

You may now specify the round-trip latency threshold for enabling predictive local echo using local_echo_threshold_ms. If the measured round-trip latency between the wezterm client and the server exceeds the specified threshold, the client will attempt to predict the server's response to key events and echo the result of that prediction locally without waiting, hence hiding latency to the user. This option only applies when multiplexing = "WezTerm".

config.tls_clients = {
  {
    name = 'server,name',
    bootstrap_via_ssh = 'server.hostname',
    remote_address = 'server.hostname:8080',
    local_echo_threshold_ms = 10,
  },
}

{{since('20221119-145034-49b9839f')}}

The lag indicator now defaults to disabled. It is recommended to display the lag information in your status bar using this example.

If you prefer to have the information overlaid on the content area, then you can set overlay_lag_indicator = true, but note that I'd like to remove that functionality in the future.

TlsDomainServer

The TlsDomainServer struct specifies information about how to define the server side of a TLS Domain.

It is a lua object with the following fields:

config.tls_servers = {
  {
    -- The address:port combination on which the server will listen
    -- for client connections
    bind_address = 'server.hostname:8080',

    -- the path to an x509 PEM encoded private key file.
    -- You can omit this if your tls_client is using bootstrap_via_ssh.
    -- pem_private_key = "/path/to/key.pem",

    -- the path to an x509 PEM encoded certificate file.
    -- You can omit this if your tls_client is using bootstrap_via_ssh.
    -- pem_cert = "/path/to/cert.pem",

    -- the path to an x509 PEM encoded CA chain file.
    -- You can omit this if your tls_client is using bootstrap_via_ssh.
    -- pem_ca = "/path/to/chain.pem",

    -- A set of paths to load additional CA certificates.
    -- Each entry can be either the path to a directory
    -- or to a PEM encoded CA file.  If an entry is a directory,
    -- then its contents will be loaded as CA certs and added
    -- to the trust store.
    -- You can omit this if your tls_client is using bootstrap_via_ssh.
    -- pem_root_certs = { "/some/path/ca1.pem", "/some/path/ca2.pem" },
  },
}

Pane object


{{since('20221119-145034-49b9839f')}}

In previous releases there were separate MuxPane and Pane objects created by the mux and gui layers, respectively. This is no longer the case: there is now just the underlying mux pane which is referred to in these docs as Pane for the sake of simplicity.

A Pane object is typically passed to your code via an event callback. A Pane object is a handle to a live instance of a Pane that is known to the wezterm process. A Pane object tracks the pseudo terminal (or real serial terminal) and associated process(es) and the parsed screen and scrollback.

A Pane object can be used to send input to the associated processes and introspect the state of the terminal emulation for that pane.

Available methods

pane:activate()

{{since('20230408-112425-69ae8472')}}

Activates (focuses) the pane and its containing tab.

pane:get_current_working_dir()

{{since('20201031-154415-9614e117')}}

Returns the current working directory of the pane, if known. The current directory can be specified by an application sending OSC 7.

If OSC 7 was never sent to a pane, and the pane represents a locally spawned process, then wezterm will:

  • On Unix systems, determie the process group leader attached to the PTY
  • On Windows systems, use heuristics to infer an equivalent to the foreground process

With the process identified, wezterm will then try to determine the current working directory using operating system dependent code:

OSSupported?
macOSYes, {{since('20201031-154415-9614e117', inline=True)}}
LinuxYes, {{since('20201031-154415-9614e117', inline=True)}}
WindowsYes, {{since('20220101-133340-7edc5b5a', inline=True)}}

If the current working directory is not known then this method returns nil. Otherwise, it returns the current working directory as a URI string.

Note that while the current working directory is usually a file path, it is possible for an application to set it to an FTP URL or some other kind of URL, which is why this method doesn't simply return a file path string.

{{since('20240127-113634-bbcac864')}}

This method now returns a Url object which provides a convenient way to decode and operate on the URL.

pane:get_cursor_position()

{{since('20201031-154415-9614e117')}}

Returns a lua representation of the StableCursorPosition struct that identifies the cursor position, visibility and shape.

It has the following fields:

  • x the horizontal cell index
  • y the vertical stable row index
  • shape the CursorShape enum value
  • visibility the CursorVisibility enum value

pane:get_dimensions()

{{since('20201031-154415-9614e117')}}

Returns a lua representation of the RenderableDimensions struct that identifies the dimensions and position of the viewport as well as the scrollback for the pane.

It has the following fields:

  • cols the number of columns
  • viewport_rows the number of vertical cells in the visible portion of the window
  • scrollback_rows the total number of lines in the scrollback and viewport
  • physical_top the top of the physical non-scrollback screen expressed as a stable index.
  • scrollback_top the top of the scrollback; the earliest row remembered by wezterm.

pane:get_domain_name()

{{since('20220624-141144-bd1b7c5d')}}

Returns the name of the domain with which the pane is associated.

pane:get_foreground_process_info()

{{since('20220624-141144-bd1b7c5d')}}

Returns a LocalProcessInfo object corresponding to the current foreground process that is running in the pane.

This method has some restrictions and caveats:

  • This information is only available for local panes. Multiplexer panes do not report this information. Similarly, if you are using eg: ssh to connect to a remote host, you won't be able to access the name of the remote process that is running.
  • On unix systems, the process group leader (the foreground process) will be queried, but that concept doesn't exist on Windows, so instead, the process tree of the originally spawned program is examined, and the most recently spawned descendant is assumed to be the foreground process
  • On Linux, macOS and Windows, the process can be queried to determine this path. Other operating systems (notably, FreeBSD and other unix systems) are not currently supported
  • Querying the path may fail for a variety of reasons outside of the control of WezTerm
  • Querying process information has some runtime overhead, which may cause wezterm to slow down if over-used.

If the process cannot be determined then this method returns nil.

This example sets the right status to show the process id and executable path:

local wezterm = require 'wezterm'

-- Equivalent to POSIX basename(3)
-- Given "/foo/bar" returns "bar"
-- Given "c:\\foo\\bar" returns "bar"
function basename(s)
  return string.gsub(s, '(.*[/\\])(.*)', '%2')
end

wezterm.on('update-right-status', function(window, pane)
  local info = pane:get_foreground_process_info()
  if info then
    window:set_right_status(
      tostring(info.pid) .. ' ' .. basename(info.executable)
    )
  else
    window:set_right_status ''
  end
end)

return {}

pane:get_foreground_process_name()

{{since('20220101-133340-7edc5b5a')}}

Returns the path to the executable image for the pane.

This method has some restrictions and caveats:

  • This information is only available for local panes. Multiplexer panes do not report this information. Similarly, if you are using eg: ssh to connect to a remote host, you won't be able to access the name of the remote process that is running.
  • On unix systems, the process group leader (the foreground process) will be queried, but that concept doesn't exist on Windows, so instead, the process tree of the originally spawned program is examined, and the most recently spawned descendant is assumed to be the foreground process
  • On Linux, macOS and Windows, the process can be queried to determine this path. Other operating systems (notably, FreeBSD and other unix systems) are not currently supported
  • Querying the path may fail for a variety of reasons outside of the control of WezTerm
  • Querying process information has some runtime overhead, which may cause wezterm to slow down if over-used.

If the path is not known then this method returns nil.

This example sets the right status to the executable path:

local wezterm = require 'wezterm'

-- Equivalent to POSIX basename(3)
-- Given "/foo/bar" returns "bar"
-- Given "c:\\foo\\bar" returns "bar"
function basename(s)
  return string.gsub(s, '(.*[/\\])(.*)', '%2')
end

wezterm.on('update-right-status', function(window, pane)
  window:set_right_status(basename(pane:get_foreground_process_name()))
end)

return {}

See also: get_foreground_process_info

pane:get_lines_as_escapes([nlines])

{{since('20240127-113634-bbcac864')}}

Returns the textual representation (including color and other attributes) of the physical lines of text in the viewport as a string with embedded ANSI escape sequences to preserve the color and style of the text.

A physical line is a possibly-wrapped line that composes a row in the terminal display matrix.

If the optional nlines argument is specified then it is used to determine how many lines of text should be retrieved. The default (if nlines is not specified) is to retrieve the number of lines in the viewport (the height of the pane).

To obtain the entire scrollback, you can do something like this:

pane:get_lines_as_escapes(pane:get_dimensions().scrollback_rows)

Example: opening scrollback in a pager

local wezterm = require 'wezterm'
local io = require 'io'
local os = require 'os'
local act = wezterm.action

wezterm.on('trigger-less-with-scrollback', function(window, pane)
  -- Retrieve the current pane's text
  local text =
    pane:get_lines_as_escapes(pane:get_dimensions().scrollback_rows)

  -- Create a temporary file to pass to the pager
  local name = os.tmpname()
  local f = io.open(name, 'w+')
  f:write(text)
  f:flush()
  f:close()

  -- Open a new window running less and tell it to open the file
  window:perform_action(
    act.SpawnCommandInNewWindow {
      args = { 'less', '-fr', name },
    },
    pane
  )

  -- Wait "enough" time for less to read the file before we remove it.
  -- The window creation and process spawn are asynchronous wrt. running
  -- this script and are not awaitable, so we just pick a number.
  --
  -- Note: We don't strictly need to remove this file, but it is nice
  -- to avoid cluttering up the temporary directory.
  wezterm.sleep_ms(1000)
  os.remove(name)
end)

return {
  keys = {
    {
      key = 'E',
      mods = 'CTRL',
      action = act.EmitEvent 'trigger-less-with-scrollback',
    },
  },
}

See also: pane:get_lines_as_text().

pane:get_lines_as_text([nlines])

{{since('20201031-154415-9614e117')}}

Returns the textual representation (not including color or other attributes) of the physical lines of text in the viewport as a string.

A physical line is a possibly-wrapped line that composes a row in the terminal display matrix. If you'd rather operate on logical lines, see pane:get_logical_lines_as_text.

If the optional nlines argument is specified then it is used to determine how many lines of text should be retrieved. The default (if nlines is not specified) is to retrieve the number of lines in the viewport (the height of the pane).

The lines have trailing space removed from each line. The lines will be joined together in the returned string separated by a \n character. Trailing blank lines are stripped, which may result in fewer lines being returned than you might expect if the pane only had a couple of lines of output.

Example: opening whole scrollback in vim

In the following example, a key is assigned to capture the entire scrollback and visible area of the active pane, write it to a file and then open that file in the vim editor:

local wezterm = require 'wezterm'
local io = require 'io'
local os = require 'os'
local act = wezterm.action

wezterm.on('trigger-vim-with-scrollback', function(window, pane)
  -- Retrieve the text from the pane
  local text = pane:get_lines_as_text(pane:get_dimensions().scrollback_rows)

  -- Create a temporary file to pass to vim
  local name = os.tmpname()
  local f = io.open(name, 'w+')
  f:write(text)
  f:flush()
  f:close()

  -- Open a new window running vim and tell it to open the file
  window:perform_action(
    act.SpawnCommandInNewWindow {
      args = { 'vim', name },
    },
    pane
  )

  -- Wait "enough" time for vim to read the file before we remove it.
  -- The window creation and process spawn are asynchronous wrt. running
  -- this script and are not awaitable, so we just pick a number.
  --
  -- Note: We don't strictly need to remove this file, but it is nice
  -- to avoid cluttering up the temporary directory.
  wezterm.sleep_ms(1000)
  os.remove(name)
end)

return {
  keys = {
    {
      key = 'E',
      mods = 'CTRL',
      action = act.EmitEvent 'trigger-vim-with-scrollback',
    },
  },
}

See also: pane:get_lines_as_escapes().

pane:get_logical_lines_as_text([nlines])

{{since('20220101-133340-7edc5b5a')}}

Returns the textual representation (not including color or other attributes) of the logical lines of text in the viewport as a string.

A logical line is an original input line prior to being wrapped into physical lines to composes rows in the terminal display matrix. WezTerm doesn't store logical lines, but can recompute them from metadata stored in physical lines. Excessively long logical lines are force-wrapped to constrain the cost of rewrapping on resize and selection operations.

If you'd rather operate on physical lines, see pane:get_lines_as_text.

If the optional nlines argument is specified then it is used to determine how many lines of text should be retrieved. The default (if nlines is not specified) is to retrieve the number of lines in the viewport (the height of the pane).

The lines have trailing space removed from each line. The lines will be joined together in the returned string separated by a \n character. Trailing blank lines are stripped, which may result in fewer lines being returned than you might expect if the pane only had a couple of lines of output.

To obtain the entire scrollback, you can do something like this:

pane:get_logical_lines_as_text(pane:get_dimensions().scrollback_rows)

pane:get_metadata()

{{since('20220903-194523-3bb1ed61')}}

Returns metadata about a pane. The return value depends on the instance of the underlying pane. If the pane doesn't support this method, nil will be returned. Otherwise, the value is a lua table with the metadata contained in table fields.

To consume this value, it is recommend to use logic like this to obtain a table value even if the pane doesn't support this method:

local meta = pane:get_metadata() or {}

The following metadata keys may be present:

password_input

A boolean value that is populated only for local panes. It is set to true if it appears as though the local PTY is configured for password entry (local echo disabled, canonical input mode enabled).

This example demonstrates how to change the color scheme to exaggerate when a password is being input:

local wezterm = require 'wezterm'

wezterm.on('update-status', function(window, pane)
  local meta = pane:get_metadata() or {}
  local overrides = window:get_config_overrides() or {}
  if meta.password_input then
    overrides.color_scheme = 'Red Alert'
  else
    overrides.color_scheme = nil
  end
  window:set_config_overrides(overrides)
end)

return {}

is_tardy

A boolean value that is populated only for multiplexer client panes. It is set to true if wezterm is waiting for a response from the multiplexer server.

This can be used in conjunction with since_last_response_ms below.

since_last_response_ms

An integer value that is populated only for multiplexer client panes. It is set to the number of elapsed milliseconds since the most recent response from the multiplexer server.

This example shows how to put mux latency information into the status area:

local wezterm = require 'wezterm'

wezterm.on('update-status', function(window, pane)
  local meta = pane:get_metadata() or {}
  if meta.is_tardy then
    local secs = meta.since_last_response_ms / 1000.0
    window:set_right_status(string.format('tardy: %5.1fs⏳', secs))
  end
end)

return {}

pane:get_title()

{{since('nightly')}}

Returns the progress state associated with the pane.

By default, when the terminal is reset, the progress state will be "None" to indicate that no progress has been reported.

An application can use the ConEmu style progress report OSC sequence to alter the progress state, which has the following form:

ESC ] 9 ; 4 ; st ; pr ST

When st is:

  • 0: set progress to "None"
  • 1: set progress value to pr (number, 0-100). Reported as {Percentage = pr}
  • 2: set error state in progress, pr is optional and will be assumed 0 if omitted. Reported as {Error = pr}
  • 3: set indeterminate state. Reported as "Indeterminate"
  • 4: set paused state, pr is optional. Not supported by WezTerm

When the progress OSC is processed, the state is captured, and if it has changed, WezTerm will trigger an update of the tab bar, which will in turn cause events such as format-tab-title to trigger.

The progress information is not directly used by wezterm, but you can access it from lua to style tabs differently according to progress. For example, the following will prefix the tab with the progress percentage expressed using Nerd Fonts circle symbols and adjust its color based on whether it is success or error progress:

local wezterm = require 'wezterm'

local function tab_title(tab_info)
  local title = tab_info.tab_title
  -- if the tab title is explicitly set, take that
  if title and #title > 0 then
    return title
  end
  -- Otherwise, use the title from the active pane
  -- in that tab
  return tab_info.active_pane.title
end

local PCT_GLYPHS = {
  wezterm.nerdfonts.md_circle_slice_1,
  wezterm.nerdfonts.md_circle_slice_2,
  wezterm.nerdfonts.md_circle_slice_3,
  wezterm.nerdfonts.md_circle_slice_4,
  wezterm.nerdfonts.md_circle_slice_5,
  wezterm.nerdfonts.md_circle_slice_6,
  wezterm.nerdfonts.md_circle_slice_7,
  wezterm.nerdfonts.md_circle_slice_8,
}
local function pct_glyph(pct)
  local slot = math.floor(pct / 12)
  return PCT_GLYPHS[slot + 1]
end

wezterm.on(
  'format-tab-title',
  function(tab, tabs, panes, config, hover, max_width)
    local progress = tab.active_pane.progress or 'None'
    local title = tab_title(tab)
    local elements = {
      { Text = string.format('%d: ', tab.tab_index + 1) },
    }

    if progress ~= 'None' then
      local color = 'green'
      local status
      if progress.Percentage ~= nil then
        -- status = string.format("%d%%", progress.Percentage)
        status = pct_glyph(progress.Percentage)
      elseif progress.Error ~= nil then
        -- status = string.format("%d%%", progress.Error)
        status = pct_glyph(progress.Error)
        color = 'red'
      elseif progress == 'Indeterminate' then
        status = '~'
      else
        status = wezterm.serde.json_encode(progress)
      end

      table.insert(elements, { Foreground = { Color = color } })
      table.insert(elements, { Text = status })
      table.insert(elements, { Foreground = 'Default' })
    end

    table.insert(elements, { Text = ' ' .. title .. ' ' })

    return elements
  end
)

return wezterm.config_builder()

pane:get_semantic_zone_at(x, y)

{{since('20230320-124340-559cb7b0')}}

Resolves the semantic zone that encapsulates the supplied x and y coordinates.

x is the cell column index, where 0 is the left-most column. y is the stable row index.

Use pane:get_dimensions() to retrieve the currently valid stable index values for the top of scrollback and top of viewport.

-- If you have shell integration configured, returns the zone around
-- the current cursor position
function get_zone_around_cursor(pane)
  local cursor = pane:get_cursor_position()
  -- using x-1 here because the cursor may be one cell outside the zone
  local zone = pane:get_semantic_zone_at(cursor.x - 1, cursor.y)
  if zone then
    return pane:get_text_from_semantic_zone(zone)
  end
  return nil
end

See Shell Integration for more information about semantic zones.

pane:get_semantic_zones([zone_type])

{{since('20230320-124340-559cb7b0')}}

When zone_type is omitted, returns the list of all semantic zones defined in the pane.

When zone_type is supplied, returns the list of all semantic zones of the matching type.

Value values for zone_type are:

  • "Prompt"
  • "Input"
  • "Output"

See Shell Integration for more information about semantic zones.

pane:get_text_from_region(start_x, start_y, end_x, end_y)

{{since('20230320-124340-559cb7b0')}}

Returns the text from the specified region.

  • start_x and end_x are the starting and ending cell column, where 0 is the left-most cell
  • start_y and end_y are the starting and ending row, expressed as a stable row index. Use pane:get_dimensions() to retrieve the currently valid stable index values for the top of scrollback and top of viewport.

The text within the region is unwrapped to its logical line representation, rather than the wrapped-to-physical-display-width.

pane:get_text_from_semantic_zone(zone)

{{since('20230320-124340-559cb7b0')}}

This is a convenience method that calls pane:get_text_from_region() on the supplied zone parameter.

Use pane:get_semantic_zone_at() or pane:get_semantic_zones() to obtain a zone.

See Shell Integration for more information about semantic zones.

pane:get_title()

{{since('20201031-154415-9614e117')}}

Returns the title of the pane. This will typically be wezterm by default but can be modified by applications that send OSC 1 (Icon/Tab title changing) and/or OSC 2 (Window title changing) escape sequences.

The value returned by this method is the same as that used to display the tab title if this pane were the only pane in the tab; if OSC 1 was used to set a non-empty string then that string will be returned. Otherwise the value for OSC 2 will be returned.

Note that on Microsoft Windows the default behavior of the OS level PTY is to implicitly send OSC 2 sequences to the terminal as new programs attach to the console.

If the title text is wezterm and the pane is a local pane, then wezterm will attempt to resolve the executable path of the foreground process that is associated with the pane and will use that instead of wezterm.

pane:get_tty_name()

{{since('20230408-112425-69ae8472')}}

Returns the tty device name, or nil if the name is unavailable.

  • This information is only available for local panes. Multiplexer panes do not report this information. Similarly, if you are using eg: ssh to connect to a remote host, you won't be able to access the name of the remote process that is running.
  • This information is only available on unix systems. Windows systems do not have an equivalent concept.

This example sets the right status to show the tty name:

local wezterm = require 'wezterm'

wezterm.on('update-status', function(window, pane)
  local tty = pane:get_tty_name()
  if tty then
    window:set_right_status(tty)
  else
    window:set_right_status ''
  end
end)

return {}

pane:get_user_vars()

{{since('20210502-130208-bff6815d')}}

Returns a table holding the user variables that have been assigned to this pane.

User variables are set using an escape sequence defined by iterm2, but also recognized by wezterm; this example sets the foo user variable to the value bar:

# This function emits an OSC 1337 sequence to set a user var
# associated with the current terminal pane.
# It requires the `base64` utility to be available in the path.
# This function is included in the wezterm shell integration script, but
# is reproduced here for clarity
__wezterm_set_user_var() {
  if hash base64 2>/dev/null ; then
    if [[ -z "${TMUX}" ]] ; then
      printf "\033]1337;SetUserVar=%s=%s\007" "$1" `echo -n "$2" | base64`
    else
      # <https://github.com/tmux/tmux/wiki/FAQ#what-is-the-passthrough-escape-sequence-and-how-do-i-use-it>
      # Note that you ALSO need to add "set -g allow-passthrough on" to your tmux.conf
      printf "\033Ptmux;\033\033]1337;SetUserVar=%s=%s\007\033\\" "$1" `echo -n "$2" | base64`
    fi
  fi
}

__wezterm_set_user_var "foo" "bar"

you're then able to access this in your wezterm config:

wezterm.log_info('foo var is ' .. pane:get_user_vars().foo)

Setting a user var will generate events in the window that contains the corresponding pane:

  • user-var-changed, which allows you to directly take action when a var is set/changed.
  • update-status which allows you to update left/right status items
  • the title and tab bar area will then update and trigger any associated events as part of that update

The user var change event will propagate to all connected multiplexer clients.

pane:has_unseen_output()

{{since('20220319-142410-0fcdea07')}}

Returns true if there has been output in the pane since the last time the time the pane was focused.

See also PaneInformation.has_unseen_output for an example using equivalent information to color tabs based on this state.

pane:inject_output(text)

{{since('20221119-145034-49b9839f')}}

Sends text, which may include escape sequences, to the output side of the current pane. The text will be evaluated by the terminal emulator and can thus be used to inject/force the terminal to process escape sequences that adjust the current mode, as well as sending human readable output to the terminal.

Note that if you move the cursor position as a result of using this method, you should expect the display to change and for text UI programs to get confused.

In this contrived and useless example, pressing ALT-k will output hello there in italics to the current pane:

local wezterm = require 'wezterm'

return {
  keys = {
    {
      key = 'k',
      mods = 'ALT',
      action = wezterm.action_callback(function(window, pane)
        pane:inject_output '\r\n\x1b[3mhello there\r\n'
      end),
    },
  },
}

Not all panes support this method; at the time of writing, this works for local panes but not for multiplexer panes.

pane:is_alt_screen_active()

{{since('20220807-113146-c2fee766')}}

Returns whether the alternate screen is active for the pane.

The alternate screen is a secondary screen that is activated by certain escape codes. The alternate screen has no scrollback, which makes it ideal for a "full-screen" terminal program like vim or less to do whatever they want on the screen without fear of destroying the user's scrollback. Those programs emit escape codes to return to the normal screen when they exit.

pane:move_to_new_tab()

{{since('20230326-111934-3666303c')}}

Creates a new tab in the window that contains pane, and moves pane into that tab.

Returns the newly created MuxTab object, and the MuxWindow object that contains it:

config.keys = {
  {
    key = '!',
    mods = 'LEADER | SHIFT',
    action = wezterm.action_callback(function(win, pane)
      local tab, window = pane:move_to_new_tab()
    end),
  },
}

See also pane:move_to_new_window(), wezterm cli move-pane-to-new-tab.

pane:move_to_new_window([WORKSPACE])

{{since('20230326-111934-3666303c')}}

Creates a window and moves pane into that window.

The WORKSPACE parameter is optional; if specified, it will be used as the name of the workspace that should be associated with the new window. Otherwise, the current active workspace will be used.

Returns the newly created MuxTab object, and the newly created MuxWindow object.

config.keys = {
  {
    key = '!',
    mods = 'LEADER | SHIFT',
    action = wezterm.action_callback(function(win, pane)
      local tab, window = pane:move_to_new_window()
    end),
  },
}

See also pane:move_to_new_window(), wezterm cli move-pane-to-new-tab.

pane:mux_pane()

{{since('20220807-113146-c2fee766')}}

Deprecated Since: 20221119-145034-49b9839f

Returns the MuxPane representation of this pane.

In nightly versions of wezterm, there is no longer a distinction between gui and mux representations of panes, so this method returns itself.

pane:pane_id()

{{since('20201031-154415-9614e117')}}

Returns the id number for the pane. The Id is used to identify the pane within the internal multiplexer and can be used when making API calls via wezterm cli to indicate the subject of manipulation.

pane:paste(text)

{{since('20201031-154415-9614e117')}}

Sends the supplied text string to the input of the pane as if it were pasted from the clipboard, except that the clipboard is not involved.

If the terminal attached to the pane is set to bracketed paste mode then the text will be sent as a bracketed paste.

Otherwise the string will be streamed into the input in chunks of approximately 1KB each.

pane:send_paste(text)

{{since('20220624-141144-bd1b7c5d')}}

Sends text to the pane as though it was pasted. If bracketed paste mode is enabled then the text will be sent as a bracketed paste. Otherwise, it will be sent as-is.

pane:send_text(text)

{{since('20220624-141144-bd1b7c5d')}}

Sends text to the pane as-is.

pane:split{}

{{since('20220624-141144-bd1b7c5d')}}

Splits pane and spawns a program into the split, returning the Pane object associated with it:

local new_pane = pane:split {}

When no arguments are passed, the pane is split in half left/right and the right half has the default program spawned into it.

The following parameters are supported:

args

Specifies the argument array for the command that should be spawned. If omitted the default program for the domain will be spawned.

pane:split { args = { 'top' } }

cwd

Specify the current working directory that should be used for the program.

If unspecified, follows the rules from default_cwd

pane:split { cwd = '/tmp' }

set_environment_variables

Sets additional environment variables in the environment for this command invocation.

pane:split { set_environment_variables = { FOO = 'BAR' } }

domain

Specifies the multiplexer domain into which the program should be spawned. The default value is assumed to be "CurrentPaneDomain", which causes the default domain to be used.

You may specify the name of one of the multiplexer domains defined in your configuration using the following:

pane:split { domain = { DomainName = 'my.name' } }

Or you may use the default domain:

pane:split { domain = 'DefaultDomain' }

direction

Specifies where the new pane should be placed. Possible values are:

  • "Right" - splits the pane left/right and places the new pane on the right.
  • "Left" - splits the pane left/right and places the new pane on the left.
  • "Top" - splits the pane top/bottom and places the new pane on the top.
  • "Bottom" - splits the pane top/bottom and places the new pane on the bottom.
pane:split { direction = 'Top' }

top_level

If true, rather than splitting pane in half, the tab that contains it is split and the new pane runs the full extent of the tab dimensions.

pane:split { direction = 'Bottom', top_level = true }

size

Controls the size of the new pane.

Numeric values less than 1.0 are used to express a fraction of the available space; 0.5 means 50% of the available space, for example.

Numeric values greater or equal to 1 are used to specify the number of cells.

The default value is 0.5.

This creates two additional splits within pane, creating three total splits that each occupy 1/3 of the available space:

pane:split { direction = 'Top', size = 0.333 }
pane:split { direction = 'Top', size = 0.5 }

pane:tab()

{{since('20220807-113146-c2fee766')}}

Returns the MuxTab that contains this pane.

Note that this method can return nil when pane is a GUI-managed overlay pane (such as the debug overlay), because those panes are not managed by the mux layer.

pane:window()

{{since('20220807-113146-c2fee766')}}

Returns the MuxWindow that contains the tab that contains this pane.

Window object

A Window object cannot be created in lua code; it is typically passed to your code via an event callback. A Window object is a handle to a GUI TermWindow running in the wezterm process.

Available methods

window:active_key_table()

{{since('20220408-101518-b908e2dd')}}

Returns a string holding the top of the current key table activation stack, or nil if the stack is empty.

See Key Tables for a detailed example.

window:active_pane()

{{since('20221119-145034-49b9839f')}}

A convenience accessor for returning the active pane in the active tab of the GUI window.

This is similar to mux_window:active_pane() but, because it operates at the GUI layer, it can return Pane objects for special overlay panes that are not visible to the mux layer of the API.

window:active_tab()

{{since('20230408-112425-69ae8472')}}

A convenience accessor for returning the active tab within the window.

In earlier versions of wezterm, you could obtain this via:

function active_tab_for_gui_window(gui_window)
  for _, item in ipairs(gui_window:mux_window():tabs_with_info()) do
    if item.is_active then
      return item.tab
    end
  end
end

window:active_workspace()

{{since('20220319-142410-0fcdea07')}}

Returns the name of the active workspace.

This example demonstrates using the launcher menu to select and create workspaces, and how the workspace can be shown in the right status area.

local wezterm = require 'wezterm'

wezterm.on('update-right-status', function(window, pane)
  window:set_right_status(window:active_workspace())
end)

return {
  keys = {
    {
      key = '9',
      mods = 'ALT',
      action = wezterm.action.ShowLauncherArgs { flags = 'FUZZY|WORKSPACES' },
    },
  },
}

window:composition_status()

{{since('20220319-142410-0fcdea07')}}

Returns a string holding the current dead key or IME composition text, or nil if the input layer is not in a composition state.

This is the same text that is shown at the cursor position when composing.

This example shows how to show the composition status in the status area. The cursor color is also changed to orange when in this state.

local wezterm = require 'wezterm'

wezterm.on('update-right-status', function(window, pane)
  local compose = window:composition_status()
  if compose then
    compose = 'COMPOSING: ' .. compose
  end
  window:set_right_status(compose or '')
end)

return {
  colors = {
    compose_cursor = 'orange',
  },
}

See also: window:leader_is_active().

window:copy_to_clipboard(text [,clipboard])

{{since('20220807-113146-c2fee766')}}

Puts text into the specified clipboard.

Clipboard can be one of:

  • "Clipboard" - the system clipboard
  • "PrimarySelection" - the primary selection buffer (applicable to X11 and some Wayland systems only)
  • "ClipboardAndPrimarySelection" - both the system clipboard and the primary selection. This is the default if you don't specify the clipboard.

Note that updating the clipboard is asynchronous; this method will return immediately while the clipboard is updated a few moments later in another thread. If you need to ensure that the published text is visible to other applications before you trigger some other action in your lua code then you may need to add a short sleep to allow for that to complete.

window:copy_to_clipboard 'put this text in the clipboard and primary selection!'
window:copy_to_clipboard('put me in the clipboard only', 'Clipboard')
window:copy_to_clipboard(
  'put me in the primary selection',
  'PrimarySelection'
)

window:current_event()

{{since('20220807-113146-c2fee766')}}

Returns the current event. For now only implemented for mouse events.

This example prints the delta scroll value when you scroll up with your mouse wheel while holding CTRL:

local wezterm = require 'wezterm'

return {
  mouse_bindings = {
    {
      event = { Down = { streak = 1, button = { WheelUp = 1 } } },
      mods = 'CTRL',
      action = wezterm.action_callback(function(window, pane)
        -- note that you want `WheelDown` for a `WheelDown` event
        local delta = window:current_event().Down.button.WheelUp
        wezterm.log_info('delta is: ' .. delta)
      end),
    },
  },
}

window:effective_config()

{{since('20210314-114017-04b7cedd')}}

Returns a lua table representing the effective configuration for the Window. The table is in the same format as that used to specify the config in the wezterm.lua file, but represents the fully-populated state of the configuration, including any CLI or per-window configuration overrides.

Note: changing the config table will NOT change the effective window config; it is just a copy of that information.

If you want to change the configuration in a window, look at set_config_overrides.

This example will log the configured font size when CTRL-SHIFT-E is pressed:

local wezterm = require 'wezterm'

wezterm.on('show-font-size', function(window, pane)
  wezterm.log_error(window:effective_config().font_size)
end)

return {
  keys = {
    {
      key = 'E',
      mods = 'CTRL',
      action = wezterm.action.EmitEvent 'show-font-size',
    },
  },
}

window:focus()

{{since('20230320-124340-559cb7b0')}}

Attempts to focus and activate the window.

OSSupported?
macOSYes
WindowsYes
X11Yes
WaylandWayland does not allow this action

window:get_appearance()

NOTE: You probably want to use wezterm.gui.get_appearance() instead, as it is easier to use!

{{since('20210814-124438-54e29167')}}

This method returns the appearance of the window environment. The appearance can be one of the following 4 values:

  • "Light" - the normal appearance, with dark text on a light background
  • "Dark" - "dark mode", with predominantly dark colors and probably a lighter, lower contrasting, text color on a dark background
  • "LightHighContrast" - light mode but with high contrast colors (not reported on all systems)
  • "DarkHighContrast" - dark mode but with high contrast colors (not reported on all systems)

wezterm is able to detect when the appearance has changed and will generate a window-config-reloaded event for each window.

This example configuration shows how you can have your color scheme automatically adjust to the current appearance:

local wezterm = require 'wezterm'

function scheme_for_appearance(appearance)
  if appearance:find 'Dark' then
    return 'Builtin Solarized Dark'
  else
    return 'Builtin Solarized Light'
  end
end

wezterm.on('window-config-reloaded', function(window, pane)
  local overrides = window:get_config_overrides() or {}
  local appearance = window:get_appearance()
  local scheme = scheme_for_appearance(appearance)
  if overrides.color_scheme ~= scheme then
    overrides.color_scheme = scheme
    window:set_config_overrides(overrides)
  end
end)

return {}

Wayland GNOME Appearance

{{since('20220807-113146-c2fee766')}}

wezterm uses XDG Desktop Portal to determine the appearance.

In earlier versions you may wish to use an alternative method to determine the appearance, as wezterm didn't know how to interrogate the appearance on Wayland systems, and would always report "Light".

The GNOME desktop environment provides the gsettings tool that can inform us of the selected appearance even in a Wayland session. We can substitute the call to window:get_appearance above with a call to the following function, which takes advantage of this:

function query_appearance_gnome()
  local success, stdout = wezterm.run_child_process {
    'gsettings',
    'get',
    'org.gnome.desktop.interface',
    'gtk-theme',
  }
  -- lowercase and remove whitespace
  stdout = stdout:lower():gsub('%s+', '')
  local mapping = {
    highcontrast = 'LightHighContrast',
    highcontrastinverse = 'DarkHighContrast',
    adwaita = 'Light',
    ['adwaita-dark'] = 'Dark',
  }
  local appearance = mapping[stdout]
  if appearance then
    return appearance
  end
  if stdout:find 'dark' then
    return 'Dark'
  end
  return 'Light'
end

Since WezTerm will not fire a window-config-reloaded event on Wayland for older versions of wezterm, you will instead need to listen on the update-right-status event, which will essentially poll for the appearance periodically:

local wezterm = require 'wezterm'

function scheme_for_appearance(appearance)
  if appearance:find 'Dark' then
    return 'Builtin Solarized Dark'
  else
    return 'Builtin Solarized Light'
  end
end

wezterm.on('update-right-status', function(window, pane)
  local overrides = window:get_config_overrides() or {}
  local appearance = query_appearance_gnome()
  local scheme = scheme_for_appearance(appearance)
  if overrides.color_scheme ~= scheme then
    overrides.color_scheme = scheme
    window:set_config_overrides(overrides)
  end
end)

return {}

window:get_config_overrides()

{{since('20210314-114017-04b7cedd')}}

Returns a copy of the current set of configuration overrides that is in effect for the window.

See set_config_overrides for examples!

window:get_dimensions()

{{since('20210314-114017-04b7cedd')}}

Returns a Lua table representing the dimensions for the Window.

The table has the following fields:

  • pixel_width: the width of the window in pixels
  • pixel_height: the height of the window in pixels
  • dpi: The DPI of the screen the window in on
  • is_full_screen: whether the window is in full screen mode

window:get_selection_escapes_for_pane(pane)

{{since('20220807-113146-c2fee766')}}

Returns the text that is currently selected within the specified pane within the specified window formatted with the escape sequences necessary to reproduce the same colors and styling .

This is the same text that window:get_selection_text_for_pane() would return, except that it includes escape sequences.

This example copies the current selection + escapes to the clipboard when CTRL+SHIFT+E is pressed:

local wezterm = require 'wezterm'

return {
  keys = {
    {
      key = 'E',
      mods = 'CTRL',
      action = wezterm.action_callback(function(window, pane)
        local ansi = window:get_selection_escapes_for_pane(pane)
        window:copy_to_clipboard(ansi)
      end),
    },
  },
}

See also: window:copy_to_clipboard().

window:get_selection_text_for_pane(pane)

{{since('20210404-112810-b63a949d')}}

Returns the text that is currently selected within the specified pane within the specified window. This is the same text that would be copied to the clipboard if the CopyTo action were to be performed.

Why isn't this simply a method of the pane object? The reason is that the selection is an attribute of the containing window, and a given pane can potentially be mapped into multiple windows.

This example logs the current selection when a CTRL+SHIFT+E is pressed:

local wezterm = require 'wezterm'

wezterm.on('log-selection', function(window, pane)
  local sel = window:get_selection_text_for_pane(pane)
  wezterm.log_info('selection is: ' .. sel)
end)

return {
  keys = {
    {
      key = 'E',
      mods = 'CTRL',
      action = wezterm.action.EmitEvent 'log-selection',
    },
  },
}

wezterm:is_focused()

{{since('20221119-145034-49b9839f')}}

Returns true if the window has focus.

The update-status event is fired when the focus state changes.

This example changes the color scheme based on the focus state:

local wezterm = require 'wezterm'

wezterm.on('update-status', function(window, pane)
  local overrides = window:get_config_overrides() or {}
  if window:is_focused() then
    overrides.color_scheme = 'nordfox'
  else
    overrides.color_scheme = 'nightfox'
  end
  window:set_config_overrides(overrides)
end)

return {}

window:keyboard_modifiers()

{{since('20230712-072601-f4abf8fd')}}

Returns two values; the keyboard modifiers and the key status leds.

Both values are exposed to lua as strings with |-delimited values representing the various modifier keys and keyboard led states:

  • Modifiers - is the same form as keyboard assignment modifiers
  • Leds - possible flags are "CAPS_LOCK" and "NUM_LOCK". Note that macOS doesn't have a num lock concept.

This example shows the current modifier and led status in the right status area:

local wezterm = require 'wezterm'

local config = wezterm.config_builder()

config.debug_key_events = true

wezterm.on('update-status', function(window, pane)
  local mods, leds = window:keyboard_modifiers()
  window:set_right_status('mods=' .. mods .. ' leds=' .. leds)
end)

return config

window:leader_is_active()

{{since('20220319-142410-0fcdea07')}}

Returns true if the Leader Key is active in the window, or false otherwise.

This example shows LEADER in the right status area, and turns the cursor orange, when the leader is active:

local wezterm = require 'wezterm'

wezterm.on('update-right-status', function(window, pane)
  local leader = ''
  if window:leader_is_active() then
    leader = 'LEADER'
  end
  window:set_right_status(leader)
end)

return {
  leader = { key = 'a', mods = 'CTRL' },
  colors = {
    compose_cursor = 'orange',
  },
}

See also: window:composition_status().

window:maximize()

{{since('20220807-113146-c2fee766')}}

Puts the window into the maximized state.

Use window:restore() to return to the normal/non-maximized state.

window:mux_window()

{{since('20220807-113146-c2fee766')}}

Returns the MuxWindow representation of this window.

This method is the inverse of mux_window:gui_window.

window:perform_action(key_assignment, pane)

{{since('20201031-154415-9614e117')}}

Performs a key assignment against the window and pane. There are a number of actions that can be performed against a pane in a window when configured via the keys and mouse configuration options.

This method allows your lua script to trigger those actions for itself.

The first parameter is a key assignment such as that returned by wezterm.action.

The second parameter is a pane object passed to your event callback.

For an example of this method in action, see wezterm.on Custom Events.

window:restore()

{{since('20220807-113146-c2fee766')}}

Restores the window from the maximized state.

See also: window:maximize().

window:set_config_overrides(overrides)

{{since('20210314-114017-04b7cedd')}}

Changes the set of configuration overrides for the window. The config file is re-evaluated and any CLI overrides are applied, followed by the keys and values from the overrides parameter.

This can be used to override configuration on a per-window basis; this is only useful for options that apply to the GUI window, such as rendering the GUI.

Each call to window:set_config_overrides will emit the window-config-reloaded event for the window. If you are calling this method from inside the handler for window-config-reloaded you should take care to only call window:set_config_overrides if the actual override values have changed to avoid a loop.

In this example, a key assignment (CTRL-SHIFT-E) is used to toggle the use of ligatures in the current window:

local wezterm = require 'wezterm'

wezterm.on('toggle-ligature', function(window, pane)
  local overrides = window:get_config_overrides() or {}
  if not overrides.harfbuzz_features then
    -- If we haven't overridden it yet, then override with ligatures disabled
    overrides.harfbuzz_features = { 'calt=0', 'clig=0', 'liga=0' }
  else
    -- else we did already, and we should disable out override now
    overrides.harfbuzz_features = nil
  end
  window:set_config_overrides(overrides)
end)

return {
  keys = {
    {
      key = 'E',
      mods = 'CTRL',
      action = wezterm.action.EmitEvent 'toggle-ligature',
    },
  },
}

In this example, a key assignment (CTRL-SHIFT-B) is used to toggle opacity for the window:

local wezterm = require 'wezterm'

wezterm.on('toggle-opacity', function(window, pane)
  local overrides = window:get_config_overrides() or {}
  if not overrides.window_background_opacity then
    overrides.window_background_opacity = 0.5
  else
    overrides.window_background_opacity = nil
  end
  window:set_config_overrides(overrides)
end)

return {
  keys = {
    {
      key = 'B',
      mods = 'CTRL',
      action = wezterm.action.EmitEvent 'toggle-opacity',
    },
  },
}

window:set_inner_size(width, height)

{{since('20220807-113146-c2fee766')}}

Resizes the inner portion of the window (excluding any window decorations) to the specified width and height.

window:set_left_status(string)

{{since('20220807-113146-c2fee766')}}

This method can be used to change the content that is displayed in the tab bar, to the left of the tabs. The content is displayed left-aligned and will take as much space as needed to display the content that you set; it will not be implicitly clipped.

The parameter is a string that can contain escape sequences that change presentation.

It is recommended that you use wezterm.format to compose the string.

See window:set_right_status for examples.

window:set_position(x, y)

{{since('20220807-113146-c2fee766')}}

Repositions the top-left corner of the window to the specified x, y coordinates.

Note that Wayland does not allow applications to directly control their window placement, so this method has no effect on Wayland.

window:set_right_status(string)

{{since('20210314-114017-04b7cedd')}}

This method can be used to change the content that is displayed in the tab bar, to the right of the tabs and new tab button. The content is displayed right-aligned and will be clipped from the left edge to fit in the available space.

The parameter is a string that can contain escape sequences that change presentation.

It is recommended that you use wezterm.format to compose the string.

Here's a basic example that displays the time in the status area:

Demonstrating setting the right status area to the current date and time

local wezterm = require 'wezterm'

wezterm.on('update-right-status', function(window, pane)
  local date = wezterm.strftime '%Y-%m-%d %H:%M:%S'

  -- Make it italic and underlined
  window:set_right_status(wezterm.format {
    { Attribute = { Underline = 'Single' } },
    { Attribute = { Italic = true } },
    { Text = 'Hello ' .. date },
  })
end)

return {}

Here's a rather more elaborate example that employs the popular PowerLine glyphs to show a visually appealing status area. It also extracts the current working directory and hostname from the current pane. That way it can potentially pick up the remote hostname if your remote shell session is using OSC 7 shell integration.

Demonstrating setting the right status area with powerline styling

wezterm.on('update-right-status', function(window, pane)
  -- Each element holds the text for a cell in a "powerline" style << fade
  local cells = {}

  -- Figure out the cwd and host of the current pane.
  -- This will pick up the hostname for the remote host if your
  -- shell is using OSC 7 on the remote host.
  local cwd_uri = pane:get_current_working_dir()
  if cwd_uri then
    local cwd = ''
    local hostname = ''

    if type(cwd_uri) == 'userdata' then
      -- Running on a newer version of wezterm and we have
      -- a URL object here, making this simple!

      cwd = cwd_uri.file_path
      hostname = cwd_uri.host or wezterm.hostname()
    else
      -- an older version of wezterm, 20230712-072601-f4abf8fd or earlier,
      -- which doesn't have the Url object
      cwd_uri = cwd_uri:sub(8)
      local slash = cwd_uri:find '/'
      if slash then
        hostname = cwd_uri:sub(1, slash - 1)
        -- and extract the cwd from the uri, decoding %-encoding
        cwd = cwd_uri:sub(slash):gsub('%%(%x%x)', function(hex)
          return string.char(tonumber(hex, 16))
        end)
      end
    end

    -- Remove the domain name portion of the hostname
    local dot = hostname:find '[.]'
    if dot then
      hostname = hostname:sub(1, dot - 1)
    end
    if hostname == '' then
      hostname = wezterm.hostname()
    end

    table.insert(cells, cwd)
    table.insert(cells, hostname)
  end

  -- I like my date/time in this style: "Wed Mar 3 08:14"
  local date = wezterm.strftime '%a %b %-d %H:%M'
  table.insert(cells, date)

  -- An entry for each battery (typically 0 or 1 battery)
  for _, b in ipairs(wezterm.battery_info()) do
    table.insert(cells, string.format('%.0f%%', b.state_of_charge * 100))
  end

  -- The powerline < symbol
  local LEFT_ARROW = utf8.char(0xe0b3)
  -- The filled in variant of the < symbol
  local SOLID_LEFT_ARROW = utf8.char(0xe0b2)

  -- Color palette for the backgrounds of each cell
  local colors = {
    '#3c1361',
    '#52307c',
    '#663a82',
    '#7c5295',
    '#b491c8',
  }

  -- Foreground color for the text across the fade
  local text_fg = '#c0c0c0'

  -- The elements to be formatted
  local elements = {}
  -- How many cells have been formatted
  local num_cells = 0

  -- Translate a cell into elements
  function push(text, is_last)
    local cell_no = num_cells + 1
    table.insert(elements, { Foreground = { Color = text_fg } })
    table.insert(elements, { Background = { Color = colors[cell_no] } })
    table.insert(elements, { Text = ' ' .. text .. ' ' })
    if not is_last then
      table.insert(elements, { Foreground = { Color = colors[cell_no + 1] } })
      table.insert(elements, { Text = SOLID_LEFT_ARROW })
    end
    num_cells = num_cells + 1
  end

  while #cells > 0 do
    local cell = table.remove(cells, 1)
    push(cell, #cells == 0)
  end

  window:set_right_status(wezterm.format(elements))
end)

window:toast_notification(title, message, [url, [timeout_milliseconds]])

{{since('20210502-154244-3f7122cb')}}

Generates a desktop "toast notification" with the specified title and message.

An optional url parameter can be provided; clicking on the notification will open that URL.

An optional timeout parameter can be provided; if so, it specifies how long the notification will remain prominently displayed in milliseconds. To specify a timeout without specifying a url, set the url parameter to nil. The timeout you specify may not be respected by the system, particularly in X11/Wayland environments, and Windows will always use a fixed, unspecified, duration.

The notification will persist on screen until dismissed or clicked, or until its timeout duration elapses.

This example will display a notification whenever a window has its configuration reloaded. The notification should remain on-screen for approximately 4 seconds (4000 milliseconds), but may remain longer depending on the system.

It's not an ideal implementation because there may be multiple windows and thus multiple notifications:

local wezterm = require 'wezterm'

wezterm.on('window-config-reloaded', function(window, pane)
  window:toast_notification('wezterm', 'configuration reloaded!', nil, 4000)
end)

return {}

window:toggle_fullscreen()

{{since('20220807-113146-c2fee766')}}

Toggles full screen mode for the window.

window:window_id()

{{since('20201031-154415-9614e117')}}

Returns the id number for the window. The Id is used to identify the window within the internal multiplexer and can be used when making API calls via wezterm cli to indicate the subject of manipulation.

WslDomain

{{since('20220319-142410-0fcdea07')}}

The WslDomain struct specifies information about an individual WslDomain, which is used to tell wezterm how to interact with one of your locally installed WSL distributions.

By mapping a distribution to a multiplexing domain, wezterm is better able to support creating new tabs and panes with the same working directory as an existing tab/pane running in that same domain.

By default, wezterm creates a list of WslDomain objects based on parsing the output from wsl -l -v and assigns that as the value of the wsl_domains configuration option.

A WslDomain is a lua object with the following fields:

config.wsl_domains = {
  {
    -- The name of this specific domain.  Must be unique amonst all types
    -- of domain in the configuration file.
    name = 'WSL:Ubuntu-18.04',

    -- The name of the distribution.  This identifies the WSL distribution.
    -- It must match a valid distribution from your `wsl -l -v` output in
    -- order for the domain to be useful.
    distribution = 'Ubuntu-18.04',

    -- The username to use when spawning commands in the distribution.
    -- If omitted, the default user for that distribution will be used.

    -- username = "hunter",

    -- The current working directory to use when spawning commands, if
    -- the SpawnCommand doesn't otherwise specify the directory.

    -- default_cwd = "/tmp"

    -- The default command to run, if the SpawnCommand doesn't otherwise
    -- override it.  Note that you may prefer to use `chsh` to set the
    -- default shell for your user inside WSL to avoid needing to
    -- specify it here

    -- default_prog = {"fish"}
  },
}

Events emitted by the Gui

The following events can be handled using wezterm.on:

gui-attached

{{since('20230320-124340-559cb7b0')}}

This event is triggered when the GUI is starting up after attaching the selected domain. For example, when you use wezterm connect DOMAIN or wezterm start --domain DOMAIN to start the GUI, the gui-attached event will be triggered and passed the MuxDomain object associated with DOMAIN. In cases where you don't specify the domain, the default domain will be passed instead.

This event fires after the gui-startup event.

Note that the gui-startup event does not fire when invoking wezterm connect DOMAIN or wezterm start --domain DOMAIN --attach.

You can use this opportunity to take whatever action suits your purpose; some users like to maximize all of their windows on startup, and this event would allow you do that:

local wezterm = require 'wezterm'
local mux = wezterm.mux

wezterm.on('gui-attached', function(domain)
  -- maximize all displayed windows on startup
  local workspace = mux.get_active_workspace()
  for _, window in ipairs(mux.all_windows()) do
    if window:get_workspace() == workspace then
      window:gui_window():maximize()
    end
  end
end)

local config = wezterm.config_builder()

return config

See also: gui-startup.

gui-startup

{{since('20220624-141144-bd1b7c5d')}}

The gui-startup event is emitted once when the GUI server is starting up when running the wezterm start subcommand.

It is triggered before any default program is started.

If no explicit program was passed to wezterm start, and if the gui-startup event causes any panes to be created then those will take precedence over the default program configuration and no additional default program will be spawned.

This event is useful for starting a set of programs in a standard configuration to save you the effort of doing it manually each time.

This event fires before gui-attached.

This event does not fire for wezterm connect invocations.

{{since('20220807-113146-c2fee766')}}

The event receives an optional SpawnCommand argument that corresponds to any arguments that may have been passed via wezterm start. In earlier releases if you implemented this event, you would essentially prevent wezterm start -- something from spawning something.

The intent is for you to use the information in the command object to spawn a new window, but you can choose to use or ignore it as suits your purpose.

This basic example splits an initial window into thirds:

local wezterm = require 'wezterm'
local mux = wezterm.mux
local config = {}

wezterm.on('gui-startup', function(cmd)
  local tab, pane, window = mux.spawn_window(cmd or {})
  -- Create a split occupying the right 1/3 of the screen
  pane:split { size = 0.3 }
  -- Create another split in the right of the remaining 2/3
  -- of the space; the resultant split is in the middle
  -- 1/3 of the display and has the focus.
  pane:split { size = 0.5 }
end)

return config

This example creates a default window but makes it maximize on startup:

local wezterm = require 'wezterm'
local mux = wezterm.mux
local config = {}

wezterm.on('gui-startup', function(cmd)
  local tab, pane, window = mux.spawn_window(cmd or {})
  window:gui_window():maximize()
end)

return config

Here's a more elaborate example that configures two workspaces:

local wezterm = require 'wezterm'
local mux = wezterm.mux
local config = {}

wezterm.on('gui-startup', function(cmd)
  -- allow `wezterm start -- something` to affect what we spawn
  -- in our initial window
  local args = {}
  if cmd then
    args = cmd.args
  end

  -- Set a workspace for coding on a current project
  -- Top pane is for the editor, bottom pane is for the build tool
  local project_dir = wezterm.home_dir .. '/wezterm'
  local tab, build_pane, window = mux.spawn_window {
    workspace = 'coding',
    cwd = project_dir,
    args = args,
  }
  local editor_pane = build_pane:split {
    direction = 'Top',
    size = 0.6,
    cwd = project_dir,
  }
  -- may as well kick off a build in that pane
  build_pane:send_text 'cargo build\n'

  -- A workspace for interacting with a local machine that
  -- runs some docker containers for home automation
  local tab, pane, window = mux.spawn_window {
    workspace = 'automation',
    args = { 'ssh', 'vault' },
  }

  -- We want to startup in the coding workspace
  mux.set_active_workspace 'coding'
end)

return config

See also:

Events emitted by the Multiplexer

The following events can be handled using wezterm.on:

mux-is-process-stateful

{{since('20220101-133340-7edc5b5a')}}

The mux-is-process-stateful event is emitted when the multiplexer layer wants to determine whether a given Pane can be closed without prompting the user.

This event is synchronous and must return as quickly as possible in order to avoid blocking the multiplexer.

The event is passed a LocalProcessInfo object representing the process that corresponds to the pane.

The hook can return one of the following values:

  • true - to indicate that this process tree is considered to be stateful and that the user should be prompted before terminating the pane
  • false - to indicate that the process tree can be terminated without prompting the user
  • nil - to use the default behavior, which is to consider the skip_close_confirmation_for_processes_named configuration option
  • any other value, or an error, will be treated as equivalent to returning nil

Example

This example doesn't change any behavior, but demonstrates how to log the various fields of process tree, indenting the entries for each level of the process hierarchy.

Since it returns nil, it uses the default behavior.

local wezterm = require 'wezterm'

function log_proc(proc, indent)
  indent = indent or ''
  wezterm.log_info(
    indent
      .. 'pid='
      .. proc.pid
      .. ', name='
      .. proc.name
      .. ', status='
      .. proc.status
  )
  wezterm.log_info(indent .. 'argv=' .. table.concat(proc.argv, ' '))
  wezterm.log_info(
    indent .. 'executable=' .. proc.executable .. ', cwd=' .. proc.cwd
  )
  for pid, child in pairs(proc.children) do
    log_proc(child, indent .. '  ')
  end
end

wezterm.on('mux-is-process-stateful', function(proc)
  log_proc(proc)

  -- Just use the default behavior
  return nil
end)

return {}

Produces the following logs for a zsh that spawned bash that spawned vim foo:

INFO  config::lua > lua: pid=1913470, name=zsh, status=Sleep
INFO  config::lua > lua: argv=-zsh
INFO  config::lua > lua: executable=/usr/bin/zsh, cwd=/home/wez
INFO  config::lua > lua:   pid=1913567, name=bash, status=Sleep
INFO  config::lua > lua:   argv=bash
INFO  config::lua > lua:   executable=/usr/bin/bash, cwd=/home/wez
INFO  config::lua > lua:     pid=1913624, name=vim, status=Sleep
INFO  config::lua > lua:     argv=vim foo
INFO  config::lua > lua:     executable=/usr/bin/vim, cwd=/home/wez

mux-startup

{{since('20220624-141144-bd1b7c5d')}}

The mux-startup event is emitted once when the mux server is starting up. It is triggered before any default program is started.

If the mux-startup event causes any panes to be created then those will take precedence over the default program configuration and no additional default program will be spawned.

This event is useful for starting a set of programs in a standard configuration to save you the effort of doing it manually each time:

local wezterm = require 'wezterm'
local mux = wezterm.mux

-- this is called by the mux server when it starts up.
-- It makes a window split top/bottom
wezterm.on('mux-startup', function()
  local tab, pane, window = mux.spawn_window {}
  pane:split { direction = 'Top' }
end)

return {
  unix_domains = {
    { name = 'unix' },
  },
}

See also:

Events emitted by the Window object

The following events can be handled using wezterm.on:

augment-command-palette

{{since('20230712-072601-f4abf8fd')}}

This event is emitted when the Command Palette is shown.

It's purpose is to enable you to add additional entries to the list of commands shown in the palette.

This hook is synchronous; calling asynchronous functions will not succeed.

The return value is a table listing the additional entries. Each element of the returned table may have the following fields:

  • brief - required: the brief description for the entry
  • doc - optional: a long description that may be shown after the entry, or that may be used in future versions of wezterm to provide more information about the command.
  • action - the action to take when the item is activated. Can be any key assignment action.
  • icon - optional Nerd Fonts glyph name to use for the icon for the entry. See wezterm.nerdfonts for a list of icon names.

Adding a Rename Tab entry to the palette

In this example, an entry is added for renaming tabs:

local wezterm = require 'wezterm'
local act = wezterm.action

local config = wezterm.config_builder()

wezterm.on('augment-command-palette', function(window, pane)
  return {
    {
      brief = 'Rename tab',
      icon = 'md_rename_box',

      action = act.PromptInputLine {
        description = 'Enter new name for tab',
        initial_value = 'My Tab Name',
        action = wezterm.action_callback(function(window, pane, line)
          if line then
            window:active_tab():set_title(line)
          end
        end),
      },
    },
  }
end)

return config

bell

{{since('20211204-082213-a66c61ee9')}}

The bell event is emitted when the ASCII BEL sequence is emitted to a pane in the window.

Defining an event handler doesn't alter wezterm's handling of the bell; the event supplements it and allows you to take additional action over the configured behavior.

The first event parameter is a window object that represents the gui window.

The second event parameter is a pane object that represents the pane in which the bell was rung, which may not be active pane--it could be in an unfocused pane or tab..

local wezterm = require 'wezterm'

wezterm.on('bell', function(window, pane)
  wezterm.log_info('the bell was rung in pane ' .. pane:pane_id() .. '!')
end)

return {}

See also audible_bell and visual_bell.

format-tab-title

{{since('20210502-130208-bff6815d')}}

The format-tab-title event is emitted when the text for a tab title needs to be recomputed.

This event is a bit special in that it is synchronous and must return as quickly as possible in order to avoid blocking the GUI thread.

The most notable consequence of this is that some functions that are asynchronous (such as wezterm.run_child_process) are not possible to call from inside the event handler and will generate a format-tab-title: runtime error: attempt to yield from outside a coroutine error.

This example overrides the default tab title so that the background color is blue for the active tab. This is partially redundant because there is already configuration for this in tab_bar_style, but it demonstrates that it is possible to format more than just the text shown in the tab.

-- This function returns the suggested title for a tab.
-- It prefers the title that was set via `tab:set_title()`
-- or `wezterm cli set-tab-title`, but falls back to the
-- title of the active pane in that tab.
function tab_title(tab_info)
  local title = tab_info.tab_title
  -- if the tab title is explicitly set, take that
  if title and #title > 0 then
    return title
  end
  -- Otherwise, use the title from the active pane
  -- in that tab
  return tab_info.active_pane.title
end

wezterm.on(
  'format-tab-title',
  function(tab, tabs, panes, config, hover, max_width)
    local title = tab_title(tab)
    if tab.is_active then
      return {
        { Background = { Color = 'blue' } },
        { Text = ' ' .. title .. ' ' },
      }
    end
    return title
  end
)

The parameters to the event are:

  • tab - the TabInformation for the active tab
  • tabs - an array containing TabInformation for each of the tabs in the window
  • panes - an array containing PaneInformation for each of the panes in the active tab
  • config - the effective configuration for the window
  • hover - true if the current tab is in the hover state
  • max_width - the maximum number of cells available to draw this tab when using the retro tab bar style.

The return value of the event can be:

  • a string, holding the text to use for the tab title
  • a table holding FormatItems as used in the wezterm.format function. This allows formatting style and color information for individual elements within the tab.

If the event encounters an error, or returns something that is not one of the types mentioned above, then the default tab title text will be computed and used instead.

When the tab bar is computed, this event is called twice for each tab; on the first pass, hover will be false and max_width will be set to tab_max_width. WezTerm will then compute the tab widths that will fit in the tab bar, and then call the event again for the set of tabs, this time with appropriate hover and max_width values.

Only the first format-tab-title event will be executed; it doesn't make sense to define multiple instances of the event with multiple wezterm.on("format-tab-title", ...) calls.

A more elaborate example:

local wezterm = require 'wezterm'

-- The filled in variant of the < symbol
local SOLID_LEFT_ARROW = wezterm.nerdfonts.pl_right_hard_divider

-- The filled in variant of the > symbol
local SOLID_RIGHT_ARROW = wezterm.nerdfonts.pl_left_hard_divider

-- This function returns the suggested title for a tab.
-- It prefers the title that was set via `tab:set_title()`
-- or `wezterm cli set-tab-title`, but falls back to the
-- title of the active pane in that tab.
function tab_title(tab_info)
  local title = tab_info.tab_title
  -- if the tab title is explicitly set, take that
  if title and #title > 0 then
    return title
  end
  -- Otherwise, use the title from the active pane
  -- in that tab
  return tab_info.active_pane.title
end

wezterm.on(
  'format-tab-title',
  function(tab, tabs, panes, config, hover, max_width)
    local edge_background = '#0b0022'
    local background = '#1b1032'
    local foreground = '#808080'

    if tab.is_active then
      background = '#2b2042'
      foreground = '#c0c0c0'
    elseif hover then
      background = '#3b3052'
      foreground = '#909090'
    end

    local edge_foreground = background

    local title = tab_title(tab)

    -- ensure that the titles fit in the available space,
    -- and that we have room for the edges.
    title = wezterm.truncate_right(title, max_width - 2)

    return {
      { Background = { Color = edge_background } },
      { Foreground = { Color = edge_foreground } },
      { Text = SOLID_LEFT_ARROW },
      { Background = { Color = background } },
      { Foreground = { Color = foreground } },
      { Text = title },
      { Background = { Color = edge_background } },
      { Foreground = { Color = edge_foreground } },
      { Text = SOLID_RIGHT_ARROW },
    }
  end
)

return {}

format-window-title

{{since('20210502-154244-3f7122cb')}}

The format-window-title event is emitted when the text for the window title needs to be recomputed.

This event is a bit special in that it is synchronous and must return as quickly as possible in order to avoid blocking the GUI thread.

The most notable consequence of this is that some functions that are asynchronous (such as wezterm.run_child_process) are not possible to call from inside the event handler and will generate a format-window-title: runtime error: attempt to yield from outside a coroutine error.

This example overrides the default window title with code that is equivalent to the default processing--not very useful except as a starting point for making your own title text:

wezterm.on('format-window-title', function(tab, pane, tabs, panes, config)
  local zoomed = ''
  if tab.active_pane.is_zoomed then
    zoomed = '[Z] '
  end

  local index = ''
  if #tabs > 1 then
    index = string.format('[%d/%d] ', tab.tab_index + 1, #tabs)
  end

  return zoomed .. index .. tab.active_pane.title
end)

The parameters to the event are:

  • tab - the TabInformation for the active tab
  • pane - the PaneInformation for the active pane
  • tabs - an array containing TabInformation for each of the tabs in the window
  • panes - an array containing PaneInformation for each of the panes in the active tab
  • config - the effective configuration for the window

The return value of the event should be a string, and if it is then it will be used as the title text in the window title bar.

If the event encounters an error, or returns something that is not a string, then the default window title text will be computed and used instead.

Only the first format-window-title event will be executed; it doesn't make sense to define multiple instances of the event with multiple wezterm.on("format-window-title", ...) calls.

new-tab-button-click

{{since('20230326-111934-3666303c')}}

The new-tab-button-click event is emitted when the user clicks on the "new tab" button in the tab bar. This is the + button that is drawn to the right of the last tab.

The first event parameter is a window object that represents the gui window.

The second event parameter is a pane object that represents the active pane in the window.

The third event parameter is an indication of which mouse button was clicked. The following values are possible:

  • "Left" - the left mouse button
  • "Right" - the right mouse button
  • "Middle" - the middle mouse button

The last event parameter is a KeyAssignment which encodes the default, built-in action that wezterm will take. It may be nil in the case where wezterm would not take any action.

You may take any action you wish in this event handler.

If you return false then you will prevent wezterm from carrying out its default action.

Otherwise, wezterm will proceed to perform that action once your event handler returns.

This following two examples are equivalent in functionality:

wezterm.on(
  'new-tab-button-click',
  function(window, pane, button, default_action)
    -- just log the default action and allow wezterm to perform it
    wezterm.log_info('new-tab', window, pane, button, default_action)
  end
)
wezterm.on(
  'new-tab-button-click',
  function(window, pane, button, default_action)
    wezterm.log_info('new-tab', window, pane, button, default_action)
    -- We're explicitly going to perform the default action
    if default_action then
      window:perform_action(default_action, pane)
    end
    -- and tell wezterm that we handled the event so that it doesn't
    -- perform it a second time.
    return false
  end
)

See also window:perform_action().

open-uri

The open-uri event is emitted when the CompleteSelectionOrOpenLinkAtMouseCursor key/mouse assignment is triggered.

The default action is to open the active URI in your browser, but if you register for this event you can co-opt the default behavior.

For example, if you prefer to launch your preferred MUA in a new window in response to clicking on mailto: URLs, you could do something like:

local wezterm = require 'wezterm'

wezterm.on('open-uri', function(window, pane, uri)
  local start, match_end = uri:find 'mailto:'
  if start == 1 then
    local recipient = uri:sub(match_end + 1)
    window:perform_action(
      wezterm.action.SpawnCommandInNewWindow {
        args = { 'mutt', recipient },
      },
      pane
    )
    -- prevent the default action from opening in a browser
    return false
  end
  -- otherwise, by not specifying a return value, we allow later
  -- handlers and ultimately the default action to caused the
  -- URI to be opened in the browser
end)

The first event parameter is a window object that represents the gui window.

The second event parameter is a pane object that represents the pane.

The third event parameter is the URI string.

update-right-status

{{since('20210314-114017-04b7cedd')}}

The update-right-status event is emitted periodically (based on the interval specified by the status_update_interval configuration value).

There is no defined return value for the event, but its purpose is to allow you the chance to carry out some activity and then ultimately call window:set_right_status.

The first event parameter is a window object that represents the gui window.

The second event parameter is a pane object that represents the active pane in that window.

wezterm will ensure that only a single instance of this event is outstanding; if the hook takes longer than the status_update_interval to complete, wezterm won't schedule another call until status_update_interval milliseconds have elapsed since the last call completed.

{{since('20220903-194523-3bb1ed61')}}

This event is considered to be deprecated and you should migrate to using update-status, which behaves the same way, but doesn't overly focus on the right status area.

update-status

{{since('20220903-194523-3bb1ed61')}}

The update-status event is emitted periodically (based on the interval specified by the status_update_interval configuration value).

There is no defined return value for the event, but its purpose is to allow you the chance to carry out some activity and then ultimately call window:set_right_status or window:set_left_status.

The first event parameter is a window object that represents the gui window.

The second event parameter is a pane object that represents the active pane in that window.

wezterm will ensure that only a single instance of this event is outstanding; if the hook takes longer than the status_update_interval to complete, wezterm won't schedule another call until status_update_interval milliseconds have elapsed since the last call completed.

user-var-changed

{{since('20220903-194523-3bb1ed61')}}

The user-var-changed event is emitted when a user var escape sequence is used to set a user var.

You can use something like the following from your shell:

printf "\033]1337;SetUserVar=%s=%s\007" foo `echo -n bar | base64`

to set the user var named foo to the value bar.

!!! note On some systems the base64 command wraps the output by default after some amount of characters limiting the maximum length of the value. If this is the case an argument like -w 0 might help to avoid wrapping.

Then, if you have this in your config:

local wezterm = require 'wezterm'

wezterm.on('user-var-changed', function(window, pane, name, value)
  wezterm.log_info('var', name, value)
end)

return {}

your event handler will be called with name = 'foo' and value = 'bar'.

See also pane:get_user_vars().

window-config-reloaded

{{since('20210314-114017-04b7cedd')}}

The window-config-reloaded event is emitted when the configuration for a window has been reloaded. This can occur when the configuration file is detected as changed (when automatically_reload_config is enabled), when the configuration is explicitly reloaded via the ReloadConfiguration key action, and when window:set_config_overrides is called for the window.

This event is fire-and-forget from the perspective of wezterm; it fires the event to advise of the config change, but has no other expectations.

If you call window:set_config_overrides from inside this event callback then an additional window-config-reloaded event will be triggered. You should take care to avoid creating a loop by only calling window:set_config_overrides when the actual override values are changed.

The first event parameter is a window object that represents the gui window.

The second event parameter is a pane object that represents the active pane in that window.

local wezterm = require 'wezterm'

wezterm.on('window-config-reloaded', function(window, pane)
  wezterm.log_info 'the config was reloaded for this window!'
end)

window-focus-changed

{{since('20221119-145034-49b9839f')}}

The window-focus-changed event is emitted when the focus state for a window is changed.

This event is fire-and-forget from the perspective of wezterm; it fires the event to advise of the config change, but has no other expectations.

The first event parameter is a window object that represents the gui window.

The second event parameter is a pane object that represents the active pane in that window.

local wezterm = require 'wezterm'

wezterm.on('window-focus-changed', function(window, pane)
  wezterm.log_info(
    'the focus state of ',
    window:window_id(),
    ' changed to ',
    window:is_focused()
  )
end)

window-resized

{{since('20210314-114017-04b7cedd')}}

The window-resized event is emitted when the window is resized and when transitioning between full-screen and regular windowed mode.

The event is triggered asynchronously with respect to the potentially-ongoing live resize operation. wezterm will coalesce the stream of multiple events generated by a live resize such that there can be a maximum of 1 event executing and 1 event buffered.

The first event parameter is a window object that represents the gui window.

The second event parameter is a pane object that represents the active pane in that window.

This example demonstrates adjusting the window padding when going fullscreen so that the terminal content fits in the middle third of the display.

Note how care is taken to avoid calling window:set_config_overrides unless something has changed. Also note how both the window-resized and window-config-reloaded events are connected to the same recompute_padding function; that causes the padding changes to take effect both when toggling fullscreen and when editing the config file to adjust the event handling code:

local wezterm = require 'wezterm'

function recompute_padding(window)
  local window_dims = window:get_dimensions()
  local overrides = window:get_config_overrides() or {}

  if not window_dims.is_full_screen then
    if not overrides.window_padding then
      -- not changing anything
      return
    end
    overrides.window_padding = nil
  else
    -- Use only the middle 33%
    local third = math.floor(window_dims.pixel_width / 3)
    local new_padding = {
      left = third,
      right = third,
      top = 0,
      bottom = 0,
    }
    if
      overrides.window_padding
      and new_padding.left == overrides.window_padding.left
    then
      -- padding is same, avoid triggering further changes
      return
    end
    overrides.window_padding = new_padding
  end
  window:set_config_overrides(overrides)
end

wezterm.on('window-resized', function(window, pane)
  recompute_padding(window)
end)

wezterm.on('window-config-reloaded', function(window)
  recompute_padding(window)
end)

Command Line

This section documents the wezterm command line.

Note that wezterm --help or wezterm SUBCOMMAND --help will show the precise set of options that are applicable to your installed version of wezterm.

wezterm is deployed with two major executables:

  • wezterm (or wezterm.exe on Windows) - for interacting with wezterm from the terminal
  • wezterm-gui (or wezterm-gui.exe on Windows) - for spawning wezterm from a desktop environment

You will typically use wezterm when scripting wezterm; it knows when to delegate to wezterm-gui under the covers.

If you are setting up a launcher for wezterm to run in the Windows GUI environment then you will want to explicitly target wezterm-gui so that Windows itself doesn't pop up a console host for its logging output.

!!! note wezterm-gui.exe --help will not output anything to a console when run on Windows systems, because it runs in the Windows GUI subsystem and has no connection to the console. You can use wezterm.exe --help to see information about the various commands; it will delegate to wezterm-gui.exe when appropriate.

Synopsis

{% include "../examples/cmd-synopsis-wezterm--help.txt" %}

wezterm cli

The cli subcommand interacts with a running wezterm GUI or multiplexer instance, and can be used to spawn programs and manipulate tabs and panes.

Targeting the correct instance

There may be multiple GUI processes running in addition to a multiplexer server. wezterm uses the following logic to decide which one it should connect to.

  • If the --prefer-mux flag is passed, then the wezterm.lua config file is consulted to determine the first unix domain defined by the config.
  • If the $WEZTERM_UNIX_SOCKET environment variable is set, use that location to identify the running instance
  • Try to locate a running GUI instance. The --class argument specifies an optional window class that can be used to select the appropriate GUI window if that GUI window was also spawned using --class to override the default.

Targeting Panes

Various subcommands target panes via a (typically optional) --pane-id argument.

The following rules are used to determine a pane if --pane-id is not specified:

  • If the $WEZTERM_PANE environment variable is set, it will be used
  • The list of clients is retrieved and sorted by the most recently interacted session. The focused pane id from that session is used

See also: wezterm cli list

Available Subcommands

wezterm cli activate-pane-direction DIRECTION

{{since('20221119-145034-49b9839f')}}

Run wezterm cli activate-pane-direction --help to see more help

Changes the activate pane to the one in the specified direction.

Possible values for DIRECTION are shown below; the direction is matched ignoring case so you can use left rather than Left:

  • Left, Right, Up, Down to activate based on direction
  • Next, Prev to cycle based on the ordinal position in the pane tree.

Synopsis

{% include "../../examples/cmd-synopsis-wezterm-cli-activate-pane-direction--help.txt" %}

wezterm cli activate-pane

{{since('20230326-111934-3666303c')}}

Activates the current pane, or the pane specified via the --pane-id parameter.

Synopsis

{% include "../../examples/cmd-synopsis-wezterm-cli-activate-pane--help.txt" %}

wezterm cli activate-tab

{{since('20230326-111934-3666303c')}}

Synopsis

{% include "../../examples/cmd-synopsis-wezterm-cli-activate-tab--help.txt" %}

wezterm cli adjust-pane-size DIRECTION

{{since('20230712-072601-f4abf8fd')}}

Run wezterm cli adjust-pane-size --help to see more help

Adjust the size of the current pane, or the pane specified by --pane-id, in the specified direction.

Possible values for DIRECTION are shown below; the direction is matched ignoring case so you can use left rather than Left:

  • Left, Right, Up, Down to adjust size based on direction

Synopsis

{% include "../../examples/cmd-synopsis-wezterm-cli-adjust-pane-size--help.txt" %}

wezterm cli get-pane-direction DIRECTION

{{since('20230408-112425-69ae8472')}}

Run wezterm cli get-pane-direction --help to see more help

Prints the pane id of the pane in the specified direction, relative to the current pane.

Possible values for DIRECTION are shown below; the direction is matched ignoring case so you can use left rather than Left:

  • Left, Right, Up, Down based on direction
  • Next, Prev based on the ordinal position in the pane tree.

Synopsis

{% include "../../examples/cmd-synopsis-wezterm-cli-get-pane-direction--help.txt" %}

wezterm cli get-text

{{since('20230320-124340-559cb7b0')}}

Run wezterm cli get-text --help to see more help

Retrieves the textual content of a pane and output it to stdout.

For example:

$ wezterm cli get-text > /tmp/myscreen.txt

will capture the main (non-scrollback) portion of the current pane to /tmp/myscreen.txt.

By default, just the raw text is captured without any color or styling escape sequences. You may pass --escapes to include those:

$ wezterm cli get-text --escapes > /tmp/myscreen-with-colors.txt

The default capture region is the main terminal screen, not including the scrollback. You may use the --start-line and --end-line parameters to set the range. Both of these accept integer values, where 0 refers to the top of the non-scrollback screen area, and negative numbers index backwards into the scrollback.

Synopsis

{% include "../../examples/cmd-synopsis-wezterm-cli-get-text--help.txt" %}

wezterm cli kill-pane

{{since('20230326-111934-3666303c')}}

Immediately and without prompting, kills either the current pane, or the pane specify via the --pane-id parameter.

Synopsis

{% include "../../examples/cmd-synopsis-wezterm-cli-kill-pane--help.txt" %}

wezterm cli list-clients

Run wezterm cli list-clients --help to see more help

Lists the set of connected clients and some additional information about them:

$ wezterm cli list-clients
USER HOST     PID CONNECTED     IDLE       WORKSPACE FOCUS
wez  foo  1098536 166.03140978s 31.40978ms default       0

The meanings of the fields are:

  • USER - the username associated with the session
  • HOST - the hostname associated with the session
  • PID - the process id of the client session
  • CONNECTED - shows how long the connection has been established
  • IDLE - shows how long it has been since input was received from that client
  • WORKSPACE - shows the active workspace for that session
  • FOCUS - shows the pane id of the pane that has focus in that session

{{since('20220624-141144-bd1b7c5d')}}

You may request JSON output:

$ wezterm cli list-clients --format json
[
  {
    "username": "wez",
    "hostname": "foo",
    "pid": 1098536,
    "connection_elapsed": {
      "secs": 226,
      "nanos": 502667166
    },
    "idle_time": {
      "secs": 0,
      "nanos": 502667166
    },
    "workspace": "default",
    "focused_pane_id": 0
  }
]

Synopsis

{% include "../../examples/cmd-synopsis-wezterm-cli-list-clients--help.txt" %}

wezterm cli list

Run wezterm cli list --help to see more help

Lists the set of windows, tabs and panes that are being managed.

The default output is tabular:

$ wezterm cli list
WINID TABID PANEID WORKSPACE SIZE  TITLE                          CWD
    0     0      0 default   80x24 wezterm cli list  -- wez@foo:~ file://foo/home/wez/

Each row describes a pane. The meaning of the fields are:

  • WINID - the window id of the window that contains the pane
  • TABID - the tab id of the tab that contains the pane
  • PANEID - the pane id
  • WORKSPACE - the workspace that the pane is associated with
  • SIZE - the dimensions of the pane, measured in terminal cell columns x rows
  • TITLE - the pane title
  • CWD - the current working directory associated with the pane

{{since('20220624-141144-bd1b7c5d')}}

You may request JSON output:

$ wezterm cli list --format json
[
  {
    "window_id": 0,
    "tab_id": 0,
    "pane_id": 0,
    "workspace": "default",
    "size": {
      "rows": 24,
      "cols": 80
    },
    "title": "wezterm cli list --format json -- wez@foo:~",
    "cwd": "file://foo/home/wez/"
  }
]

Synopsis

{% include "../../examples/cmd-synopsis-wezterm-cli-list--help.txt" %}

wezterm cli move-pane-to-new-tab

{{since('20220624-141144-bd1b7c5d')}}

Run wezterm cli move-pane-to-new-tab --help to see more help

Allows moving a pane into a new tab either in the same window or in a new window.

The default action is to move the current pane into a new tab in the same window. The following arguments modify the behavior:

  • --new-window - Create tab in a new window
  • --window-id WINDOW_ID - Create the new tab in the specified window id rather than the current window.
  • --workspace WORKSPACE - When using --new-window, use WORKSPACE as the name of the workspace for the newly created window rather than the default workspace name "default".
  • --pane-id - Specifies which pane to move. See also Targeting Panes.

See also: pane:move_to_new_window(), pane:move_to_new_tab().

Synopsis

{% include "../../examples/cmd-synopsis-wezterm-cli-move-pane-to-new-tab--help.txt" %}

wezterm cli rename-workspace NEW-NAME

{{since('20230408-112425-69ae8472')}}

Run wezterm cli rename-workspace --help to see more help

Synopsis

{% include "../../examples/cmd-synopsis-wezterm-cli-rename-workspace--help.txt" %}

wezterm cli send-text

Run wezterm cli send-text --help to see more help

Send text to a pane as though it were pasted. If bracketed paste mode is enabled in the pane, then the text will be sent as a bracketed paste.

For example:

$ wezterm cli send-text "hello there"

will cause hello there to be sent to the input in the current pane.

You can also pipe text in via stdin:

$ echo hello there | wezterm cli send-text

The following arguments modify the behavior:

  • --no-paste - Send the text directly, rather than as a bracketed paste. {{since('20220624-141144-bd1b7c5d', inline=True)}}
  • --pane-id - Specifies which pane to send the text to. See also Targeting Panes.

Synopsis

{% include "../../examples/cmd-synopsis-wezterm-cli-send-text--help.txt" %}

wezterm cli set-tab-title TITLE

{{since('20230408-112425-69ae8472')}}

Run wezterm cli set-tab-title --help to see more help

Synopsis

{% include "../../examples/cmd-synopsis-wezterm-cli-set-tab-title--help.txt" %}

wezterm cli set-window-title TITLE

{{since('20230408-112425-69ae8472')}}

Run wezterm cli set-window-title --help to see more help

Synopsis

{% include "../../examples/cmd-synopsis-wezterm-cli-set-window-title--help.txt" %}

wezterm cli spawn

Run wezterm cli spawn --help to see more help

Spawn a command into a new tab or window. Outputs the pane-id for the newly created pane on success.

When run with no arguments, it will spawn a new tab running the default program; this example spawns a new pane with id 1 running that default program (most likely: your shell):

$ wezterm cli spawn
1

You may spawn an alternative program by passing the argument list; it is recommended that you use -- to denote the end of the arguments being passed to wezterm cli spawn so that any parameters you may wish to pass to the program are not confused with parameters to wezterm cli spawn. This example launches top in a new tab:

$ wezterm cli spawn -- top
2

This example explicitly runs bash as a login shell:

$ wezterm cli spawn -- bash -l
3

The following options affect the behavior:

  • --cwd CWD - Specifies the current working directory that should be set for the spawned program
  • --domain-name DOMAIN_NAME - Spawn into the named multiplexer domain. The default is to spawn into the domain of the current pane.
  • --new-window - Spawns the tab into a window of its own.
  • --workspace WORKSPACE - when using --new-window, set the workspace name rather than using the default name of "default".
  • --window-id WINDOW_ID - Spawn the tab into the specified window, rather than using the current window

Synopsis

{% include "../../examples/cmd-synopsis-wezterm-cli-spawn--help.txt" %}

wezterm cli split-pane

Run wezterm cli split-pane --help to see more help

Split the current pane. Outputs the pane-id for the newly created pane on success.

This command will create a split in the current pane and spawn a command into it. This splits the pane and creates a new one at the bottom running the default command:

$ wezterm cli split-pane
2

You may spawn an alternative program by passing the argument list; it is recommended that you use -- to denote the end of the arguments being passed to wezterm cli split-pane so that any parameters you may wish to pass to the program are not confused with parameters to wezterm cli split-pane. This example launches bash as a login shell in a new pane at the bottom:

$ wezterm cli split-pane -- bash -l
3

This example creates a split to the left, occupying 30% of the available space:

$ wezterm cli split-pane --left --percent 30
4

The following options affect the behavior:

  • --cwd CWD - Specify the current working directory for the initially spawned program.
  • --horizontal - Equivalent to --right. If neither this nor any other direction is specified, the default is equivalent to --bottom.
  • --pane-id - Specifies the pane that should be split. See also Targeting Panes.

{{since('20220624-141144-bd1b7c5d')}}

  • --bottom - Split vertically, with the new pane on the bottom.
  • --cells CELLS - The number of cells that the new split should have. If omitted, 50% of the available space is used.
  • --left - Split horizontally, with the new pane on the left.
  • --move-pane-id MOVE_PANE_ID - Instead of spawning a new command, move the specified pane into the newly created split.
  • --percent PERCENT - Specify the number of cells that the new split should have, expressed as a percentage of the available space.
  • --right - Split horizontally, with the new pane on the right.
  • --top - Split vertically, with the new pane on the top.
  • --top-level - Rather than splitting the active pane, split the entire window.

Synopsis

{% include "../../examples/cmd-synopsis-wezterm-cli-split-pane--help.txt" %}

wezterm cli zoom-pane

{{since('20240127-113634-bbcac864')}}

Run wezterm cli zoom-pane --help to see more help

Synopsis

{% include "../../examples/cmd-synopsis-wezterm-cli-zoom-pane--help.txt" %}

wezterm connect

{% include "../examples/cmd-synopsis-wezterm-connect--help.txt" %}

wezterm imgcat

{% include "../examples/cmd-synopsis-wezterm-imgcat--help.txt" %}

wezterm ls-fonts

{% include "../examples/cmd-synopsis-wezterm-ls-fonts--help.txt" %}

wezterm record

{% include "../examples/cmd-synopsis-wezterm-record--help.txt" %}

wezterm replay

{% include "../examples/cmd-synopsis-wezterm-replay--help.txt" %}

wezterm serial

{% include "../examples/cmd-synopsis-wezterm-serial--help.txt" %}

wezterm set-working-directory

{% include "../examples/cmd-synopsis-wezterm-set-working-directory--help.txt" %}

wezterm show-keys

{{since('20220624-141144-bd1b7c5d')}}

Prints the complete set of key assignments based on your config file.

The command shows each key table as well as the set of mouse bindings.

A truncated example of the output is shown below.

Default key table
-----------------

        CTRL                 Tab                ->   ActivateTabRelative(1)
        SHIFT | CTRL         Tab                ->   ActivateTabRelative(-1)
        ...

Key Table: copy_mode
--------------------

                Tab          ->   CopyMode(MoveForwardWord)
        SHIFT   Tab          ->   CopyMode(MoveBackwardWord)
        SHIFT   $            ->   CopyMode(MoveToEndOfLineContent)
        ...

Key Table: search_mode
----------------------

               Enter       ->   CopyMode(PriorMatch)
               Escape      ->   CopyMode(Close)
        CTRL   n           ->   CopyMode(NextMatch)
        ...

Mouse
-----

                       Down { streak: 1, button: Left }     ->   SelectTextAtMouseCursor(Cell)
        SHIFT          Down { streak: 1, button: Left }     ->   ExtendSelectionToMouseCursor(None)
        ALT            Down { streak: 1, button: Left }     ->   SelectTextAtMouseCursor(Block)
        ...

Synopsis

{% include "../examples/cmd-synopsis-wezterm-show-keys--help.txt" %}

wezterm ssh

{% include "../examples/cmd-synopsis-wezterm-ssh--help.txt" %}

wezterm start

{% include "../examples/cmd-synopsis-wezterm-start--help.txt" %}

Please note that this is a "living document" and may lag or lead the state of the current stable release in a number of areas--as you might imagine, precisely documenting escape codes and their behaviors and cross-checking with the various technical documents is laborious and tedious and I only have so much spare time!

If you notice that something is inaccurate or missing, please do file an issue so that it can be resolved!

Output/Escape Sequences

WezTerm considers the output from the terminal to be a UTF-8 encoded stream of codepoints. No other encoding is supported. As described below, some C1 control codes have both 7-bit ASCII compatible as well as 8-bit representations. As ASCII is a compatible subset of UTF-8, the 7-bit representations are preferred and processed without any special consideration.

The 8-bit values are recognized, but only if the 8-bit value is treated as a unicode code point and encoded via a UTF-8 multi-byte sequence.

Printable Codepoints

Codepoints with value 0x20 and higher are considered to be printable and are applied to the terminal display using the following rules:

  • Codepoints are buffered until a C0, C1 or other escape/control sequence is encountered, which triggers a flush and processing continues with the next step.
  • The buffered codepoint sequence is split into unicode graphemes, which means that combining sequences and emoji are decoded. Processing continues for below for each individually recognized grapheme.
  • If DEC line drawing mode is active, graphemes j-n, q, t-x are translated to equivalent line drawing graphemes and processing continues.
  • If prior output/actions require it, the cursor position may be moved to a new line and the terminal display may be scrolled to make accommodate it.
  • An appropriate number of cells, starting at the current cursor position, are allocated based on the column width of the current grapheme and are assigned to the grapheme. The current current graphics rendition state (such as colors and other presentation attributes) is also applied to those cells. If insert mode is active, those cells will be inserted at the current cursor position, otherwise they will overwrite cells at the current cursor position.
  • The cursor position will be updated based on the column width of the grapheme.

After the graphemes are applied to the terminal display, the rendering portion of WezTerm will attempt to apply your font shaping configuration based on runs of graphemes with matching graphic attributes to determine which glyphs should be rendered from your fonts; it is at this stage that emoji and ligatures are resolved.

C0 Control Codes

Codepoints in the range 0x00-0x1F are considered to be C0 control codes. C0 controls will flush any buffered printable codepoints before triggering the action described below.

SeqHexNameDescriptionAction
^@0x00NULNullIgnored
^A0x01SOHStart of HeadingIgnored
^B0x02STXStart of TextIgnored
^C0x03ETXEnd of TextIgnored
^D0x04EOTEnd of TransmissionIgnored
^E0x05ENQEnquiryIgnored
^F0x06ACKAcknowledgeIgnored
^G0x07BELBellLogs Ding! (this is the bell) to stderr of the WezTerm process. See #3
^H0x08BSBackspaceMove cursor left by 1, constrained by the left margin. If Reverse Wraparound and dec auto wrap modes are enabled, moving left of the left margin will jump the cursor to the right margin, jumping to bottom right margin if it was at the top left.
^I0x09HTHorizontal TabMove cursor right to the next tab stop
^J0x0ALFLine FeedIf cursor is at the bottom margin, scroll the region up, otherwise move cursor down 1 row
^K0x0BVTVertical TabTreated as Line Feed
^L0x0CFFForm FeedTreated as Line Feed
^M0x0DCRCarriage ReturnIf cursor is left of leftmost margin, move to column 0. Otherwise move to left margin
^N0x0ESOShift OutIgnored
^O0x0FSIShift InIgnored
^P0x10DLEData Link EscapeIgnored
^Q0x11DC1Device Control OneIgnored
^R0x12DC2Device Control TwoIgnored
^S0x13DC3Device Control ThreeIgnored
^T0x14DC4Device Control FourIgnored
^U0x15NAKNegative AcknowledgeIgnored
^V0x16SYNSynchronous IdleIgnored
^W0x17ETBEnd Transmission BlockIgnored
^X0x18CANCancelIgnored
^Y0x19EMEnd of MediumIgnored
^Z0x1ASUBSubstituteIgnored
^[0x1BESCEscapeIntroduces various escape sequences described below
^|0x1CFSFile SeparatorIgnored
^]0x1DGSGroup SeparatorIgnored
^^0x1ERSRecord SeparatorIgnored
^_0x1FUSUnit SeparatorIgnored

C1 Control Codes

As mentioned above, WezTerm only supports UTF-8 encoding. C1 control codes have an 8-bit representation as well as a multi-codepoint 7-bit escape sequence.

The 8-bit representation is recognized if the 8-bit value is treated as a unicode code point and encoded as a multi-byte UTF-8 sequence. Sending the 8-bit binary value will not be recognized as intended, as those bitsequences are passing through a UTF-8 decoder.

The table below lists the 7-bit C1 sequence (which is preferred) as well as the codepoint value, along with the corresponding meaning.

As with C0 control codes, C1 controls will flush any buffered printable codepoints before triggering the action described below.

SeqCodepointNameDescriptionAction
ESC D0x84INDIndexMoves the cursor down one line in the same column. If the cursor is at the bottom margin, the page scrolls up
ESC E0x85NELNext LineMoves the cursor to the left margin on the next line. If the cursor is at the bottom margin, scroll the page up
ESC H0x88HTSHorizontal Tab SetSets a horizontal tab stop at the column where the cursor is
ESC M0x8DRIReverse IndexMove the cursor up one line. If the cursor is at the top margin, scroll the region down
ESC P0x90DCSDevice Control StringDiscussed below
ESC [0x9BCSIControl Sequence IntroducerDiscussed below
ESC |0x9CSTString TerminatorNo direct effect; ST is used to delimit the end of OSC style escape sequences

Other Escape Sequences

As these sequences start with an ESC, which is a C0 control, these will flush any buffered printable codepoints before triggering the associated action.

SeqNameDescriptionAction
ESC cRISReset to Initial StateResets tab stops, margins, modes, graphic rendition, palette, activates primary screen, erases the display and moves cursor to home position
ESC 7DECSCSave Cursor PositionRecords cursor position
ESC 8DECRCRestored Saved Cursor PositionMoves cursor to location it had when DECSC was used
ESC =DECPAMApplication KeypadEnable Application Keypad Mode
ESC >DECPNMNormal KeypadSet Normal Keypad Mode
ESC (0DEC Line Drawing character setTranslate characters j-x to line drawing glyphs
ESC (BUS ASCII character setDisables DEC Line Drawing character translation
ESC #8DECALNScreen Alignment DisplayFills the display with E characters for diagnostic/test purposes (for vttest)

CSI - Control Sequence Introducer Sequences

CSI sequences begin with the C1 CSI sequence, which is either the 7-bit ESC [ sequence or the codepoint 0x9B.

WezTerm classifies these sequences into a number of functional families which are broken out below.

Graphic Rendition (SGR)

SGR sequences are of the form CSI DIGITS [; DIGITS ]+ m. That is, any number of semicolon separated numbers, terminated by the m codepoint. There are a handful of slightly more modern sequences that use colon : codepoints to encode additional context.

The digits map to one of the codes in the table below, which manipulate the presentation attributes of subsequently printed characters.

It is valid to omit the code number; for example CSI m is equivalent to CSI 0 m which resets the presentation attributes.

CodeDescriptionAction
0ResetReset to default foreground/background colors, reset all presentation attributes, clear any explicit hyperlinks
1IntensityBoldSet the intensity level to Bold. This causes subsequent text to be rendered in a bold font variant and, if the foreground color is set to a palette index in the 0-7 range, effectively shifts it to the brighter value in the 8-15 range
2IntensityDimSet the intensity level to Dim or Half-Bright. This causes text to be rendered in a lighter weight font variant
3ItalicOnSets the italic attribute on the text, causing an italic font variant to be selected
4UnderlineOnText will have a single underline
4:0UnderlineOffText will have no underline
4:1UnderlineOnText will have a single underline
4:2UnderlineDoubleText will be rendered with double underline
4:3UnderlineCurlyText will be rendered with a curly underline
4:4UnderlineDottedText will be rendered with a dotted underline
4:5UnderlineDashedText will be rendered with a dashed underline
5BlinkOnIndicates that the text should blink <150 times per minute
6RapidBlinkOnIndicates that the text should blink >150 times per minute
7InverseOnCauses the foreground and background colors to be swapped
8InvisibleOnMarks text as invisible.
9StrikeThroughOnText will be rendered with a single line struck through the middle
21UnderlineDoubleText will be rendered with double underline
22NormalIntensityCancels the effect of IntensityBold and IntensityDim, returning the text to normal intensity
23ItalicOffCancels the effect of ItalicOn
24UnderlineOffText will have no underline
25BlinkOffCancels the effect of BlinkOn and RapidBlinkOn
27InverseOffCancels the effect of InverseOn
28InvisibleOffcancels the effect of InvisibleOn
29StrikeThroughOffCancels the effect of StrikeThroughOn
30ForegroundBlackSets the foreground color to ANSI Black, which is palette index 0
31ForegroundRedSets the foreground color to ANSI Red, which is palette index 1
32ForegroundGreenSets the foreground color to ANSI Green, which is palette index 2
33ForegroundYellowSets the foreground color to ANSI Yellow, which is palette index 3
34ForegroundBlueSets the foreground color to ANSI Blue, which is palette index 4
35ForegroundMagentaSets the foreground color to ANSI Magenta, which is palette index 5
36ForegroundCyanSets the foreground color to ANSI Cyan, which is palette index 6
37ForegroundWhiteSets the foreground color to ANSI White, which is palette index 7
39ForegroundDefaultSets the foreground color to the user's configured default text color
40BackgroundBlackSets the background color to ANSI Black, which is palette index 0
41BackgroundRedSets the background color to ANSI Red, which is palette index 1
42BackgroundGreenSets the background color to ANSI Green, which is palette index 2
43BackgroundYellowSets the background color to ANSI Yellow, which is palette index 3
44BackgroundBlueSets the background color to ANSI Blue, which is palette index 4
45BackgroundMagentaSets the background color to ANSI Magenta, which is palette index 5
46BackgroundCyanSets the background color to ANSI Cyan, which is palette index 6
47BackgroundWhiteSets the background color to ANSI White, which is palette index 7
49BackgroundDefaultSets the background color to the user's configured default background color
53OverlineOnRenders text with a single overline/overbar
55OverlineOffCancels OverlineOn
59UnderlineColorDefaultResets the underline color to default, which is to match the foreground color
73VerticalAlignSuperScriptAdjusts the baseline of the text so that it renders as superscript {{since('20221119-145034-49b9839f', inline=True)}}
74VerticalAlignSubScriptAdjusts the baseline of the text so that it renders as subscript {{since('20221119-145034-49b9839f', inline=True)}}
75VerticalAlignBaseLineReset the baseline of the text to normal {{since('20221119-145034-49b9839f', inline=True)}}
90ForegroundBrightBlackSets the foreground color to Bright Black, which is palette index 8
91ForegroundBrightRedSets the foreground color to Bright Red, which is palette index 9
92ForegroundBrightGreenSets the foreground color to Bright Green, which is palette index 10
93ForegroundBrightYellowSets the foreground color to Bright Yellow, which is palette index 11
94ForegroundBrightBlueSets the foreground color to Bright Blue, which is palette index 12
95ForegroundBrightMagentaSets the foreground color to Bright Magenta, which is palette index 13
96ForegroundBrightCyanSets the foreground color to Bright Cyan, which is palette index 14
97ForegroundBrightWhiteSets the foreground color to Bright White, which is palette index 15
100BackgroundBrightBlackSets the background color to Bright Black, which is palette index 8
101BackgroundBrightRedSets the background color to Bright Red, which is palette index 9
102BackgroundBrightGreenSets the background color to Bright Green, which is palette index 10
103BackgroundBrightYellowSets the background color to Bright Yellow, which is palette index 11
104BackgroundBrightBlueSets the background color to Bright Blue, which is palette index 12
105BackgroundBrightMagentaSets the background color to Bright Magenta, which is palette index 13
106BackgroundBrightCyanSets the background color to Bright Cyan, which is palette index 14
107BackgroundBrightWhiteSets the background color to Bright White, which is palette index 15

There are a handful of additional SGR codes that allow setting extended colors; unlike the codes above, which are activated by a single numeric parameter out of SGR sequence, these the extended color codes require multiple parameters. The canonical representation of these sequences is to have the multiple parameters be separated by colons (:), but for compatibility reasons WezTerm also accepts an ambiguous semicolon (;) separated variation. The colon form is unambiguous and should be preferred; the semicolon form should not be used by new applications and is not documented here in the interest of avoiding accidental new implementations.

CSI 38:5 - foreground color palette index

This sequence will set the foreground color to the specified palette INDEX, which can be a decimal number in the range 0-255.

CSI 38 : 5 : INDEX m
CSI 48:5 - background color palette index

This sequence will set the background color to the specified palette INDEX, which can be a decimal number in the range 0-255.

CSI 48 : 5 : INDEX m
CSI 58:5 - underline color palette index

This sequence will set the underline color to the specified palette INDEX, which can be a decimal number in the range 0-255.

CSI 58 : 5 : INDEX m
CSI 38:2 - foreground color: RGB

This sequence will set the foreground color to an arbitrary color in RGB colorspace. The R, G and B symbols below are decimal numbers in the range 0-255. Note that after the 2 parameter two colons are present; its really an omitted colorspace ID parameter but that nature of that parameter is not specified in the accompanying ITU T.416 specification and is ignored by WezTerm and most (all?) other terminal emulators:

CSI 38 : 2 : : R : G : B m

(Since 20210814-124438-54e29167) For the sake of compatibility with some other terminal emulators this additional form is also supported where the colorspace ID argument is not specified:

CSI 38 : 2 : R : G : B m
CSI 38:6 - foreground color: RGBA

{{since('20220807-113146-c2fee766')}}

This is a wezterm extension: wezterm considers color mode 6 as RGBA, allowing you to specify the alpha channel in addition to the RGB channels.

CSI 38 : 6 : : R : G : B : A m
CSI 48:2 - background color: RGB

This sequence will set the background color to an arbitrary color in RGB colorspace. The R, G and B symbols below are decimal numbers in the range 0-255:

CSI 48 : 2 : : R : G : B m

(Since 20210814-124438-54e29167) For the sake of compatibility with some other terminal emulators this additional form is also supported where the colorspace ID argument is not specified:

CSI 48 : 2 : R : G : B m
CSI 48:6 - background color: RGBA

{{since('20220807-113146-c2fee766')}}

This is a wezterm extension: wezterm considers color mode 6 as RGBA, allowing you to specify the alpha channel in addition to the RGB channels.

CSI 48 : 6 : : R : G : B : A m
CSI 58:2 - underline color: RGB

This sequence will set the underline color to an arbitrary color in RGB colorspace. The R, G and B symbols below are decimal numbers in the range 0-255:

CSI 58 : 2 : : R : G : B m

(Since 20210814-124438-54e29167) For the sake of compatibility with some other terminal emulators this additional form is also supported where the colorspace ID argument is not specified:

CSI 58 : 2 : R : G : B m
CSI 58:6 - underline color: RGBA

{{since('20220807-113146-c2fee766')}}

This is a wezterm extension: wezterm considers color mode 6 as RGBA, allowing you to specify the alpha channel in addition to the RGB channels.

CSI 58 : 6 : : R : G : B : A m

Cursor Movement

Editing Functions

Mode Functions

{{since('20210814-124438-54e29167')}}

WezTerm supports Synchronized Rendering. DECSET 2026 is set to batch (hold) rendering until DECSET 2026 is reset to flush the queued screen data.

Device Functions

Window Functions

DCS - Device Control String

The C1 DCS escape places the terminal parser into a device control mode until the C1 ST is encountered.

In the table below, DCS can be either the 7-bit representation (ESC P) or the 8-bit codepoint (0x90).

SeqNameDescription
DCS $ q " p STDECRQSS for DECSCLRequest Conformance Level; Reports the conformance level
DCS $ q r STDECRQSS for DECSTBMRequest top and bottom margin report; Reports the margins
DCS $ q s STDECRQSS for DECSLRMRequest left and right margin report; Reports the margins
DCS [PARAMS] q [DATA] STSixel Graphic DataDecodes Sixel graphic data and apply the image to the terminal model. Support is preliminary and incomplete; see this issue for status.
DCS 1000 qtmux control modeBridges tmux into the WezTerm multiplexer. Currently incomplete, see this issue for status.

Operating System Command Sequences

Operating System Command (OSC) sequences are introduced via ESC ] followed by a numeric code and typically have parameters delimited by ;. OSC sequences are canonically delimited by the ST (String Terminator) sequence, but WezTerm also accepts delimiting them with the BEL control.

The table below is keyed by the OSC code.

OSCDescriptionActionExample
0Set Icon Name and Window TitleClears Icon Name, sets Window Title.\x1b]0;title\x1b\\
1Set Icon NameSets Icon Name, which is used as the Tab title when it is non-empty\x1b]1;tab-title\x1b\\
2Set Window TitleSet Window Title\x1b]2;window-title\x1b\\
3Set X11 Window PropertyIgnored
4Change/Query Color NumberSet or query color palette entries 0-255.query color number 1: \x1b]4;1;?\x1b\\
Set color number 2: \x1b]4;2;#cccccc\x1b\\
5Change/Query Special Color NumberIgnored
6iTerm2 Change Title Tab ColorIgnored
7Set Current Working DirectorySee Shell Integration
8Set HyperlinkSee Explicit Hyperlinks
9iTerm2 Show System NotificationShow a "toast" notificationprintf "\e]9;%s\e\\" "hello there"
10Set Default Text Foreground Color\x1b]10;#ff0000\x1b\\.
Also supports RGBA in nightly builds: printf "\e]10;rgba(127,127,127,0.4)\x07"
11Set Default Text Background Color\x1b]11;#0000ff\x1b\\.
Also supports RGBA in nightly builds: printf "\e]11;rgba:efff/ecff/f4ff/d000\x07"
12Set Text Cursor Color\x1b]12;#00ff00\x1b\\.
Also supports RGBA in nightly builds.
52Manipulate clipboardRequests to query the clipboard are ignored. Allows setting or clearing the clipboard
104ResetColorsReset color palette entries to their default values
133FinalTerm semantic escapesInforms the terminal about Input, Output and Prompt regions on the displaySee Shell Integration
777Call rxvt extensionOnly the notify extension is supported; it shows a "toast" notificationprintf "\e]777;notify;%s;%s\e\\" "title" "body"
1337iTerm2 File Upload ProtocolAllows displaying images inlineSee iTerm Image Protocol
LSet Icon Name (Sun)Same as OSC 1\x1b]Ltab-title\x1b\\
lSet Window Title (Sun)Same as OSC 2\x1b]lwindow-title\x1b\\

Additional Resources

What is a Terminal?

WezTerm is a Terminal Emulator, but what actually is that, and what is a PTY, and what is a shell? This section of the docs aims to summarize how these things relate to each other to help clarify how things work.

This section tries to group concepts together to aid in understanding; it is not intended to be a historically accurate chronology of the development of terminals!

Terminal

A computer terminal is a device that can be used for entering data into (input) and presenting data from (output) a computer system.

Early terminals were very limited devices with basic keyboard data entry and that would print the output onto paper. These devices communicated with the computer system using a simple serial data connection.

That early heritage strongly influences the way that terminals are integrated even in modern operating systems.

On unix operating systems, the kernel has a subsystem for managing Terminal TeletYpes (TTYs) which is essentially a stream of input data, a stream of output data, and some flow control and signal/interrupt management. A TTY is typically strongly associated with a physical serial communication device installed in the system.

The kernel doesn't know any details of the connected device as there isn't a defined way for it to do that; it only knows how to transmit data over that serial line.

To accommodate this the TTY interface in the kernel allows for some basic stream operations such as line-buffering and canonicalization of unix newlines to carriage-return-line-feed as was needed for printer style output to correctly move to the first column and move down a line.

Shell

The Terminal and TTY interface are essentially low-level hardware specifications for moving bytes around. On their own they don't provide any pre-defined function on the connected computer system. For them to do something there needs to be a program that can interpret the input and produce some output.

That program is a shell program, such as zsh or bash. Shell programs provide the user with an interactive way to navigate the computer system and launch other programs.

A shell indirectly communicates with the terminal via the TTY interface to the kernel, which manages the actual communication with the terminal.

flowchart LR
    subgraph Kernel
        direction LR
        TTY["TTY device\n(e.g. /dev/tty/0)"] 
    end
    
    subgraph Userspace
    SHELL["Shell Program (e.g. zsh)"] <-- "input\noutput" --> TTY
    end
    TTY  <-- "input\noutput" -->  TE["Terminal Device"]:::td
    classDef td stroke:#00F,stroke-width:2px

Again, the TTY interface doesn't provide a way for the shell program to know what kind of terminal is attached, which sounds awkward. How is that managed?

ANSI and ECMA-48

You've probably heard talk of ANSI escape sequences in the context of the terminal, what are they?

The various terminal devices typically used ASCII to represent English text and then a range of special byte sequences to control things like bold text. Different vendors may have selected different byte sequences for the same concept.

ANSI is the American National Standards Institute and is organizational body that works to create standards that make it (theoretically!) easier to interoperate across different implementations of things.

One product of ANSI is X3.64 with the aim of replacing vendor-specific codes in terminals and related computer equipment.

You can read more about ANSI escape codes on Wikipedia.

It's not free to read the ANSI specification itself, but that same specification was also published by ECMA (the European Computer Manufacturers Association) as the freely available ECMA-48

Terminfo and termcap

Even though ANSI/ECMA provided information on standardizing communication, there are devices that either pre-date the standards or that aren't fully comformant, or that have more flexibility than the standards could foresee.

A database of terminal capabilities (termcap) was created that is essentially a mapping of the kind of function (eg: "switch to bold rendering") to the associated set of bytes that need to be sent to the terminal in order to trigger that function.

Later, as the set of functions expanded, terminfo was developed as a successor to termcap, which is more extensible.

These databases are consumed by applications using libraries such as curses and its successors.

The way that they work is that the administrator of the system would define the TERM environment variable to the name of the appropriate entry in the terminal database as part of configuring the terminal and shell on the system.

The value of the TERM environment variable would then be used to resolve the data from the terminal database by the library linked into the shell so that it could produce appropriately formatted output.

Running other programs

When a shell spawns a child process it passes to it the input/output streams associated with the TTY and allows it to run. The shell is not involved in the transfer of data between the spawned program and the TTY; that program is directly sending data to the TTY interface and the kernel then sends it on to the attached hardware.

That means that any program that wants to produce nicely formatted information on the associated terminal also needs to respect the setting of TERM and use an appropriate library to resolve the correct escape sequences.

flowchart 
    subgraph Kernel
        direction TB
        TTY["TTY device\n(e.g. /dev/tty/0)"] 
    end
    
    subgraph Userspace
    SHELL["Shell Program (e.g. zsh)"] <-- input/output --> TTY
    SHELL -. "starts" .-> APP
    APP["Application\n(e.g. vim)"] <-- input/output --> TTY

    end
    TTY  <-- input/output -->  TE["Terminal Device"]:::td
    classDef td stroke:#00F,stroke-width:2px

What about stdin, stdout and stderr?

The unix environment defines the standard input/output streams and maps them to specific file descriptors.

The shell program is started up with stdin assigned to the input stream from the associated TTY and both stdout AND stderr are assigned to the output stream. stderr is a duplicate of the stdout stream, and writing to either of them will send data to the terminal output.

The terminal only has a single stream of output data. As far as it is concerned, stdout and stderr do not exist, there is only "output".

Foreground process

Seeing the above diagram, you might wonder how the input/output is kept straight when there are multiple programs that are consuming/producing it.

There is no firm enforcement of who gets to read/write to the TTY data streams, and it's largely a cooperative effort. Usually, only a single program at a time is actively doing something to the output, but it is easy to produce a garbled mess by running multiple programs at once using the & background operator available in many shell programs.

Some shells have job control concept that allows informing the kernel which process is considered to be the active one; that helps when delivering interrupt signals, but doesn't really do anything with the output.

Signals

It is common to use CTRL-C to generate an interrupt signal, how does that work?

The TTY layer in the kernel is configured, usually via the stty utility, to interpret the byte sequence that corresponds to CTRL-C (0x03) as an interrupt signal. When the input stream matches the configured value, rather than propagating that byte the kernel will instead translate it to SIGINT and deliver that signal to the foreground process that is associated with the TTY.

The shell typically registers a SIGINT handler that clears the current line of input, but keeps running. When the shell spawns a child process, it starts it with the SIGINT handler set to the default behavior of terminating the program, and then makes that child process the foreground process. Then it will go to sleep waiting for the child to terminate.

When you subsequently hit CTRL-C, the kernel will send SIGINT to that child foreground process which will then terminate and cause the shell to wake up and continue.

If your shell supports job control, the suspend signal that is typically associated with CTRL-Z will cause the foreground process to suspend which in turn will wakeup the shell in a similar way to that of the child getting terminated, but it can tell that it was suspended rather than terminated.

Terminal Emulators and PTYs

As computer systems got more sophisticated and evolved to desktop environments with multiple windows it was desirable to move the terminal into a window on the desktop and it became necessary to expand the interface to allow for a TTY that wasn't strongly coupled with a physical communication device, and to provide a mechanism for communicating the window size changing.

The Pseudo Terminal teletYpe (PTY) is that evolution of the TTY interface; it allows a userspace application to define additional virtual TTY interfaces as needed.

A PTY has a controller side and a client side (the unfortunate legacy terminology for those is master and slave, respectively), with the controller side allowing for passing information about the window size, and the client side essentially just being the I/O stream.

flowchart 
    subgraph Kernel
        direction TB
        PTYC["PTY client\n(e.g. /dev/pts/0)"] 
        PTYM[PTY master]
        PTYC <--> PTYM
    end
    
    subgraph Userspace
    SHELL["Shell Program (e.g. zsh)"] <-- input/output --> PTYC
    SHELL -. "starts" .-> APP
    APP["Application\n(e.g. vim)"] <-- input/output --> PTYC
    PTYM  <-- input/output -->  TE["Terminal Emulator\n(e.g. wezterm)"]:::wezterm
    classDef wezterm stroke:#00F,stroke-width:2px
    end

A Terminal Emulator is a program that creates a PTY and then spawns a child program (typically a shell program) into that PTY, passing it the client-side of the PTY.

The Terminal Emulator then reads the output from the client-side and interprets the escape sequences to produce a display, and decodes keyboard/mouse input from the windowing environment and encodes it as escape sequences to send to the running program (See keyboard encoding) thereby emulating in software the behavior of the classic hardware terminal devices.

Windows and ConPTY

So far we've been talking about the architecture of UNIX systems, how does Windows compare/relate to this?

While Windows has had the classic "dosbox" as an analogy of the unix terminal emulator, the way it works is so fundamentally different from the unix approach that it has caused headaches for portable software.

There was no PTY equivalent and the terminal emulation was closed off and restricted to that provided by the system. Some enterprising developers were able to build terminal emulators that worked a little more like the unix equivalents with clever tricks that were essentially screen-scraping, but there were many cases that got in the way of a perfect experience.

In relatively recent times, Windows grew support for ConPTY which has opened things up a great deal for terminal emulation. The linked article explains in detail how ConPTY works, so I'm only going to summarize the main points here:

When running on Windows with ConPTY, an additional helper program (for wezterm, that helper is typically named openconsole.exe, but in some circumstances it may be conhost.exe) is spawned to help manage the PTY.

The purpose of this helper process is to translate escape sequences into the native windows equivalent requests and send them to the window console driver.

Because Windows needs to have backwards compatibility with native windows programs that use traditional windows console APIs, the ConPTY PTY implementation is much more complex than the unix PTY/TTY kernel layer, and is essentially its own terminal emulator sitting in between the terminal emulator perceived by the user, and the application(s) that it has spawned inside.

The result of this is pretty good, but still has a few edge cases where the ConPTY layer has some surprising behavior. I expect this to improve over time, but what it means for wezterm users is that they may wish to bypass ConPTY in some cases by using wezterm ssh to directly communicate with a "real" unix pty either on a remote system or inside a WSL or VM running on the local machine.

Troubleshooting

Review logs/error messages

If things aren't working out, there may be an issue printed in the logs. Read on to learn more about how to see those logs.

Debug Overlay

By default, pressing Ctrl + Shift + L will activate the debug overlay and allow you to review the most recently logged issues. It also gives you access to a Lua REPL for evaluating built-in lua functions.

See ShowDebugOverlay for more information on this key assignment.

Log Files

You can find log files in $XDG_RUNTIME_DIR/wezterm on unix systems, or $HOME/.local/share/wezterm on macOS and Windows systems.

Increasing Log Verbosity

The WEZTERM_LOG environment variable can be used to adjust the level of logging for different modules within wezterm.

To see maximum verbosity, you can start wezterm like this:

WEZTERM_LOG=debug wezterm

to see debug level logs for everything on stdout.

On Windows systems you'll usually need to set the environment variable separately:

Using cmd.exe:

C:\> set WEZTERM_LOG=debug
C:\> wezterm

Using powershell:

PS C:\> $env:WEZTERM_LOG="debug"
PS C:\> wezterm

When using a flatpak you must first enter the flatpak container by running:

flatpak run --command=sh --devel org.wezfurlong.wezterm

Before then running wezterm.

Each log line will include the module name, which is a colon separated namespace; in the output below the modules are config, wezterm_gui::frontend, wezterm_font::ftwrap and wezterm_gui::termwindow:

10:29:24.451  DEBUG  config                    > Reloaded configuration! generation=2
10:29:24.452  DEBUG  wezterm_gui::frontend     > workspace is default, fixup windows
10:29:24.459  DEBUG  wezterm_font::ftwrap      > set_char_size computing 12 dpi=124 (pixel height=20.666666666666668)
10:29:24.461  DEBUG  wezterm_font::ftwrap      > set_char_size computing 12 dpi=124 (pixel height=20.666666666666668)
10:29:24.494  DEBUG  wezterm_gui::termwindow   > FocusChanged(true)
10:29:24.495  DEBUG  wezterm_gui::termwindow   > FocusChanged(false)

Those modules generally match up to directories and file names within the wezterm source code, or to external modules that wezterm depends upon.

You can set a more restrictive filter to focus in on just the things you want. For example, if you wanted to debug only configuration related things you might set:

WEZTERM_LOG=config=debug,info

which says:

  • log config at debug level
  • everything else at info level

You can add more comma-separated items:

WEZTERM_LOG=config=debug,wezterm_font=debug,info

See Rust's env_logger documentation for more details on the syntax/possibilities.

Turn on debug_key_events to log information about key presses.

Use wezterm show-keys or wezterm show-keys --lua to show the effective set of key and mouse assignments defined by your config.

Consider changing use_ime to see that is influencing your keyboard usage.

Double check to see if you have some system level utility/software that might be intercepting or changing the behavior of a keyboard shortcut that you're trying to use.

Debugging Font Display

Use wezterm ls-fonts to explain which fonts will be used for different styles of text.

Use wezterm ls-fonts --list-system to get a list of fonts available on your system, in a form that you can use in your config file.

Use wezterm ls-fonts --text foo to explain how wezterm will render the text foo, and wezterm ls-fonts --text foo --rasterize-ascii to show an ascii art rendition of that text.

Frequently Asked Questions

Unicode glyphs render as underscores in my tmux!

This is likely an issue with LANG and locale. tmux will substitute unicode glyphs with underscores if it believes that your environment doesn't support UTF-8.

If you're running on macOS, upgrade to 20200620-160318-e00b076c or newer and WezTerm will automatically set LANG appropriately.

Note that if you change your environment you will likely need to kill and restart your tmux server before it will take effect.

You probably should also review this relevant section from the TMUX FAQ, and read on for more information about LANG and locale below.

Some glyphs look messed up, why is that?

There's a surprisingly amount of work that goes into rendering text, and if you're connected to a remote host, it may span both systems. Read on for some gory details!

LANG and locale

Terminals operate on byte streams and don't necessarily know anything about the encoding of the text that you're sending through. The unix model for this is that the end user (that's you!) will instruct the applications that you're running to use a particular locale to interpret the byte stream.

It is common for these environment variables to not be set, or to be set to invalid values by default!

If you're running on macOS, upgrade to 20200620-160318-e00b076c or newer and WezTerm will automatically set LANG appropriately.

You need to select a unicode locale for best results; for example:

export LANG=en_US.UTF-8
# You don't strictly need this collation, but most technical people
# probably want C collation for sane results
export LC_COLLATE=C

If you have other LC_XXX values in your environment, either remove them from your environment (if applicable) or adjust them to use a UTF-8 locale.

You can run locale -a to list the available locales on your system.

You need to make sure that this setting applies both locally and on systems that you log in to via ssh or the mux connection protocol.

If you're seeing multiple garbage characters in your terminal in place of what should be a single glyph then you most likely have a problem with your locale environment variables.

Pasting or entering unicode in zsh looks broken

By default, zsh's line editor doesn't support combining character sequences. Make sure that you have LANG and local configured correctly as shown above, and then tell zsh to enable combining characters:

setopt COMBINING_CHARS

You'll want to put that into your zshrc so that it is always enabled.

See this stackexchange question for more information.

Fonts and fallback

If you have configured the use of a font that contains only latin characters and then try to display a glyph that isn't present in that font (perhaps an emoji, or perhaps some kanji) then wezterm will try to locate a fallback font that does contain that glyph.

Wezterm uses freetype and harfbuzz to perform font shaping and rendering in a cross platform way, and as a consequence, doesn't have access to the system font fallback selection. Instead it has a short list of fallback fonts that are likely to be present on the system and tries to use those.

If you're seeing the unicode replacement character, a question mark or in the worst cases spaces where a glyph should be, then you have an issue with font fallback.

You can resolve this by explicitly adding fallback font(s) the have the glyphs that you need in your .wezterm.lua:

local wezterm = require 'wezterm'

return {
  font = wezterm.font_with_fallback {
    'My Preferred Font',
    -- This font has a broader selection of Chinese glyphs than my preferred font
    'DengXian',
  },
}

See also Troubleshooting Fonts.

Some (but not all) Emoji don't render properly

To some extent this issue can manifest in a similar way to the LANG and locale issue. There are different versions of the Emoji specifications and the level of support in different applications can vary. Emoji can be comprised from a sequence of codepoints and some combine in interesting ways such as a foot and a skin tone. Applications that don't support this correctly may end up emitting incorrect output. For example, pasting some emoji into the zsh REPL confuses its input parser and results in broken emoji output. However, if you were to emit that same emoji from a script, wezterm would render it correctly.

If you're seeing this sort of issue, then you may be able to upgrade the affected application on that system to see if a newer version resolves that issue.

Multiple characters being rendered/combined as one character?

wezterm supports advanced font shaping, which, amongst other things, allows for multiple characters/glyphs to be combined into one ligature. You may be experiencing this if, e.g., != becomes rendered as in wezterm.

If you are seeing this kind of "font combining" and wish to disable it, then this is documented in advanced font shaping options page.

How to troubleshoot keys that don't work or produce weird characters!?

There are a number of layers in input processing that can influence this.

The first thing to note is that wezterm will always and only output UTF-8 encoded text. Your LANG and locale related environment must be set to reflect this; there is more information on that above.

If the key in question is produced in combination with Alt/Option then this section of the docs describes how wezterm processes Alt/Option, as well as options that influence that behavior.

The next thing to verify is what byte sequences are being produced when you press keys. I generally suggest running xxd, pressing the relevant key, then enter, then CTRL-D. This should show a hex dump of the the byte sequence. This step helps to isolate the input from input processing layers in other applications.

Interactive Unix programs generally depend upon the TERM environment variable being set appropriately. wezterm sets this to xterm-256color by default, because wezterm aims to be compatible with with the settings defined by that terminfo entry. Setting TERM to something else can change the byte sequences that interactive applications expect to see for some keys, effectively disabling those keys.

On top of this, a number of programs use libraries such as GNU readline to perform input processing. That means that settings in your ~/.inputrc may changing the behavior of bash. Verify any settings in there that might influence how input is resolved and see the question below about convert-meta!

If you are using tmux be aware that it introduces its own set of input/output processing layers that are also sensitive to LANG, TERM and locale and how they are set in the environment of the tmux server when it was spawned, the tmux client and inside the processes spawned by tmux. It is generally best to troubleshoot input/output weirdness independent of tmux first to minimize the number of variables!

If after experimenting with your environment and related settings you believe that wezterm isn't sending the correct input then please open an issue and include the xxd hexdump, and output from env and any other pertinent information about what you're trying and why it doesn't match your expectations.

I have set convert-meta on in my ~/.inputrc and latin characters are broken!?

That setting causes Readline to re-encode latin-1 and other characters as a different sequence (eg: £ will have the high bit stripped and turn it into #).

You should consider disabling that setting when working with a UTF-8 environment.

How do I enable undercurl (curly underlines)?

Starting in version 20210314-114017-04b7cedd, WezTerm has support for colored and curly underlines.

The relevant escape sequences are:

 CSI 24 m   -> No underline
 CSI 4 m    -> Single underline
 CSI 4:0 m  -> No underline
 CSI 4:1 m  -> Single underline
 CSI 4:2 m  -> Double underline
 CSI 4:3 m  -> Curly underline
 CSI 4:4 m  -> Dotted underline
 CSI 4:5 m  -> Dashed underline

 CSI 58:2::R:G:B m   -> set underline color to specified true color RGB
 CSI 58:5:I m        -> set underline color to palette index I (0-255)
 CSI 59              -> restore underline color to default

You can try these out in your shell; this example will print the various underline styles with a red underline:

$ printf "\x1b[58:2::255:0:0m\x1b[4:1msingle\x1b[4:2mdouble\x1b[4:3mcurly\x1b[4:4mdotted\x1b[4:5mdashed\x1b[0m\n"

To use this in vim, add something like the following to your .vimrc:

let &t_Cs = "\e[4:3m"
let &t_Ce = "\e[4:0m"
hi SpellBad   guisp=red gui=undercurl guifg=NONE guibg=NONE \
     ctermfg=NONE ctermbg=NONE term=underline cterm=undercurl ctermul=red
hi SpellCap   guisp=yellow gui=undercurl guifg=NONE guibg=NONE \
     ctermfg=NONE ctermbg=NONE term=underline cterm=undercurl ctermul=yellow

If you are a neovim user then you will need to install a terminfo file that tells neovim about this support.

You may wish to try these steps to install a copy of a wezterm terminfo file; this will compile a copy of the terminfo and install it into your ~/.terminfo directory:

tempfile=$(mktemp) \
  && curl -o $tempfile https://raw.githubusercontent.com/wezterm/wezterm/master/termwiz/data/wezterm.terminfo \
  && tic -x -o ~/.terminfo $tempfile \
  && rm $tempfile

With that in place, you can then start neovim like this, and it should enable undercurl:

env TERM=wezterm nvim

Note: on Windows, the ConPTY layer strips out the curly underline escape sequences. If you're missing this feature in your WSL instance, you will need to use either wezterm ssh or multiplexing to bypass ConPTY.

I use Powershell for my shell, and I have problems with cursor keys in other apps

Powershell has an open issue where it enables the DECCKM mode of the terminal and does not restore it prior to launching external commands.

The consequence of enabling DECCKM is that cursor keys switch from being reported as eg: ESC [ A (for UpArrow) to ESC O A.

Some applications don't know how to deal with this and as a consequence, won't see the cursor keys.

This is not an issue in WezTerm; the same issue manifests in any terminal emulator that runs powershell.

I use X11 or Wayland and my mouse cursor theme doesn't seem to work

What is this old school X11 mouse pointer thing?!

Resolving the mouse cursor style in these environments is surprisingly complicated:

  • Determine the XCursor theme:

    1. is xcursor_theme set in the wezterm configuration?
    2. X11: Does the root window publish the XCursor.theme resource? (You can manually run xprop -root | grep RESOURCE_MANAGER | perl -pe 's/\\n/\n/g' | grep -i cursor to check for yourself)
    3. Wayland: from the XCURSOR_THEME environment variable
    4. Otherwise, assume default
  • Determine the icon path:

    1. Is XCURSOR_PATH set in the environment? If so, use that.
    2. Construct a default path derived from some hard coded locations and the contents of the XDG_DATA_HOME and XDG_DATA_DIRS environment variables.

When a cursor is needed, the XCursor theme is tried first:

  1. X11: the X Server must support the RENDER extension, version 0.5 or later, and support ARGB32
  2. A set of candidate cursor names is produced for the desired cursor
  3. For each location in the icon path, the XCursor theme and the candidate name are combined to produce a candidate file name
  4. If the file exists, then wezterm will try to load it

If no XCursor was found, wezterm will fall back to using the default X11 cursor font provided by the system.

{{since('20220624-141144-bd1b7c5d')}}

When troubleshooting xcursor issues, you can enable tracing by turning on the log level shown below, and then moving the mouse over the wezterm window:

; WEZTERM_LOG=window::os::x11::cursor=trace wezterm
07:34:40.001  TRACE  window::os::x11::cursor > Constructing default icon path because $XCURSOR_PATH is not set
07:34:40.001  TRACE  window::os::x11::cursor > Using ~/.local/share because $XDG_DATA_HOME is not set
07:34:40.001  TRACE  window::os::x11::cursor > Using $XDG_DATA_DIRS location "/home/wez/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share:/usr/local/share/:/usr/share/"
07:34:40.001  TRACE  window::os::x11::cursor > icon_path is ["/home/wez/.local/share/icons", "/home/wez/.icons", "/home/wez/.local/share/flatpak/exports/share/icons", "/var/lib/flatpak/exports/share/icons", "/usr/local/share/icons", "/usr/share/icons", "/usr/share/pixmaps", "/home/wez/.cursors", "/usr/share/cursors/xorg-x11", "/usr/X11R6/lib/X11/icons"]
07:34:41.838  TRACE  window::os::x11::cursor > candidate for Some(Text) is "/home/wez/.local/share/icons/Adwaita/cursors/xterm"
07:34:41.838  TRACE  window::os::x11::cursor > candidate for Some(Text) is "/home/wez/.icons/Adwaita/cursors/xterm"
07:34:41.839  TRACE  window::os::x11::cursor > candidate for Some(Text) is "/home/wez/.local/share/flatpak/exports/share/icons/Adwaita/cursors/xterm"
07:34:41.839  TRACE  window::os::x11::cursor > candidate for Some(Text) is "/var/lib/flatpak/exports/share/icons/Adwaita/cursors/xterm"
07:34:41.839  TRACE  window::os::x11::cursor > candidate for Some(Text) is "/usr/local/share/icons/Adwaita/cursors/xterm"
07:34:41.839  TRACE  window::os::x11::cursor > candidate for Some(Text) is "/usr/share/icons/Adwaita/cursors/xterm"
07:34:41.839  TRACE  window::os::x11::cursor > Some(Text) resolved to "/usr/share/icons/Adwaita/cursors/xterm"
07:34:42.915  TRACE  window::os::x11::cursor > candidate for Some(Arrow) is "/home/wez/.local/share/icons/Adwaita/cursors/top_left_arrow"
07:34:42.915  TRACE  window::os::x11::cursor > candidate for Some(Arrow) is "/home/wez/.local/share/icons/Adwaita/cursors/left_ptr"
07:34:42.915  TRACE  window::os::x11::cursor > candidate for Some(Arrow) is "/home/wez/.icons/Adwaita/cursors/top_left_arrow"
07:34:42.915  TRACE  window::os::x11::cursor > candidate for Some(Arrow) is "/home/wez/.icons/Adwaita/cursors/left_ptr"
07:34:42.915  TRACE  window::os::x11::cursor > candidate for Some(Arrow) is "/home/wez/.local/share/flatpak/exports/share/icons/Adwaita/cursors/top_left_arrow"
07:34:42.915  TRACE  window::os::x11::cursor > candidate for Some(Arrow) is "/home/wez/.local/share/flatpak/exports/share/icons/Adwaita/cursors/left_ptr"
07:34:42.916  TRACE  window::os::x11::cursor > candidate for Some(Arrow) is "/var/lib/flatpak/exports/share/icons/Adwaita/cursors/top_left_arrow"
07:34:42.916  TRACE  window::os::x11::cursor > candidate for Some(Arrow) is "/var/lib/flatpak/exports/share/icons/Adwaita/cursors/left_ptr"
07:34:42.916  TRACE  window::os::x11::cursor > candidate for Some(Arrow) is "/usr/local/share/icons/Adwaita/cursors/top_left_arrow"
07:34:42.916  TRACE  window::os::x11::cursor > candidate for Some(Arrow) is "/usr/local/share/icons/Adwaita/cursors/left_ptr"
07:34:42.916  TRACE  window::os::x11::cursor > candidate for Some(Arrow) is "/usr/share/icons/Adwaita/cursors/top_left_arrow"
07:34:42.917  TRACE  window::os::x11::cursor > Some(Arrow) resolved to "/usr/share/icons/Adwaita/cursors/top_left_arrow"

I'm on macOS and wezterm cannot find things in my PATH

On macOS, wezterm is typically launched directly by the Finder process and inherits the default and fairly sparse macOS PATH environment. That's sufficient for launching your shell, which is then responsible for processing your rcfiles and setting up your PATH.

However, if you want wezterm to directly spawn some other utility that isn't in that basic PATH, wezterm will report that it cannot find it.

Probably the easiest to maintain solution is to change something like:

wezterm.action.SpawnCommandInNewWindow {
  args = { 'nvim', wezterm.config_file },
}

so that it explicitly spawns the command using your shell:

wezterm.action.SpawnCommandInNewWindow {
  args = {
    os.getenv 'SHELL',
    '-c',
    'nvim ' .. wezterm.shell_quote_arg(wezterm.config_file),
  },
}

another option is to explicitly use the full path to the program on your system, something like:

wezterm.action.SpawnCommandInNewWindow {
  args = {
    wezterm.home_dir .. '/.local/bob/nvim-bin/nvim',
    wezterm.config_file,
  },
}

and another other option is to explicitly set the PATH up:

config.set_environment_variables = {
  -- prepend the path to your utility and include the rest of the PATH
  PATH = wezterm.home_dir .. '/.local/bob/nvim-bin:' .. os.getenv 'PATH',
}

and yet another option is to configure launchd to use a more expansive PATH for all processes in your user session using launchctl config user path doing something like this:

$ sudo launchctl config user path <my path setting>

!!! warning Take care with setting the user path using this technique, as if you change that path in a way that system-provided utilities are lower priority than alternative software that you have installed, you may unexpectedly change the overall system behavior.

See also:

Getting Help

This is a spare time project, so please bear with me. There are a couple of channels for support:

The GitHub Discussions and Element/Gitter rooms are better suited to questions than it is to bug reports, but don't be afraid to use whichever you are most comfortable using and we'll work it out.

Contributing

Thanks for considering donating your time and energy! I value any contribution, even if it is just to highlight a typo.

If you're thinking of helping out, then the following resources may be helpful:

I like to think that I have an open mind and I try to be open to ideas, suggestions and other improvements. We can discuss in realtime in the Matrix/Gitter room or we can do it asynchronously via the issue tracker on GitHub.

You needn't be a crack Rust coder; if you spot a typo or feel like you can see a way to improve these docs or have a talent for design and would like to help make WezTerm look cooler, I'd also welcome your contribution!


hide: - navigation toc_depth: 3

changelog

Changes

Releases are named using the date, time and git commit hash.

Continuous/Nightly

A bleeding edge build is produced continually (as commits are made, and at least a daily scheduled build) from the main branch. It may not be usable and the feature set may change, but since @wez uses this as a daily driver, its usually the best available version.

As features stabilize some brief notes about them will accumulate here.

Changed

  • Wayland: currently being reimplemented, it maybe more unstable than usual. Please file GH issues for any problems you see. Many thanks to @tzx and @tmccombs! #4777 #5781
  • show_update_window has been deprecated; it no longer has any effect and will be removed in a future release.
  • X11: drag and drop is now supported for files, URLs and text. Thanks to @ssiegel! #5316 #640
  • Added Unicode Symbols for Legacy Computing to the set of pixel-perfect block drawing glyphs. See custom_block_glyphs for more details. Thanks to @stribor14! #5051 #5169
  • Switched to the nucleo fuzzy matcher which produces matches that more closely match the popular fzf program. #5532
  • The Copy Mode Close action no longer implicitly scrolls to the bottom. This is to facilitate having a key assignment that closes copy mode without adjusting the viewport position. You can compose multiple actions together using Multiple if you wish; the default key assignments in Copy Mode use this technique so that the effective behavior of the defaults remains unchanged. Thanks to @LeszekSwirski! #4924 #3502
  • Improved startup performance on X11. Thanks to @blukai! #5923 #5802
  • There is now an upper bound of 999,999,999 for scrollback_lines. Thanks to @x3ro! #5996
  • Migrated serial support to the serial2 rust crate. This opens the door to more convenient serial support going forward. Thanks to @jeevithakannan2! #6411 #6460
  • macOS: The wezterm terminfo file is now compiled and bundled in the application bundle. Thanks to @ddeville! #6538
  • wezterm record now has a -o outputfile option. Thanks to @Tyarel8! #6626
  • ShowTabNavigator now defaults to selecting the active tab. Thanks to @mgpinf! #6320
  • macOS: toast notifications now use UNUserNotificationCenter. This requires that WezTerm.app be code-signed, which is the case for official binaries.
  • ShowLauncherArgs now allows customizing the help text. Thanks to @mgpinf! #6606
  • Preliminary support for ConEmu style progress escape sequences. See pane:get_progress() for more information. #6581

New

  • wezterm.serde module for serialization and deserialization of JSON, TOML and YAML. Thanks to @expnn! #4969
  • wezterm ssh now supports agent forwarding. Thanks to @Riatre! #5345
  • SSH multiplexer domains now support agent forwarding, and will automatically maintain SSH_AUTH_SOCK to an appropriate value on the destination host, depending on the value of the new mux_enable_ssh_agent option. ?988 #1647
  • default_ssh_auth_sock option to manage SSH_AUTH_SOCK.
  • Search mode: now supports richer line editing. Thanks to @Mrreadiness and @kenchou! #5416 #3087
  • show_close_tab_button_in_tabs option for the fancy tab bar. Thanks to @zummenix! #3818
  • wezterm-ssh now supports ProxyUseFdPass. Thanks to @loops! #6103 #6093
  • PromptInputLine now supports a optional prompt and initial_value parameters. Thanks to @mgpinf and @ekorchmar! #6054 #6007
  • Support Unicode 16 octant characters when custom_block_glyphs is enabled. Thanks to @eschnett! #6502 #6494
  • window_content_alignment option to control where the excess pixel gap will be placed when the window is not a multiple of the cell dimensions. Thanks to @Shiphan! #6629 #1124
  • New MACOS_FORCE_SQUARE_CORNERS option for window_decorations. Thanks to @amadeusdotpng! #6587 #2182
  • QuickSelectArgs has new skip_action_on_paste option. Thanks to @nhurlock! #6405
  • Docs for writing Plugins. Thanks to @alecthegeek and @MLFlexer! #6188

Fixed

  • Race condition when very quickly adjusting font scale, and other improvements around resizing. Thanks to @jknockel! #4876 #5032 #5033
  • macOS: wacky initial window size with external monitors or certain font sizes. #4966 #4250
  • macOS: dragging non-filename data over wezterm could cause it to crash. #4771
  • New tabs spawned by the gui could spawn into the wrong domain when using multiplexing together default_domain. Thanks to @bogdan2412! #4994
  • Linux: the divine_process_list fallback function used the vmwisze rather than the intended starttime field to decide which process was the youngest. Thanks to @crides! #5001
  • Wayland: fixed startup on Hyprland >= 0.37.0. Thanks to @fioncat! #5264 #5103
  • Wayland: updated to SCTK 0.19. Thanks to @deviant and @tmccombs! #5276 #5154 #5079 #5071 #4604 #5209 #5781
  • Windows: Window buttons stopped working when using win32_system_backdrop. Thanks to @Kushagra2569! #5362 #5348
  • wezterm cli activate-pane now respects unzoom_on_switch_pane. Thanks to @quantonganh! #5306 #5305
  • wezterm-ssh now correctly handles two-phase processing of %h tokens. Thanks to @emc2314 and @wheatdog! #5163 #4503
  • We now respect line wrapping in alt-screen mode. Thanks to @eternity74! #5396 #3283
  • Wayland: hang when launched under ChromeOS Crostini. Thanks to @dberlin! #5393 #5397
  • macOS: Fixed notch avoidance padding in full screen mode. Thanks to @mbaird! #5515 #3807
  • Render invalidation issue when closing tabs other than the last tab. Thanks to @Mrreadiness! #5441 #5304
  • Search mode now accepts composed input from the IME. Thanks to @kenchou! #5564
  • Quick select mode will now accept unix paths with // in them. #5763
  • blob leases (for image rendering) could be removed by temporary directory cleaners, resulting in issues with rendering. We no longer store these in a pure temporary directory; they live in a cache dir, and if someone does remove or truncate these files, we now convert that error case into blank frame(s). #5422 #4657
  • PaneInformation object returned pixel_width when asked to return the pixel_height.
  • ssh: we now explicitly kill and reap the ProxyCommand associated with an ssh session. Thanks to @daaku! #5494 #5479
  • default_ssh_domains() didn't use the default local echo threshold for ssh domains. #5547
  • multiplexer: internal PKI certificate now supplements its list of "Subject Alternative Names" with the list of canonical hostnames returned for the local system via getaddrinfo. #5543
  • DECSLRM incorrectly clamped the left margin based on the terminal height instead of the terminal width. Thanks to @j4james and @tmccombs! #5871 #5750
  • Scrollback position was incorrectly advanced when in alt-screen mode. Thanks to @tbung and @loops! #6099 #4607 #6186
  • Wayland: Fixed potential panic on startup when monitors have changed are in the process of hot plugging when wezterm starts. Thanks to @loops! #6084
  • macOS: explicitly set the window to sRGB colorspace to resolve incorrect colors on non-sRGB monitors. Thanks to @rianmcguire! #6063 #5824
  • The bell would ring each window instead of just the window containing the pane where the bell is ringing. Thanks to @loops! #6012 #5985
  • x11: transient errors in obtaining/setting the selection could cause wezterm to exit. Thanks to @loops! #6135 #5482 #6128
  • Wayland: potential panic when working with the clipboard. Thanks to @rengare! #5518
  • multiplexer: could lose track of delta updates if the display changed while the current delta was being computed. Thanks to @loops! #5981
  • Plugins: normalize the plugin path to exclude trailing slashes. Thanks to @joncrangle! #5883
  • zooming a tab might not work if you also recently used pane:activate(). Thanks to @SpyMachine! #5964 #5928
  • pane:current_working_dir.file_path returned incorrect results for paths that contained # or ? characters. Thanks to @loops! #6158 #6171
  • wayland: issues with losing maximized or tiled state when switching between applications. Thanks to @aliaksandr-trush! #4568 #5897
  • Mouse multiple button click requires pixel precision. Thanks to @jbiosca78! #6475 #6476
  • background image with width/height set to Contain used the wrong aspect ratio. Thanks to @saltkid! #6554 #3708 #4407
  • wayland: hide_cursor: Missing enter event serial error. Thanks to @jmbaur! #6548 #5760
  • wayland: issue tiled and maximized window states. Thanks to @aliaksandr-trush! #6545 #6262
  • wayland: potential crash on monitors with scale > 1. Thanks to @MaeIsBad! #6508 #5406
  • Opening an InputSelector while some other overlay was active could result in an error. Thanks to @mikkasendke! #6403
  • Improved handling of implicit hyperlinks with parentheses. Thanks to @psyclaudeZ! #6391
  • macOS: Key repeat would stop when switching between held keys when use_ime was enabled. Thanks @psyclaudeZ! #6391 #4061
  • wezterm cli split-pane --move-pane-id could kill panes. Thanks to @scauligi! #6028 #6029
  • Glyph '┽', was rendering as '┥' when custom_block_glyphs was enabled. Thanks to @bew! #6661 #6655

Updated

20240203-110809-5046fc22

Changed

  • The default for freetype_load_flags is now NO_HINTING when the dpi is >= 100, otherwise DEFAULT. #4902
  • wezterm -e will now wait for the spawned program to terminate before it will itself terminate. Thanks to @vimpostor! #4535 #4523
  • Reverted the text cursor cell dimension change due to overwhelming and sometimes toxic feedback. #2882

New

  • We now show the Lua version in the debug overlay. Thanks to @bbkane! #4943
  • wezterm start --new-tab and wezterm connect --new-tab to request a new tab rather than a new window when spawning via an existing GUI instance. The new prefer_to_spawn_tabs option allows you to make this happen by default. ?4854 ?4946

Fixed

  • It was not possible to specify freetype_load_flags = 'DEFAULT'. #4902
  • macOS: fallback fonts could select thin or otherwise unspecified font attributes. #4808
  • Changing the palette via escape sequences didn't invalidate caches correctly, so those escapes sequences wouldn't take effect. #4932 #2635
  • Unix: spawning a command using a relative path, with the cwd set to a directory that contains a directory with the same name as the relative path to the command would fail with an obscure error message. #4920
  • x11: incorrect handling of the space key when grp:win_space_toggle was enabled via setxkbmap. #4910
  • wezterm set-working-directory and wezterm imgcat didn't correctly apply tmux passthrough escape encoding. #4940
  • Tab bar wouldn't immediately reflect the result of calling tab:set_title. #4941
  • Command Palette: Missing space between keycaps on macOS. #4885
  • macOS: stale/invalid cwd used when spawning new panes when shell integration is NOT in use. #4811
  • Command Palette: would show default key assignments next to actions even if disable_default_key_bindings was configured. #4724

20240128-202157-1e552d76

Changed

Fixed

  • macOS: System LastResort font would be taken in preference to other fonts in some cases when trying to find the fallback for bold fonts. #4877
  • The fancy tab bar could take a few moments to update after closing a tab. #4880
  • Kitty Image Protocol: fixed numerous issues. Thanks to @jonboh! #1156 #1663 #2084 #2422 #2761 #3918 #4233 #4847

20240127-113634-bbcac864

Changed

  • The default for front_end is now WebGpu.
  • The return type of pane.get_current_working_dir and PaneInformation.current_working_dir has changed to the new Url object, which makes it easier to handle things like percent-encoding for paths with spaces or non-ASCII characters. Please see the revised example on set_right_status for example usage with backwards compatibility in mind. #4000
  • Added split out github short codes from the various charselect sections into their own new Short Codes section.
  • CharSelect now shows emoji variations such as skin tones
  • Improved fuzzy matching performance in CharSelect
  • PaneSelect new modes MoveToNewTab, MoveToNewWindow, and SwapWithActiveKeepFocus, as well as show_pane_ids=true to show the pane ids. #4147 #3014
  • Nightly .deb packages are now named wezterm-nightly rather than wezterm, and are set to conflict with wezterm.
  • Allow window_frame colors now allow specifying the alpha channel value, which enables transparent fancy tab bar backgrounds. ?4816 #3580 ?4311

New

Fixed

  • Command Palette was using now-invalid Nerd Font 2.0 symbols for macOS keyboard shortcuts. #3988
  • Windows: couldn't use shifted keys like ( in the Debug Overlay. #3999
  • X11: fd leak on each call to wezterm.gui.enumerate_gpus. #3612
  • Charselect and repl recency/history were not persisted across restarts. #4047 ?4019
  • macOS: system font fallback didn't always find a workable fallback font. #4099 #849
  • F13-F24 keys are now supported. Thanks to @ovidiu-ionescu! #3937
  • Strikethrough position was not centered when setting line_height #4196
  • Text cursor filled the scaled-by line_height and cell_width dimensions rather than the native font dimensions and looked weird when either config option was not set to 1.0. #2882
  • Using CloseCurrentPane could sometimes leave a stranded pane in a tab. #4030
  • Wayland: wezterm wouldn't start on Plasma 6 or newer versions of sway. Thanks to @hexchain! #3996 #4322.
  • font-config: when resolving a fallback font for a text cluster like U+3065,U+2686 where no single font contains both glyphs, wezterm would fail to show a glyph for either codepoint. We now split the fallback query up and query for each individual codepoint separately. #4310
  • Gogh color schemes all had the incorrect cursor foreground color. #4257
  • Windows: crash on Windows 11 when using DX 12 with the WebGpu frontend. #4279
  • macOS: Leak of NSWindow and NSView objects. Thanks to @0f-0b! #4457
  • Initial G1 state is non-conformant. Thanks to @ninjalj! #4534 #3962
  • Make RIS also clear the alternate screen. Thanks to @ninjalj! #4563
  • DECRQCRA: treat uninitialized cells as spaces. Thanks to @ninjalj! #4565
  • Clamp cursor position reported by CPR. Thanks to @ninjalj! #4564
  • Correct SUPER modifier key handling in kitty protocol. Thanks to @gabyx! #4605
  • macOS: honor the window_close_confirmation config option when quitting the application. Thanks to @quantonganh! #4420 #4362
  • terminfo: added missing terminator to Sync capability. Thanks to @gpanders! #4578
  • bracketed paste escape sequences are now always stripped out of text that is pasted into the terminal. This happens even if bracketed paste mode is disabled. #4765
  • Sixel parser ignores P2 parameter if P1 is blank. Thanks to @joouha! #4730
  • X11: synthesize raw modifiers to resolve some issues with synthetic/injected key press events experienced by Espanso. Thanks to @bew! #4151 #3840
  • freetype_load_target had no effect. Thanks to @dkoukola! #4775 #4770
  • Incorrect sunset / sunrise progression. Thanks to @mikyk10! #4809 #4810
  • retro tab bar indented too far on macOS when using integrated titlebar buttons. Thanks to @0xdead10cd! #4505
  • x11/wayland: avoid including keysym name in deadkey compose cursor. #4511
  • Mouse wheel scrolling now works correctly when hovering over the inactive pane. Thanks to @tradiff! #4339 #2373
  • Scrolling glitch in Command Palette, Launcher and InputSelector. Thanks to @metiftikci! #4839
  • Pane resizing, especially around zooming, could sometimes leave artifacts due to a cache invalidation issue. #4828
  • X11: Fix an issue where SHIFT and other modifiers could be inaccurate for automated or high speed keyboard inputs. #4615 #3840
  • X11: can now paste STRING (latin-1) data from the clipboard, in addition to UTF-8 string data. #4402
  • use_resize_increments now accounts for window padding. Thanks to @jknockel! #4824
  • Bar shaped text cursors are now rendered above text. Thanks to @ErrorNoInternet! #4850
  • format-tab-title event was triggered excessively for background tabs/panes. Thanks to @crides for investigating! #4788

Updated

20230712-072601-f4abf8fd

Changed

  • The default for adjust_window_size_when_changing_font_size now depends on the window environment and the contents of tiling_desktop_environments.
  • Added eigth block corner glyphs to custom block glyphs. Thanks to @joouha! #3559
  • Don't hide mouse cursor when pressing only modifier keys. #3570
  • PaneSelect will now un-zoom to show all panes, then re-zoom after performing its action. #3573
  • Images, especially animated images, are now decoded in the background. When used as a background layer for the terminal, we now use the normal terminal background color as a placeholder until the first frame has been decoded. In other circumstances, you may observe a brief black frame while waiting for the image to decode.
  • You may now use CTRL-J/K to change the selection in the launcher menu, in addition to CTRL-N/P which always worked previously. #3909
  • Duplicate entries in CharSelect are now suppressed, making it less cluttered. Thanks to @vimpostor! #3674

New

Fixed

  • Modals, such as CharSelect and CommandPalette did not respect alternative OS-level key maps. #3470
  • X11/Wayland: CTRL-key presses for non-US latin keymaps regressed due to changes to improve handling of CTRL-key presses for non-latin layouts. #3610
  • Numerous issues with the kitty keyboard protocol implementation #2546 #3220 #3315 #3473 #3474 #3476 #3478 #3479 #3484 #3526
  • mux: Attempting to spawn into an ad-hoc SSH domain after the last tab could fail with a cryptic error message. The connection is now re-established. ?3480
  • Laggy behavior when processing a continual stream of output, for example, serial data received at a rate of 1 byte just slightly faster than mux_output_parser_coalesce_delay_ms (3ms by default). Thanks to @pcc! #3497 #3466 #837.
  • user-var-changed event would incorrectly trigger for every GUI window, rather than just the GUI window which contained the pane in which the variable was changed. #3524
  • PNG images without an alpha channel, or that were grayscale, could not be displayed by in the terminal. #3529 #3742
  • tab width calculation when returning a string with embedded escape sequences from a format-tab-title event handler. #3481
  • Windows: clicking the maximize button didn't work unless using integrated titlebar buttons. #3499
  • Windows: closing a window while the debug overlay was active could leave a lingering wezterm-gui.exe running. #3522
  • Windows: inconsistencies with win32 input mode. Thanks to @kreudom! #2235
  • macOS: font size is zoomed or window appears empty when first launched on a secondary monitor with different scaling settings from the primary monitor. #3503
  • X11/Wayland: CTRL/ALT didn't work as expected for non-latin keyboard layouts. #2845
  • X11: panic after a lot of horizontal touchpad scrolling. #3564
  • Wayland: mouse cursor wouldn't reappear after keyboard input hides it. #3334
  • WebGPU: window_background_opacity was not always enabled when using a vulkan backend. #3589
  • macOS: hang or crash when trying to copy or right click the about dialog. The about dialog has been replaced with a menu item that you can click to copy the version number. #3507 #3585
  • Synthesized italics were double-skewed. Thanks to @rozbb! #3613 #3555
  • Panic when using corrupt/invalid webp images as window background #3614
  • imgcat broken when using wezterm ssh. #3624
  • macOS: pasting file(s) will now paste the quoted full path(s) rather than just the basename of the path. Thanks to @junnplus! #3663 #3665
  • WebGpu: don't panic when trying to allocate a texture larger than is supported by the GPU. #3713
  • CopyMode("EditPattern") didn't switch the key table to search_mode #3746.
  • Windows: access denied error when using wezterm.plugin.require. Thanks to @nyxkrage! #3767
  • Windows: when shell integration was used, the last line of output could get overwritten due to a conpty issue. #3531
  • Changing the color palette back to the default without resetting the terminal would prevent changes to color_scheme from taking effect. #3685
  • ClearToEndOfLine performed in the last column of the display, when it is prepped to wrap to the next line, would incorrectly clear the last cell. #3548
  • WEZTERM_UNIX_SOCKET didn't get set when using wezterm start -- something. #3679
  • Pasting large amounts of text in helix caused issues. #3683
  • Wayland: Copying to clipboard was not always successful when triggered by the keyboard. Thanks to @osandov! #3929
  • wezterm ssh connection errors were not shown; the window would close immediately with the default exit_behavior setting. Now ssh sessions override exit_behavior="CloseOnCleanExit" while connecting so that error information can be displayed. #3941
  • Divide by zero panic with lots of splits and resizing panes. #3921
  • Spawn failures were not shown; the window would close immediately with the default exit_behavior setting. Now local commands override exit_behavior="CloseOnCleanExit" if the command fails to spawn, and a more detailed error message is shown explaining what failed. #3928 #3950
  • macOS: middle mouse button dragging. Thanks to @JacobMalloy! #3908
  • Attempting to spawn a non-local domain via the mux server would fail with invalid domain because none of the additional domains from your config were registered with the mux server. #3907

Updated

20230408-112425-69ae8472

Changed

  • macOS: Japanese IME users: CTRL-modified keys are no long routed to the IME by default, as it introduced problems with CTRL-key combinations for other users. A new macos_forward_to_ime_modifier_mask option has been introduced to allow you to control which modifier keys get routed to the IME, so that you can opt back in to that behavior. #2630 #2771 #2435
  • Multiplexer client can now send the locally configured color palette to the mux server, which makes it more straightforward to configure color schemes when using multiplexing.
  • Multiplexer: closing a window that has any mux client panes will now detach the associated domain(s) on close. Previous behavior was to treat just the panes in the window as detached without actually detaching the whole domain, which would cause the window to recycle and activate a different workspace. With a definitive detach, the window will close and wezterm will terminate if the only panes were associated with that domain, which is what most users expect. #2644
  • quick_select_patterns and hyperlink_rules now support backreferences and look around assertions. #3247
  • wezterm replay new options --explain-only, --cat. #3446

New

Fixed

  • mux: Stale remote window mapping could prevent spawning new tabs in remote domain. #2759
  • mux: Splitting then killing a pane could result in incorrect pane sizes. #3386
  • Windows: "error converting Lua string to &str" on systems with an ACP that was not compatible with UTF-8 when wezterm was placed in a directory with a non UTF-8, non-ASCII name. #3390
  • mux: --config related command line options passed to wezterm-mux-server were not propagated when using --daemonize. #3397 #2686
  • mux: server would lock and then unlock the pid/lock file when it re-executed, rendering it useless.
  • tab:panes_with_info() reported incorrect is_zoomed value. #3404
  • window:perform_action() now awaits the dispatch of the key assignment action, making it less racy to script multiple actions in a row. Note that clipboard operations are still asynchronous with respect to the dispatch of the assignment. #3405
  • window:perform_action() now correctly resolves overlay panes such as Copy Mode. #3209
  • macOS: CTRL-Q had to be pressed twice to register when use_ime=true. #2630
  • mux: tab:set_title() didn't get passed to the remote server, so any tab title changes were lost when reconnecting. #1598
  • wezterm connect --workspace WS DOM didn't use the provided workspace when starting up the mux server. #2734
  • mux: ClearScrollback was not forwarded to remote server. #2624
  • ssh: %r %h and %p tokens were implicitly supported by libssh but stopped working in ProxyCommand when we took over running the proxy command. #3437
  • mux: Improved latency for large window sizes. #1872
  • mux: pane:has_unseen_output() and PaneInformation.has_unseen_output now work with multiplexer panes. #2625
  • mux: attempting to split a remote pane into a different target domain could produce a warning about the remote home directory not being readable to the local machine or vice versa. #3442
  • wezterm.config_builder now works with table.insert(config.keys, {..})
  • mux: wezterm cli activate-pane-direction inconsistent behavior with remote mux. #3387 #3448
  • quick_select_patterns didn't take precedence over built-in rules. #3456
  • Painted pane background color behind the tab bar when there was only one pane. Matters when the tab bar is transparent! #3450
  • Wayland: window not repainting consistently when using the keyboard when using front_end="WebGpu". Thanks to @jokeyrhyme for working through different iterations of this fix! #3126
  • Windows: reloading the config could partially knock the window out of full screen mode. #3439

20230326-111934-3666303c

New

Fixed

  • ssh ProxyCommand didn't parse command lines containing = correctly. #3307
  • wezterm.GLOBALS.foo now supports __len and __pairs metamethods, as well as being passed to wezterm.json_encode
  • wezterm --skip-config resulted in an unexpected argument error, while wezterm -n still worked as intended. #3325
  • Using RESIZE|MACOS_FORCE_DISABLE_SHADOW or RESIZE|MACOS_FORCE_ENABLE_SHADOW would cause a spooky titlebar to appear. Thanks to @noefroidevaux! #3330
  • ConPTY: logical line wrapping falsely joining long runs of output from classic windows console subsystem programs. The behavior now is to only mark long lines as wrapped if the last character on the prior line is alphanumeric or ascii punctuation. Other characters will cause the logical line to break. #3278 #3177
  • wezterm cli activate-pane-direction didn't cause the gui to repaint, making it difficult to notice that the active pane had changed. Thanks to @ir-ae! #3303 #2879 #3323
  • window_frame.border_XXX not correctly accounted for when initially sizing the window, or when applying font scaling to a window. #3333
  • RIS escape sequence (and ResetTerminal action) didn't disable mouse event reporting.
  • Unblock all signals when spawning programs, to avoid strangess when the parent of the wezterm process spawns wezterm with an unusual signal mask.
  • Lingering openconsole.exe processes on Windows. Thanks to @mbikovitsky! #3339
  • macos: command line parameters beyond the first were treated as terminal command scripts and opened spurious windows. #3340
  • imgcat broken with multiplexer protocol #3343
  • wezterm cli activate-pane-direction would not cause the focus to change in the GUI when explicitly using multiplexing domains. #2863
  • macOS: update entitlements so that macOS will prompt the user when they spawn an app that wants to use the microphone and other resources. #3359
  • Command palette didn't show command label or arguments for entries constructed from your key assignments, making it difficult to distinguish them from each other. #3252
  • macOS: key assignments that were routed via the macOS menubar didn't guarantee to invalidate the associated window, making it look like they had no effect or hung. #3365
  • CTRL-SHIFT-R assignment in CharSelect mode didn't cycle back through the emoji categories as intended, but performed the global ReloadConfiguration action instead. #2947
  • mux: resizing the window larger, then spawning a tab, would result in the new tab having pixel dimensions of 0 and prevent imgcat from functioning until the tab was explicitly resized. #3366
  • mux: initial attach and spawn would leave the dpi at the assumed dpi resulting in incorrect image scaling for imgcat. #3366
  • mux: wezterm cli move-pane-to-new-tab didn't resync new window structure and would appear to have had no effect until you detached and re-attached. #3219
  • mux: wezterm cli move-pane-to-new-tab didn't forward the structural change to a remote mux, so if you ran it against the mux in your GUI, the state on the actual mux server was not updated. #3374

Updated

  • Bundled JetBrainsMono to 2.304. #3362

20230320-124340-559cb7b0

New

Fixed

  • X11: hanging or killing the IME could hang wezterm #2819
  • wezterm ssh now respects the AddressFamily option when connecting #2893
  • Windows: panic when minimizing a window when front_end='WebGpu' #2881
  • X11: wezterm.screens().active is now populated based on the currently focused window, rather than just copying the main screen data. Thanks to @NBonaparte! #2928
  • Resizing windows when overriding the dpi in the config would not respect the specified dpi. Thanks to @niclashoyer! #2914 #2978
  • Wayland: mouse cursor didn't auto-hide when typing. Thanks to @jmbaur! #2977
  • mux: default_workspace was not always respected when spawning #2981
  • window:active_key_table() now factors in pane-specific key table stacks for things like CopyMode. #2986
  • modal overlays like CharSelect and the command palette sometimes wouldn't render when first activated until pressing a key.
  • lag when making heavy use of foreground process information in tab titles. #2991
  • X11: always update selection owner even if our window already owns it #2926
  • command output would not be displayed if the command exited almost immediately after starting up.
  • Windows: ALT key was not recognized when processing mouse events. Thanks to @mbikovitsky! #3053
  • Copy Mode: MoveForwardWord not always moving to next line. thanks to @GZLiew! #2955
  • Wayland: fixup hidpi scaling when front_end="WebGpu". Thanks to @valpackett! #2877
  • Reloading the config while a pane was zoomed could result in visual artifacts #3068
  • SSH: Closing an individual pane via CloseCurrentPane would kill the remote pane but not detect that it had exited. #3095
  • Panic when decoding animated webp images #3250
  • Config was not applied to non-zoomed panes when config was reloaded #3259
  • Default hyperlink_rules now match URLs with port numbers #928
  • Incorrect cursor position after processing iTerm2 image escape sequence #3266
  • Images are now buffered to temporary files and decoded in background threads. This reduces the RAM overhead especially of long animations and reduces the render latency due to decoding frames; animations now render as soon as the first frame is decoded. #3263
  • Improved compatibility with the Kitty Image Protocol #2716
  • wezterm.time.call_after would not work when used in an event callback. #3026
  • Hover state not correctly indicated for retro tab bar when showing at the bottom of the window #3113

Changed

  • CTRL-SHIFT-P now activates the new command palette, instead of PaneSelect #1485
  • Window title reporting escape sequences are now disabled by default. See here for more details
  • Withdraw DEC private SGR escapes that affect superscript and subscript due to xterm/vim conflict mintty/#1189
  • Removed deprecated Copy, Paste and PastePrimarySelection actions. Use CopyTo and PasteFrom instead.
  • wezterm -e is now an alias for wezterm start. Thanks to @Abdiramen! #2889 #2782
  • bold_brightens_ansi_colors now supports "BrightOnly" to use the bright color without selecting a bold font. #2932
  • Color schemes: Gruvbox Dark was renamed to GruvboxDark and adjusted in the upstream iTerm2-Color-Schemes repo
  • Config warnings, such as using deprecated or invalid fields will now cause the configuration error window to be shown. Previously, only hard errors were shown, which meant that a number of minor config issues could be overlooked.
  • Referencing wezterm.GLOBAL now returns references rather than copies, making it less cumbersome to code read/modify/write with global state
  • wezterm start now accepts --domain and --attach options. wezterm connect DOMAIN is now implemented internally as wezterm start --domain DOMAIN --attach.
  • X11: spurious pointer focus events no longer influence terminal focus events. Thanks to @NBonaparte! #2959
  • Copy Mode: Added Home and End default assignments. Thanks to @cunha! #2762
  • wezterm.mux.spawn_window and SpawnCommandInNewWindow now accept a position field to control initial gui window position. #2976
  • X11/Wayland: Mouse based selection once again copies to both the clipboard and the primary selection. This was the original intended behavior but a regression in an earlier release changed it by accident and it's been annoying me ever since. You are welcome to define your own mouse bindings if you want to change that behavior.
  • WSL Domains returned from wezterm.default_wsl_domains now set default_cwd="~" #2826
  • wezterm now also searches $XDG_CONFIG_DIRS as well as $XDG_CONFIG_HOME when searching for config files. Thanks to @jmbaur! #3146
  • wezterm.time.call_after now accepts fractional numbers of seconds. #3287

Updated

  • Bundled harfbuzz updated to version 6.0.0
  • Bundled Nerd Font Symbols font to v2.3.3

20221119-145034-49b9839f

Improved

  • Reduced CPU and RAM utilization, reduced overhead of parsing output and rendering to the GPU.

New

Fixed

  • Wayland: key repeat gets stuck after pressing two keys in quick succession. Thanks to @valpackett! #2492 #2452
  • If the underline attribute was active and CRLF scrolled a new line into the bottom of the display, we'd fill that new line with underlines. #2489
  • Correctly invalidate the display when using wezterm.action.ClearScrollback("ScrollbackAndViewport") #2498
  • Hyperlinks didn't underline on hover #2496
  • base16 color schemes cursor fg/bg were the same. We now also set the indexed colors. Thanks to @valpackett! #2491
  • Panic when processing a sixel with inconsistent width information #2500
  • Cells with the invisible/hidden attribute are now invisible
  • Panic when trying to activate the search overlay when the launcher menu is active #2529
  • Overlays did not see config overrides set via window:set_config_overrides #2544
  • Closing a window while tab had a zoomed pane would leave the other panes untouched and wezterm would linger in the background #2548
  • CharSelect panic when pressing enter when no matches were found #2580
  • Panic when setting initial_rows or initial_cols to 0 #2593
  • X11: Crash on systems using DRI2 based Intel graphics #2559
  • Missing validation of conflicting domain names #2618
  • Creating tabs in a multiplexing domain could fail after previously closing all tabs connected to that domain in that window #2614
  • CharSelect now uppercases hex digit input for better compatibility with QMK-based keyboards that send eg: CTRL-SHIFT-U e 1 <ENTER>. #2581
  • Multiple active multiplexer client domain connections could result in showing duplicate tabs in a window #2616
  • Incorrect line width when applying hyperlink rules to a wrapped line containing double-wide cells. #2568
  • Incorrect shaping for U+28 U+FF9F #2572
  • Panic when hitting enter in launcher menu when no fuzzy results match #2629
  • Default CTRL-SHIFT-<NUM> assignments didn't work on Windows and X11 systems when key_map_preference = "Mapped" #2623
  • Panic when calling window:set_workspace when the default domain is a multiplexer domain. #2638
  • nvim's title and titlestring options don't work when TERM=wezterm. #2112
  • Horizontal wheel scrolling generated incorrect mouse events #2649
  • Cursor color changes did not always render #2708
  • Unable to set cursor on Wayland/X11 #2687 #2743
  • Default MoveTabRelative assignments were incorrectly set to SUPER+SHIFT+Page(Up|Down) instead of the documented CTRL+SHIFT+Page(Up|Down) #2705
  • Dragging by retro tab bar left or right status area would jump around erratically. #2758
  • Fixed background Cover algorithm. Thanks to @xiaopengli89! #2636
  • wezterm start --cwd . didn't use the cwd of the spawned process when the wezterm gui was already running. Thanks to @exactly-one-kas! #2661
  • IME composition text and cursor color incorrectly applied to all panes rather than just the active pane. #2569

Changed

  • Removed Last Resort fallback font
  • X11: use _NET_WM_MOVERESIZE to drag by tab bar, when supported by the WM #2530
  • tab:panes() and tab:panes_with_info() now return the full list of panes in the tab regardless of whether a pane was zoomed. Previously, if a pane was zoomed, only that pane would be returned by those methods.
  • macOS: CTRL-modified keys are now routed to the IME #2435
  • multiplexer: The lag indicator that gets overlaid on the pane content when waiting a long time for a response now defaults to disabled. It is recommended that you put it into your status bar, but you may re-enable the old way using overlay_lag_indicator = true in the appropriate domain configuration.
  • Added dummy -e command line option to support programs that assume that all terminal emulators support a -e option. Thanks to @vimpostor!. #2670 #2622 #2271
  • Windows: installer no longer prevents installing the x64 binary on arm64 systems. The x64 executable is installed and run via emulation. Thanks to @xeysz! #2746 #2667

Updated

  • Bundled Nerd Font Symbols font to v2.2.2
  • Bundled harfbuzz to 5.3.1

20220905-102802-7d4b8249

New

Changed

  • fontconfig: when locating a fallback font for a given codepoint, allow matching non-monospace fonts if we can't find any matching monospace fonts. #2468
  • os.getenv now knows how to resolve environment variables that would normally require logging out to update, such as SHELL (if you chsh on unix systeams), or those set through the registry on Windows. #2481
  • Searching is now incremental and shows progress. #1209

Fixed

  • Hangul in NFD incorrectly shaped #2482
  • Visual artifacts when resizing splits #2483

20220904-064125-9a6cee2b

  • Fix build on architectures where c_char is u8 instead of i8. Thanks to @liushuyu! #2480

20220903-194523-3bb1ed61

New

Changed

  • colors now override colors from your selected color_scheme. Previously, color_scheme was mutually exclusive with colors and always took precedence. The new behavior is more in line with what most people expect.
  • Reduced CPU utilization for busy/large screen updates, blinking cursor and other easing animations
  • ActivatePaneDirection now uses recency to resolve ambiguous moves #2374
  • update-status is a more general event for updating left or right status. update-right-status is considered to be deprecated in favor of update-status.
  • Cache XDG Portal Appearance values. Thanks to @vimposter! #2402
  • Compensate for TUI programs that flicker due to unsynchronized output by adding up to 3ms additional latency after each read to coalesce their screen outputs into a single frame. You can set this delay via a new mux_output_parser_coalesce_delay_ms option. #2443
  • win32: Updated openconsole/conpty to v1.14.2281.0

Fixed

  • macOS: crash on startup if $SHELL points to something that isn't executable. #2378
  • tab titles truncated too short #2379
  • bypass_mouse_reporting_modifiers stopped working (regression around new mouse binding logic) #2389
  • Entering IME-composed text would have no effect in wezterm ssh #2434
  • gui-startup event now also works with wezterm ssh
  • x and + buttons in the fancy tab bar are now always square #2399
  • middle clicking a tab to close it will now confirm closing using the same rules as CloseCurrentTab #2350
  • Emitting the tmux-style ESC k TITLE ST sequence via ConPTY breaks output for the pane #2442
  • Avoid using full path canonicalization for --cwd options #2449
  • Scroll to the bottom on mouse input when mouse reporting is enabled #2447
  • ssh: correctly expand %h ssh_config tokens #2448
  • ssh: CloseCurrentPane wouldn't release all resources associated with the pane and could lead to a too many open files error for a long running wezterm ssh session. #2466
  • mouse cursor is now reset to arrow when the mouse leaves the window #2471

20220807-113146-c2fee766

New

Changed

  • If timeout_milliseconds is specified in ActivateKeyTable, then the timeout duration is now reset each time a key press matches that key table activation. #1129
  • The lua examples in the docs are now syntax checked and formatted via Gelatyx and StyLua, thanks to @azzamsa! #2273 #2253
  • Internal scrollback datastructure improvements reduce per-cell overhead by up to ~40x depending on the composition of the line (lines with lots of varied attributes or image attachments will have more overhead).
  • Improved search performance
  • Quickselect: now defaults to searching 1000 lines above and below the current viewport, making it faster and the labels shorter for users with a larger scrollback. A new scope_lines parameter to QuickSelectArgs allows controlling the search region explicitly. Thanks to @yyogo for the initial PR! #1317
  • OSC 10, 11 and 12 (Set Default Text Background, Default Text Foreground Color, and Text Cursor Color) now support setting the alpha component #2313, and added CSI 38:6, CSI 48:6 and CSI 58:6 extensions to allow setting full color RGB with Alpha channel for spans of text.
  • Copy Mode: setting the same selection mode a second time will now toggle off that mode and clear the selection, preserving the current position #2246
  • Copy Mode: new default vim-style y "yank" key assignment will copy the selection and close copy mode

Fixed

  • ActivateKeyTable's replace_current field was not actually optional. Made it optional. #2179
  • winget causes toast notification spam #2185
  • wezterm connect sshdomain could hang on startup if password authentication was required #2194
  • colors.indexed would error out with Cannot convert String to u8. #2197
  • X11: closing a window when multiple were open could result in an X protocol error that closed all windows #2198
  • Config will now automatically reload after error. Previously, you would need to manually reload the config using ReloadConfiguration. #1174
  • Config will now automatically reload for changes made to required lua files. Previously, only the main config file and any files that you explicitly passed to add_to_config_reload_watch_list would trigger a reload.
  • macOS: numeric keypad enter generated CTRL-C instead of enter. Regression of #739. #2204
  • Wayland: inconsistent pasting. Thanks to @Funami580! #2225 #2226
  • win32 input mode: fixed encoding of backspace and delete keys. Thanks to @kreudom! #2233
  • Tab bar could glitch and show incorrect contents when adjusting for monitor or changed font scaling #2208
  • Wayland: transparent gap under tab bar when window is transparent, split and using per-pane color schemes #1620
  • Tab bar could show a gap to the right when resizing
  • Padding could show window background rather than pane background around split panes at certain window sizes #2210
  • Loading dynamic escape sequence scripts from the iTerm2-Color-Scheme dynamic-colors directory would only apply the first 7 colors
  • Unix: Clicking a URL when no browser is open could cause wezterm to hang until the newly opened browser is closed. #2245
  • Quickselect: now selects the bottom-most match rather than the top-most match. #2250
  • Mux: wezterm.mux.set_active_workspace didn't update the current window to match the newly activated workspace. #2248
  • Overlays such as debug and launcher menu now handle resize better
  • Shift-F1 through F4 generated different encoding than xterm #2263
  • X11/Wayland: apps that extract the Exec field from wezterm.desktop (such as thunar, Dolphin and others) can now simply concatenate the command line they want to invoke, and it will spawn in the their current working directory. Thanks to @Anomalocaridid! #2271 #2103
  • gui-startup now passes a SpawnCommand parameter representing the wezterm start command arguments.
  • Tab x button is no longer obscured by tab title text for long tab titles #2269
  • Cursor position could end up in the wrong place when rewrapping lines and the cursor was on the rewrap boundary #2162
  • Two or more panes closing at the same time could result in their containing tab hanging and being stuck with "no pane" for a title #2304
  • Visual Bell now fills out to the adjacent window edges rather than being constrained by the padding. #2364

Updated

  • Bundled harfbuzz to 5.1.0

20220624-141144-bd1b7c5d

New

Updated

  • Bundled harfbuzz to 4.3.0

Changed

  • Debian packages now register wezterm as an alternative for x-terminal-emulator. Thanks to @xpufx! #1883
  • Windows: wezterm will now read the default environment variables from the HKLM\System\CurrentControlSet\Control\Session Manager\Environment and HKCU\Environment and apply those to the base environment prior to applying set_environment_variables. #1848
  • Key Table lookups will now keep searching the activation stack until a matching assignment is found, allowing for layered key tables. #993
  • Search mode's search term is now remembered per-tab between activations of search mode. #1912
  • Quickselect no longer jumps to the bottom of the viewport when activated, allowing you to quickselect within the current viewport region
  • Quickselect now supports multi-line anchors such as ^ and $. #2008
  • Overriding config using the cli --config option will now error out and prevent starting up if unknown config options are specified, or if the value evaluates to nil. Unknown options continue to generate warnings (rather than errors) when observed in the config file so that you're not "locked out" of wezterm if you make a typo in the config file.
  • Windows: allow_win32_input_mode now defaults to true and enables using win32-input-mode to send high-fidelity keyboard input to ConPTY. This means that win32 console applications, such as FAR Manager that use the low level INPUT_RECORD API will now receive key-up events as well as events for modifier-only key presses. #1509 #2009 #2098 #1904
  • Wayland: enable_wayland now defaults to true. #2104
  • exit_behavior now defaults to "Close". #2105
  • Improved wezterm.action syntax for slightly more ergnomic and understandable key assignments. #1150

Fixed

  • Flush after replying to XTGETTCAP, DECRQM, XTVERSION, DA2, DA3 #2060 #1850 #1950
  • macOS: CMD-. was treated as CTRL-ESC #1867
  • macOS: CTRL-Backslash on German layouts was incorrect #1891
  • nf-mdi-contacts nerdfont symbol treated as zero-width #1864
  • X11/Wayland: CTRL-i, CTRL-j, CTRL-m misinterpreted as CTRL-Tab, CTRL-Enter, CTRL-Return #1851
  • Scrollbar stopped working after a lot of output scrolled outside of the scrollback limit. Thanks to @davidrios! #1866
  • Windows: uncommitted IME composition could get stuck when switching input methods. #1922
  • OSC sequences, such as those that change the window or tab title, that accept a single string parameter will now join multiple parameters together. This allows window and tab titles to contain a semicolon. Thanks to @kumattau! #1939
  • Unable to use ALT as a modifier for the leader key. #1958
  • IME Candidate window position was incorrect. Thanks to @kumattau and @aznhe21! #1976 #2001 #2022
  • Prevent panic for some classes of invalid input, found while fuzzing. Thanks to @5225225! #1990 #1986
  • Detaching an ssh multiplexer domain sometimes killed the associated panes! #1993
  • DecreaseFontSize wasn't quite the inverse of IncreaseFontSize. Thanks to @Funami580! #1997
  • Wayland: unable to paste text that was copied before starting the initial wezterm window. Thanks to @Funami580! #1994 #1385
  • Unicode NFD text could incorrectly render with repeated glyphs #2032
  • Windows: spawning new panes/tabs wouldn't automatically use the working directory of the current pane when OSC 7 was not being used #2036
  • Wayland: panic when display scaling is enabled. #1727
  • Dark+ color scheme background color #2013
  • Synthesized bold didn't kick in for automatically computed font_rules. #2074
  • Added freetype_pcf_long_family_names option to workaround PCF font naming issues on certain Linux distributions. #2100
  • X11/Wayland: wezterm.desktop now specifies StartupWMClass. Thanks to @uncomfyhalomacro! #2052 #2125
  • sudo -i in a pane would cause subsequent pane/tab creation to fail until the cwd was changed to an accessible directory #2120
  • X11: Fixed an issue where some events could get lost around resize events, especially prevalent when using the NVIDIA proprietary drivers. Thanks to @pjones123 and @yuttie for working through this! #1992 #2063 #2111 #1628
  • macOS: SHIFT-Tab and CTRL-SHIFT-Tab produced incorrect results #1902
  • X11: Fixed an issue where copy and paste between two wezterm windows could produce stale results. #2110
  • Mouse selection spanning multiple lines always included the first column even when the mouse was to the left of the first column. Thanks to @Funami580! #2106
  • Fonts: Codepoints for eg: symbol glyphs that were not explicitly listed in your font fallback list may not be resolved when used in styled (eg: bold) text. #1913 #2158

20220408-101518-b908e2dd

New

  • Key Tables feature for powerful modal key assignments
  • wezterm start --position x,y, wezterm start --position displayname:30%,30% option to control starting window position on all systems except for Wayland. See wezterm start --help for more info. #1794

Changed

  • Default key assignments are mapped: again. A new key_map_preference option allows the defaults to use "Mapped" or "Physical".
  • Disabled ligatures for "Monaco" and "Menlo" fonts, as those have "fi" ligatures that match even for words such as find. #1786 #1736
  • Removed the send_composed_key_when_alt_is_pressed option. When processing generic ALT (eg: that has neither left nor right), if either send_composed_key_when_left_alt_is_pressed or send_composed_key_when_right_alt_is_pressed is true, then the composed form of the key event will be generated.

Updated and Improved

  • Bundled harfbuzz to 4.2.0
  • On macOS, non-native fullscreen mode now attempts to avoid the notch on systems that have one. #1737
  • Sixel parsing performance has been improved
  • You may now specify a scaling factor per fallback font, which is useful when your preferred CJK font renders smaller than your Roman primary font, for example.
  • Color schemes: Retro, GitHub Dark, Blazer
  • Wayland: touchpad scroll is now more responsive/precise. Thanks to @davidrios! #1800 #1840
  • Kitty image protocol: now also supports shared memory data transmission. Thanks to @tantei3! #1810
  • Secondary DA response bumped up to persuade vim to set ttymouse=sgr by default. #1825

Fixed

  • Incorrect csi-u encoding with non-ascii characters. #1746
  • X11 _NET_WM_ICON had red/blue channels swapped #1754
  • ls-fonts output didn't quote the style field #1762
  • window_decorations = "RESIZE" on Windows prevented minimize/maximize and aerosnap, double click to maximize, and had an ugly top border. Many thanks to @davidrios! #1674 #1675 #1771
  • On Windows, explorer shortcut icons with the maximized setting would fall out of maximized state on startup. Thanks to @davidrios! #1502
  • LANG environment variable was not always set on macOS, leading to mojibake when entering CJK. #1761 #1765
  • Fonts with only non-unicode names (eg: only using a Chinese multibyte string encoding) were treated as having names like ????? and were not accessible. #1761
  • Hover state of leftmost retro style tab was overly sticky when the mouse moved out of the tab. #1764
  • On macOS, the font size could incorrectly double or halve after waking from sleep or moving the window to/from an external monitor. #1566 #1745
  • On Windows, touchpad scrolling was janky. Many thanks to @davidrios! #1773 #1725 #949
  • X11: workaround i3-gaps not sending initial CONFIGURE_NOTIFY or FOCUS events, leading to weird initial window size and broken focus status. #1710 #1757
  • Hyperlink rules with more captures than replacements could panic wezterm when text matched. #1780
  • Malformed XTGETTCAP response. #1781
  • Multiplexer performance with images was unusable for all but tiny images. #1237
  • CloseCurrentPane{confirm=false} would leave behind a phantom tab/pane when used with the multiplexer. #1277
  • CloseCurrentPane{confirm=true} artifacts when used with the multiplexer. #783
  • Scrollbar thumb could jump around/move out of bounds. Thanks to @davidrios! #1525
  • OSC 52 could stop working for tabs/panes spawned into the GUI via the CLI. #1790
  • Workaround for fonts with broken horizontal advance metrics #1787
  • Improved mouse based selection. Thanks to @davidrios! #1805 #1199 #1386 #354
  • X11 KP_End wasn't recognized #1804
  • fontconfig matches now also treat "charcell" spacing as monospace. #1820
  • Multiplexer render update laggy, especially when using multiple windows. #1814 #1841

20220319-142410-0fcdea07

New

Changed

  • Key Assignments now use Physical Key locations by default!! Read more #1483 #601 #1080 #1391
  • Key assignments now match prior to any dead-key or IME composition #877
  • Removed the ALT-[NUMBER] default key assignments as they are not good for non-US layouts. #1542
  • wezterm cli, when run outside of a wezterm pane, now prefers to connect to the main GUI instance rather than background mux server. Use wezterm cli --prefer-mux to ignore the GUI instance and talk only to the mux server. See wezterm cli --help for additional information.
  • ScrollByPage now accepts fractional numbers like 0.5 to scroll by half a page at time. Thanks to @hahuang65! #1534
  • use_ime now defaults to true on all platforms; previously it was not enabled by default on macOS.
  • canonicalize_pasted_newlines default has changed to be more compatible for nano users, and now provides more control over the text format that is pasted. #1575
  • Blinking text is now eased rather than binary-blinked. See text_blink_ease_in and text_blink_ease_out, text_blink_rapid_ease_in and text_blink_rapid_ease_out for more information.
  • Blinking text cursor is now eased rather than binary-blinked. See cursor_blink_ease_in and cursor_blink_ease_out.

Updated and Improved

  • IME and dead key composition state now shows inline in the terminal using the terminal font (All platforms, except Wayland where we only support dead key composition)
  • macOS: use_ime=true no longer prevents key repeat from working with some keys #1131
  • Bundled harfbuzz to 4.0.1

Fixed

  • Regression that broke fontconfig aliases such as "monospace" #1250
  • Windows/X11/Wayland: CTRL+C in non-latin keyboard layouts wouldn't send CTRL+C #678
  • The new tab button in the fancy tab didn't respect new_tab_hover colors #1498
  • Font baseline alignment when mixing symbols/emoji with the main text #1499
  • Glitchy window resize #1491
  • Ligatured glyphs no longer turn partially black when cursoring through them #478
  • Kitty Image Protocol: didn't respect c and r parameters to scale images
  • Cursor location on the primary screen wasn't updated correctly if the window was resized while the alternate screen was active #1512
  • Windows: latency issue with AltSnap and other window-managery things #1013 #1398 #1075 #1099
  • Multiplexer sessions now propagate user vars #1528
  • Config reloads on the multiplexer server didn't cause the palette to update on the client #1526
  • ScrollToPrompt could get confused when there were multiple prompts on the same line #1121
  • Hangul text in NFD was not always correctly composed when shaping fonts. #1573
  • Avoid OOM when processing sixels with huge repeat counts #1610
  • Set the sticky bit on socket and pid files created in XDG_RUNTIME_DIR to avoid removal by tmpwatch #1601
  • Shaping combining sequences like e U+20d7 could "lose" the vector symbol if the font produced an entry with no x_advance. #1617
  • Setting the cursor color via escape sequences now take precedence over force_reverse_video_cursor. #1625
  • Fixed Detection of DECSDM support via DECRQM/DECRPM, Correct sixel image placement when DECSDM is set and VT340 default sixel colors. Thanks to Autumn! #1577
  • Fixed missing whitespace from intermediate lines when copying a wrapped logical line #1635
  • Unable to match Iosevka Term when multiple iosevka ttc files were installed on macOS #1630
  • Incorrect umask for panes spawned via the multiplexer server #1633
  • Fall back from top_left_arrow to left_ptr when loading XCursor themes #1655
  • Fixed lingering hover state in titlebar when the mouse pointer left the window. Thanks to @davidrios! #1434
  • We now respect the difference between Italic and Oblique font styles when matching fonts. You may explicitly specify style="Oblique" rather than using italic=true for fonts that offer both italic and oblique variants. #1646
  • Hang when clicking a URL would launch the browser for the first time on unix systems #1721
  • Wayland input handling gets broken after suspend/resume. Thanks to @LawnGnome! #1497

20220101-133340-7edc5b5a

New

Changed

  • quickselect: we now de-duplicate labels for results with the same textual content. #1271
  • The default CompleteSelectionOrOpenLinkAtMouseCursor left button release assignment now also accepts SHIFT being held in order to make SHIFT-click ExtendSelectionToMouseCursor feel more ergonomic if the mouse button is released before the SHIFT key. #1204
  • Unicode BIDI and other zero-width graphemes are now filtered out from the terminal model. It's not ideal in the sense that that information is essentially lost when copying to the clipboard, but it makes the presentation correct. #1422
  • use_ime now defaults to true on X11 systems

Updated and Improved

  • Bundled harfbuzz to 3.2.0
  • Bundled freetype to 2.11.1
  • Bundled NotoColorEmoji to 2.034 (with Unicode 14 support) Thanks to @4cm4k1! #1440
  • macos: removing the titlebar from window_decorations now preserves rounded window corners #1034
  • Colors can now be specified in the HSL colorspace using syntax like "hsl:235 100 50" #1436
  • Line/Bar cursors in force_reverse_video_cursor mode now use the text foreground color rather than the cursor border color. #1076
  • Improved logo appearance. Thanks to @ghifarit53! #1454
  • You can now pass SendKey to wezterm.action and make your keys config look more consistent
  • Mouse wheel events are now routed to the hovered pane, rather than sent to the focused pane #798

Fixed

  • DECSTR (terminal soft reset) now turns off DECLRMM (left and right margin mode). Thanks to @ninjalj! #1376
  • Improved conformance of CUP, HVP, SLRM, STBM escape sequences by support empty first parameter. Thanks to @ninjalj! #1377
  • tab bar didn't correctly handle double-wide cells and could truncate at edges when using format-tab-title #1371
  • wezterm cli --no-auto-start was not respected
  • Pixel geometry configured on the PTY in new windows could be incorrect on HiDPI displays until the window was resized #1387
  • Image attachment geometry for imgcat and sixels could stretch the image across the rounded up number of cells that contained the image. #1300, #1270
  • Closing a split pane created inside a wezterm ssh session wouldn't actually close the pane #1197
  • Clicking when unfocused could lead to unwanted text selection #1140 #1310
  • Changing font scaling on Windows no longer causes the initial terminal rows/cols to be under-sized #1381
  • New version update notifications are now more coordinated between multiple wezterm GUI instances, and update related configuration now respects configuration reloading. #1402
  • TLS domains bootstrapping via SSH now use the libssh backend by default and work more reliably on Windows
  • Closing a window will no longer recursively terminate contained multiplexer client panes; the window will instead be restored when you next connect to that multiplexer server. Killing/closing individual tabs/panes will kill the panes; this change only affects closing the window. #848 #917 #1224
  • Colors were too intense due to over gamma correction #1025
  • Mesa and EGL colors were too dim due to under gamma correction #1373
  • wezterm ssh no longer tries to use default_prog or default_cwd when spawning additional panes on the remote host #1456
  • Launcher menu WSL items now launch correctly on non-US versions of Windows #1462
  • Korean text in NFD form is now correctly sized and rendered #1474
  • macOS: use_ime=true conflicted with LEADER key assignments #1409
  • macOS: certain keys (eg: F8 and F9) did nothing when use_ime=true. #975
  • Splitting a tab would cause the window to lose its transparency #1459

20211205-192649-672c1cc1

Fixed

  • Windows: wezterm <something> would fail silently when spawning wezterm-gui under the covers. Regression introduced by #1278. Workaround is to directly spawn wezterm-gui.
  • Windows: the PTY handles were ignored in favor of the redirected stdio handles of the parent of the wezterm mux process #1358
  • Windows: Failure to spawn wezterm when launching an ssh mux domain session no longer waits forever
  • "Update available" message kept showing even though already running the latest version #1365

20211204-082213-a66c61ee9

New

  • X11 now supports IME. It currently defaults to disabled, but you can set use_ime = true in your config to enable it (you need to restart wezterm for this to take effect). Many thanks to @H-M-H for bringing xcb-imdkit to Rust and implementing this in wezterm! #250 #1043
  • it is now possible to define colors in the range 16-255 in colors and color scheme definitions. Thanks to @potamides! #841 #1056
  • Added SendKey key assignment action that makes it more convenient to rebind the key input that is sent to a pane.
  • Added Multiple key assignment action for combining multuple actions in a single press.
  • Added use_resize_increments option to tell X11, Wayland, macOS window resizing to prefers to step in increments of the cell size
  • visual_bell and audible_bell configuration options, as well as a bell event allows you to trigger lua code when the bell is rung. #3
  • wezterm.action_callback function to make it easier to use custom events. Thanks to @bew! #1151
  • wezterm connect now also supports the --class parameter to override the window class
  • window_padding now accepts values such as "1cell" or "30%" to compute values based on font or window metrics.
  • BSDish systems now support toast notifications
  • wezterm.background_child_process function to spawn a process without waiting.
  • mux_env_remove setting to control which environment variables should be cleared prior to spawning processes in the multiplexer server #1225
  • canonicalize_pasted_newlines option to help Windows users manage newlines in pastes #1213
  • SSH client now uses libssh by default. ssh_backend can be used to change this.
  • unzoom_on_switch_pane option. Thanks to @yyogo #1301
  • unicode_version option and corresponding OSC escape sequences that affects how the width of certain unicode sequences are interpreted.
  • macOS: binaries produced by wezterm's CI are now codesigned, which resolves some spurious permission dialogs that affected some users #482

Changed

  • new default key assignments: CTRL+PageUp and CTRL+Tab activate next tab, CTRL+PageDown and CTRL+SHIFT+Tab activate previous tab. ALT+{1..8} directly select the first through 8th tabs. Thanks to @friederbluemle! #1132
  • X11: we now allow matching visuals with >= 8 bits per rgb value. Previously, we only matched exactly 8 bits. This improve compatibility with systems that have the COMPOSITE extension disabled. Thanks to @shizeeg! #1083
  • The incomplete Allsorts shaper was removed.
  • Windows: wezterm-gui.exe now only grabs the parent process' console handle when spawned from wezterm.exe, which prevents some frustrating interactions when launching wezterm-gui.exe via start in cmd/powershell. #1278
  • AppImage: take care to remove APPIMAGE related environment when spawning child processes. Thanks to @srevinsaju! #1338

Updated and Improved

  • bundled harfbuzz updated to version 3.0.0, bundled freetype updated to 2.11
  • window close confirmations now accept both uppercase and lowercase Y/N key presses. Thanks to @SpyrosRoum! #1119
  • multi-click-streaks are now interrupted by the cursor moving to a different cell. Thanks to @valpackett! #1126
  • .deb packages now Provides: x-terminal-emulator. #1139
  • use_cap_height_to_scale_fallback_fonts now computes cap-height based on the rasterized glyph bitmap which means that the data is accurate in more cases, including for bitmap fonts. Scaling is now also applied across varying text styles; previously it only applied to a font within an wezterm.font_with_fallback font list.
  • Can now match fontconfig aliases, such as monospace, on systems that use fontconfig. Thanks to @valpackett! #1149
  • Powerline semicircle glyphs now look much better. Thanks to @bew and @sdrik! #1311
  • Splits now look better, especially when using escape sequences to change the default background color #1256

Fixed

  • wezterm cli spawn would use the initial terminal size for a new tab, rather than using the current tab size #920
  • text_background_opacity opacity was not respected
  • spawning commands via the mux didn't respect the PATH configured in set_environment_variables. #1029
  • cursor could have a transparent "hole" through the window with certain cursor styles
  • Consolas font + random input could cause a divide-by-zero when computing glyph metrics #1042
  • Emoji fallback was too strict in respecting VS15/VS16 presentation selection, adjust the fallback to allow showing Emoji/Text presentation if Text/Emoji was requested but not found.
  • X11: laggy input after selecting text. #1027
  • macOS: send_composed_key_when_left_alt_is_pressed and send_composed_key_when_right_alt_is_pressed are now respected when use_ime=true. Thanks to @jakelinnzy! #1096
  • X11: jittery resize with some window managers #1051
  • X11: window:get_appearance now actually returns Dark when the theme is dark. #1098
  • ALT + Arrow, PageUp/PageDown, Ins, Del, Home, End incorrectly sent ESC prefixed key sequences. #892
  • Crash due to Out of Memory condition when the iTerm2 protocol was used to send excessively large PNG files #1031
  • DCH (delete char) sequence would remove cells and replace them with default-blank cells instead of blank-cells-with-current-bg-color. #789
  • invisible I-beam or underline cursor when force_reverse_video_cursor = true #1076
  • SU (scroll up) sequence would fill with default-blank cells instead of blank-cells-with-current-bg-color. #1102
  • X11: computed but did not use the correct DPI for HiDPI screens #947
  • performance when resolving fallback fonts via fontconfig, and of coverage calculation with freetype. Thanks to @H-M-H!
  • Wayland: incorrect initial surface size for HiDPI screens. Thanks to @valpackett! #1111 #1112
  • invisible cursor in CopyMode when using kakoune #1113
  • Wayland: bypass_mouse_reporting_modifiers didn't work. Thanks to @valpackett! #1122
  • new tabs could have the wrong number of rows and columns if a tiling WM resizes the window before OpenGL has been setup. #1074
  • Wayland: dragging the window using the tab bar now works. Thanks to @valpackett! #1127
  • error matching a font when that font is in a .ttc that contains multiple font families. #1137
  • Wayland: panic with most recent wlroots. Thanks to @valpackett! #1144
  • incorrect spacing for IDEOGRAPHIC SPACE. #1161
  • italic fonts weren't always recognized as being italic, resulting in italic variants being used instead of the non-italic variants in some cases! #1162
  • Ask freetype for cell metrics in bitmap-only fonts, rather than simply taking the bitmap width. #1165
  • wezterm can now match bitmap fonts that are spread across multiple font files #1189
  • ssh config parser incorrectly split Host patterns with commas instead of whitespace #1196
  • search now auto-updates when the pane content changes #1205
  • fonts with emoji presentation are shifted to better align with the primary font baseline #1203
  • the whole tab was closed when only the zoomed pane exited. #1235
  • multiplexer: wrong WEZTERM_UNIX_SOCKET environment passed to children when using unix domain sockets and connect_automatically=true #1222
  • multiplexer: spawning remote tabs didn't correctly record local tab mapping, resulting in phantom additional tabs showing in the client. #1222
  • wezterm ls-fonts --text "✘" didn't account for the system fallback list. #849
  • macOS: The Menlo font is now implicitly included in the system fallback list, as it is the only font that contains U+2718 ✘
  • wezterm cli spawn --cwd .. and wezterm cli split-pane --cwd .. now resolve relative paths #1243
  • Incorrect DECRPTUI response to DA3. Thanks to @ninjalj! #1330
  • Reloading config now loads newly defined multiplexer domains, however, existing domains are not updated. #1279

20210814-124438-54e29167

  • Fixed: ssh client would read /etc/ssh/config rather than the proper /etc/ssh/ssh_config
  • Updated: ssh client now processes Include statements in ssh config
  • x11: support for VoidSymbol in key assignments. Thanks to @digitallyserviced! #759
  • Fixed: UTF8-encoded-C1 control codes were not always recognized as control codes, and could result in a panic when later attempting to update the line. #768
  • Fixed: wezterm cli split-pane didn't use the current working dir of the source pane. #766
  • Fixed: double-click-drag selection could panic when crossing line boundaries #762
  • Fixed: wrong scaling for ligatures in Recursive Mono font #699
  • Fixed: incorrect Sixel HLS hue handling #775
  • Fixed: we now recognize the CSI 48:2:0:214:255m form of specifying true color text attributes #785
  • Fixed: split separators didn't respect tab_bar_at_bottom=true and were rendered in the wrong place #797
  • Improved: messaging around exit_behavior
  • Fixed: errors loading custom color schemes are now logged to the error log #794
  • Fixed: OSC 7 (current working directory) now works with paths that contain spaces and other special characters. Thanks to @Arvedui! #799
  • Changed: the homebrew tap is now a Cask that installs to the /Applications directory on macOS. Thanks to @laggardkernel!
  • New: bold/dim and/or italics are now synthesized for fonts when the matching font is not actually italic or doesn't match the requested weight. #815
  • Updated: conpty.dll to v1.9.1445.0; fixes color bar artifacts when resizing window and allows win32 console applications to use mouse events
  • Fixed: Windows: pane could linger after the process has died, closing only when a new pane/tab event occurs
  • Fixed: Windows: first character after wezterm ssh keyboard authention was swallowed #771
  • Fixed: Windows: detect window resizes while authenticating for wezterm ssh #696
  • Fixed: OSC 52 clipboard escape didn't work in the initial pane spawned in the multiplexer server #764
  • Fixed: splitting panes in multiplexer could fail after a network reconnect #781
  • Fixed: multiplexer now propagates toast notifications and color palette to client #489 #748
  • Fixed: neovim interprets drags as double clicks #823
  • New: CTRL+SHIFT+L is assigned to ShowDebugOverlay #641
  • Improved: antialiasing for undercurl. Thanks to @ModProg! #838
  • Fixed: wezterm start --cwd c:/ didn't run default_prog. Thanks to @exactly-one-kas! #851
  • Improved: skip_close_confirmation_for_processes_named now includes common windows shell processes cmd.exe, pwsh.exe and powershell.exe. #843
  • Fixed: don't keep the window alive after running something & disown ; exit #839
  • Improved: we now draw sextant glyphs from the Unicode Symbols for Legacy Computing block (1FB00) when custom_block_glyphs is enabled.
  • Changed: COLORTERM=truecolor is now set in the environment. #875
  • New: wezterm cli spawn --new-window flag for creating a new window via the CLI #887
  • Fixed: closing last pane in a tab via CloseCurrentPane could cause the window to close #890
  • Improved: wezterm ls-fonts --list-system shows all available fonts, wezterm ls-fonts --text "hello" explains which fonts are used for each glyph in the supplied text
  • Fixed: mouse cursor is now Arrow rather than I-beam when the application in the terminal has enabled mouse reporting #859
  • Improved: DEC Special Graphics mode conformance and complete coverage of the graphics character set. Thanks to Autumn Lamonte! #891
  • Fixed: click to focus now focuses the pane under the mouse cursor #881
  • Removed: Parasio Dark color scheme; it was a duplicate of the correctly named Paraiso Dark scheme. Thanks to @adrian5! #906
  • Fixed: key repeat on Wayland now respects the system specified key repeat rate, and doesn't "stick". #669
  • Fixed: force_reverse_video_cursor wasn't correctly swapping the cursor colors in all cases. #706
  • Fixed: allow multuple IdentityFile lines in an ssh_config block to be considered
  • Improved: implement braille characters as custom glyphs, to have perfect rendering when custom_block_glyphs is enabled. Thanks to @bew!
  • Fixed: Mod3 is no longer treater as SUPER on X11 and Wayland #933
  • Fixed: paste now respects scroll_to_bottom_on_input. #931
  • New: bypass_mouse_reporting_modifiers to specify which modifier(s) override application mouse reporting mode.
  • Fixed: focus tracking events are now also generated when switching between panes #941
  • New: window_frame option to configure Wayland window decorations #761
  • New: window:get_appearance() to determine if the window has a dark mode appearance, and adjust color scheme to match #806
  • Improved: improve the new-tab button formatting. Thanks to @sdrik! #950
  • Fixed: if a line of text was exactly the width of the terminal it would get marked as wrappable even when followed by a newline, causing text to reflow incorrectly on resize. #971
  • Fixed: wezterm ssh could loop forever in the background if the connection drops and the window is closed. #857
  • Improved: VT102 conformance. Many thanks to Autumn Lamonte! #904
  • New: text_blink_rate and text_blink_rate_rapid options to control blinking text. Thanks to Autumn Lamonte! #904
  • New: Added support for Synchronized Rendering #882
  • New: wezterm now draws its own pixel-perfect versions of more block drawing glyphs. See custom_block_glyphs for more details. #584
  • Fixed: wayland: CursorNotFound error with the whiteglass theme. #532
  • Improved: Can now recover from exhausting available texture space by clearing the screen. #879
  • Updated bundled Noto Color Emoji font to version 2.028 featuring a design update. Thanks to @4cm4k1! #1003
  • Fixed: wayland: putting a window in the Sway scratchpad no longer blocks the wezterm process #884
  • Fixed: mouse reporting now correctly reports release events when multiple buttons are pressed and released at the same time. #973
  • Fixed: incorrect initial window/pty size when running with some tiling window managers. #695
  • New: CTRL-SHIFT-L shows the debug overlay, which shows the error log and a lua repl. #641
  • Fixed: macOS: bright window padding on Intel-based macs #653, #716 and #1000
  • Improved: wezterm now uses the Dual Source Blending feature of OpenGL to manage subpixel anti-aliasing alpha blending, resulting in improved appearance particularly when using a transparent window over the top of something with a light background. #932
  • Fixed: copying really long lines could falsely introduce line breaks on line wrap boundaries #874
  • New: wezterm.add_to_config_reload_watch_list function to aid with automatically reloading the config when you've split your config across multiple files. Thanks to @AusCyberman! #989
  • Improved: wezterm now respects default emoji presentation and explicit emoji variation selectors (VS15 and VS16) so that glyphs that have both textual (usually monochrome, single cell width) and emoji (color, double width) presentations can be more faithfully rendered. #997
  • New: window_background_gradient option to configure color gradients for your window background
  • New: wezterm.gradient_colors function to compute RGB values for gradients for use in your config.
  • New: color schemes: Abernathy, Ayu Mirage, darkmatrix, Fairyfloss, GitHub Dark, HaX0R_BLUE, HaX0R_GR33N, HaX0R_R3D, Mariana, matrix, Peppermint and UltraDark

20210502-154244-3f7122cb

  • Fixed: red and blue subpixel channels were swapped, leading to excessively blurry text when using freetype_load_flags="HorizontalLcd". #639
  • Fixed: the selection wouldn't always clear when the intersecting lines change #644
  • Fixed: vertical alignment issue with Iosevka on Windows #661
  • Fixed: support for "Variable" fonts such as Cascadia Code and Inconsolata on all platforms #655
  • New: wezterm.font and wezterm.font_with_fallback attributes parameter now allows matching more granular font weights and font stretch. e.g.: wezterm.font('Iosevka Term', {stretch="Expanded", weight="Regular"}), as fallback can specify weight/stretch/style for each individual font in the fallback.
  • New: freetype_render_target option for additional control over glyph rasterization.
  • Fixed: wezterm ssh HOST no longer overrides the User config specified by ~/.ssh/config
  • Fixed: X11: detect when gnome DPI scaling changes #667
  • Fixed: potential panic when pasting large amounts of multi-byte text #668
  • Fixed: X11: non-ascii text could appear mangled in titlebars #673
  • Improved font IO performance and memory usage on all platforms
  • New window:toast_notification method for showing desktop notifications. #619
  • Fixed: half-pixel gaps in ligatured/double-wide glyphs depending on the font size #614
  • Fixed: Window could vanish if a tab closed while the rightmost tab was active(!) #690
  • Fixed: macOS: mouse cursor could get stuck in the hidden state. #618
  • Improved: font_rules behavior to always append reasonable default font_rules to those that you may have specified in your config. font_rules now also include defaults for half-bright text styles.
  • Improved: added use_cap_height_to_scale_fallback_fonts option to scale secondary fonts according to relative their cap-height metric to improve size consistency. This partially applies to some symbol/emoji fonts, but is dependent upon the font having reliable metrics.
  • Improved: font-config queries now run much faster, resulting in snappier startup on unix systems
  • Fixed: Hide had no effect on macOS when the titlebar was disabled #679
  • Fixed: key and mouse assignments set via window:set_config_overrides were not respected. #656
  • Fixed: potential panic when word selecting off top of viewport #713
  • Fixed: really long busy wait when displaying single logical json line of 1.5MB in length #714
  • New: swallow_mouse_click_on_pane_focus option #724
  • New: pane_focus_follows_mouse option #600
  • Fixed: splitting a pane while a pane is in the zoomed state would swallow the new pane #723
  • Fixed: multi-cell glyphs weren't displayed in tab titles #711
  • New: format-window-title hook for customizing the text in the window titlebar
  • New: format-tab-title hook for customizing the text in tab titles. #647
  • Removed: active and inactive tab_bar_style config values; use the new format-tab-title event instead
  • New: force_reverse_video_cursor setting to override the cursor color scheme settings. #706
  • Fixed: ssh config parsing now expands ~ to your home directory for appropriate options; previously only %d and ${HOME} were substituted. #729
  • New: Quick Select Mode for a tmux-fingers/tmux-thumbs style mouse-less select and copy flow #732
  • Fixed: tabs would remain hovered after moving the mouse down into the main terminal area #591
  • New: tab_bar_at_bottom setting to put the tab bar at the bottom of the window #278
  • New: wezterm.column_width function for measuring the displayed width of a string
  • New: wezterm.pad_left, wwezterm.pad_right, wezterm.truncate_left and wezterm.truncate_right function for truncating/padding a string based on its displayed width
  • Updated bundled Noto Color Emoji font to version 2.020 with unicode 13.1 support. Thanks to @4cm4k1! #742
  • Fixed: Numpad Enter reported as CTRL-C on macOS #739
  • Fixed: mouse reporting button state not cleared when focus is lost, eg: from clicking a link #744
  • Improved: better looking curly underline. Thanks to @ModProg! #733
  • Fixed: wezterm now sets argv0 to -$SHELL to invoke a login shell, rather than running $SHELL -l. #753
  • Improved: ssh_config parsing now supports Match for Host, LocalUser.
  • Improved render performance for wide windows #740
  • New color schemes: Aurora, BlueDolphin, BlulocoDark, BlulocoLight, Doom Peacock, Galizur, Guezwhoz, PaleNightHC, Raycast_Dark, Raycast_Light, Sublette, iceberg-dark and iceberg-light.

20210405-110924-a5bb5be8

  • Fixed: bold text got broken as part of fixing #617 :-( #648

20210404-112810-b63a949d

  • Fixed: 100% CPU due to spurious resize events generated by herbstluftwm. #557
  • Fixed: improved conformance with xterm for keys like CTRL-6 and CTRL-/. #556
  • Fixed: detection and handling of fonts such as terminus-bold.otb that contain only bitmap strikes. #560
  • Fixed: the pixel size reported by the pty to the kernel wasn't adjusted for font metrics/dpi until the config was reloaded or window resized. #563
  • Fixed: greatly reduce memory consumption when system fallback fonts are loaded #559
  • Fixed: Windows: window_background_opacity was only taking effect when window_decorations="NONE" #553
  • Fixed: an issue where wezterm could hang if the process spawned by a pane doesn't quit when asked #558
  • Fixed: panic when dismissing the tab navigator #542
  • Fixed: font fallback on macOS returns unresolvable .AppleSymbolsFB rather than Apple Symbols, leading to slowdowns when rendering symbols #506
  • Fixed: laggy repaints for large windows particularly on Windows, but applicable to all systems. Tuned and triple-buffered vertex buffer updates. #546
  • Changed: allow_square_glyphs_to_overflow_width now defaults to WhenFollowedBySpace and applies to more symbol glyphs. #565
  • Changed: macOS: CMD-Q is now bound by default to QuitApplication
  • New: added skip_close_confirmation_for_processes_named option which specifies a list of processes for which it is considered safe to allow closing a pane/tab/window without a prompt. #562
  • Fixed: triggering the search overlay again while the search overlay is active no longer closes the underlying pane #572
  • Fixed: X10 mouse coordinate reporting encoding could produce invalid outputs for large windows. Capped coordinate values to the maximum value that is representable in UTF-8 encoding
  • Fixed: font fallback now happens asynchronously from painting #508
  • New: added window:get_selection_text_for_pane method #575
  • Fixed: implicit hyperlink rules, word and line selection now operate on logical lines which means that they deal with wrapped lines outside of the viewport. #408
  • New: wezterm ssh now supports reading ~/.ssh/config and overriding options via the command line. IdentityFile and ProxyCommand are the two main new supported options. Read more about it in ssh.
  • Fixed: ssh support will now try all available identities from the SSH agent rather than just the first.
  • New: splitting panes in wezterm ssh now works like spawning new tabs: the new program is started on the remote host with no additional authentication required.
  • Fixed: Multiplexer sessions would fail to bootstrap via ssh because the bootstrap process exited too soon. #507
  • Fixed: Windows: we now compile libssh2 against openssl on all platforms to improve overall key and crypto algorithm support
  • Fixed: spawning a new tab via the launcher menu failed because it used the pretty printed multiplexer domain label rather than the multiplexer domain name.
  • Fixed: macOS: middle mouse button wasn't recognized. Thanks to @guswynn! #599
  • New: added ActivateLastTab key assignment for jumping back to a previously active tab. Thanks to @alexgartrell #610
  • Fixed: added missing XTSMGRAPHICS query/response for sixel support #609
  • Fixed: avoid showing an error dialog for synthesized font_rules when the configuration specifies a font that doesn't have bold/italic variants. #617
  • New: mouse cursor hides when keyboard input is sent to a pane, and shows again when the mouse is moved. #618
  • Fixed: macOS: CTRL-Tab key combination was not recognized. #630
  • Fixed: wezterm-mux-server will now continue running even after all tabs/panes have been closed. #631
  • Fixed: macOS: wezterm-gui could linger in the background until the mouse moves after all tabs/panes have closed
  • Fixed: when using line_height, wezterm now vertically centers the cell rather than padding only the top #582
  • Fixed: macOS: in US layouts, SUPER+SHIFT+[ was incorrectly recognized as SUPER+SHIFT+{ instead of SUPER+{ #601
  • Fixed: wezterm.config_dir was returning the config file path instead of the directory!
  • New: wezterm.config_file which returns the config file path

20210314-114017-04b7cedd

  • New: tab_bar_style allows customizing the appearance of the rest of the tab bar.
  • New: animated gif and png images displayed via wezterm imgcat (the iTerm2 image protocol), or attached to the window background via window_background_image will now animate while the window has focus.
  • New: added foreground_text_hsb setting to adjust hue, saturation and brightness when text is rendered.
  • New: added ResetFontAndWindowSize key assignment.
  • New: added ScrollByLine key assignment.
  • New: OSC 777 and OSC 9 escapes now generate Toast Notifications. printf "\e]777;notify;%s;%s\e\\" "title" "body" and printf "\e]9;%s\e\\" "hello there". These don't currently pass through multiplexer connections. #489.
  • New: exit_behavior config option to keep panes open after the program has completed. #499
  • New: added --config name=value options to wezterm, wezterm-gui and wezterm-mux-server. The --front-end, --font-locator, --font-rasterizer and --font-shaper CLI options have been removed in favor of this new mechanism.
  • New: window:set_config_overrides method that can be used to override GUI related configuration options on a per-window basis. Click through to see examples of dynamically toggling ligatures and window opacity. #469 #329
  • New: introduced custom_block_glyphs option to ensure that block glyphs don't have gaps. #433
  • New: you can now drag the wezterm window via the tab bar
  • New: holding SUPER+Drag (or CTRL+SHIFT+Drag) will drag the wezterm window. Use StartWindowDrag to configure your own binding.
  • New: configure window_decorations to remove the title bar and/or window border
  • New: we now bundle PowerlineExtraSymbols as a built-in fallback font, so that you can use powerline glyphs with any font without patching the font.
  • New: window:set_right_status allows setting additional status information in the tab bar. #500
  • New: Search Mode: Added CTRL-u key assignment to clear the current search pattern. Thanks to @bew! #465
  • Fonts: font_antialias and font_hinting are now deprecated in favor of the new freetype_load_target and freetype_load_flags options. The deprecated options have no effect and will be removed in a future release. The new options provide more direct control over how freetype rasterizes text.
  • Fonts: when computing default font_rules for bold and italic fonts, strip italic and bold components from the family name. eg: if you set font = wezterm.font("Source Code Pro Medium") then the Medium text will be stripped from the font name used to locate bold and italic variants so that we don't report an error loading a non-sensical Source Code Pro Medium Bold. #456
  • Fonts: fix a regression where bright windows behind wezterm could "shine through" on the alpha channel, and adjust the tinting operation to avoid anti-aliased dark fringes #470 #491
  • Fonts: macOS: fix an issue where wezterm could hang when loading a font located via Core Text #475
  • Fonts: Changed the default font_size to 12 points. #517
  • Fonts: Updated bundled JetBrainsMono font to version 2.225
  • Added --config-file CLI option to specify an alternate config file location. Read more about config file resolution. Thanks to @bew! #459
  • OSC 52 (Clipboard manipulation) now respects the difference between PRIMARY and CLIPBOARD on X11 systems.
  • Fixed an issue where large pastes could result in a hang
  • Closing the configuration error window no longer requires confirmation
  • Fixed: an issue where the window would be redrawn on mouse move. This was most noticeable as a laggy mouse pointer when moving the mouse across a window running on the nouveau display driver on X11 and Wayland systems
  • Fixed: an issue where closing a pane would immediately SIGKILL the associated process, rather than sending SIGHUP. Thanks to @bew!
  • Fixed: line-based mouse selection (default: triple click) now extends forwards to include wrapped lines. #466
  • Fixed: the RIS escape wasn't clearing the scrollback. #511
  • Wayland: fixed opengl context creation issues. Thanks to @valpackett! #481
  • Wayland: the raw key modifiers are now correctly propagated so that they activate when used with key assignments using the key = "raw:123" binding syntax.
  • Wayland: fixed window decoration and full screen handling #224
  • Wayland: fixed an issue where key repeat processing could "run away" and hang the application
  • Windows: the portable .zip file download now includes ANGLE EGL, just like the setup.exe installer has done since version 20201031-154415-9614e117
  • Windows: Fixed ToggleFullScreen so that it once again toggles between full screen and normal placement. #177
  • Windows: fix the unexpected default behavior of Ctrl-Alt being converted to AltGr for layouts supporting this key, the previous behavior is still possible by enabling the option treat_left_ctrlalt_as_altgr (to solve #392). Thanks to @bew! #512
  • Windows: fixed "Open WezTerm Here" context menu in explorer when used on the root of a drive (eg: C:\). Thanks to @flyxyz123! #526 #451
  • X11: fix an issue where SHIFT-Enter was not recognized #516
  • X11: improved DPI detection for high-DPI displays. #515
  • X11: we now load the XCursor themes when possible, which means that the mouse cursor is now generally a bit larger and clearer as well as conforming more with the prevailing style of the desktop environment. #524
  • Improved and optimized image processing so that watching videos via timg - Terminal Image and Video Viewer works better #537 #535 #534

20210203-095643-70a364eb

  • Fix cursor position after using iTerm2 image protocol #317
  • Fix pixel dimensions after changing the pane size; this was mostly invisible but impacted image scaling when using sixel or iTerm2 image protocols. #312
  • Add support for OSC 133 which allows annotating output as Output, Input (that you typed) and Prompt (shell "chrome"). Learn more about Semantic prompt and OSC 133
  • Add ScrollToPrompt key assignment that scrolls the viewport to the prior/next shell prompt emitted using OSC 133 Semantic Prompt escapes. This assignment is not bound by default.
  • Fixed an issue where SpawnWindow didn't use the current working directory from the current pane to spawn the new window
  • Added wezterm start --class CLASSNAME option to specify the window class name under X11 and Windows, or the app_id under Wayland. See wezterm start --help for more information.
  • Added shell integration for setting OSC 7 (working directory) and OSC 133 (semantic zones) for Zsh and Bash. See Shell Integration docs.
  • Added SemanticZone as a possible parameter for SelectTextAtMouseCursor, making it possible to conveniently select complete input or output regions.
  • Improved font rendering #320 #331 #413 and changed font_antialias = "Greyscale" by default.
  • Updated internal harfbuzz shaper to 2.7.2
  • Fixed ALT-Escape not sending ESC-ESC #338
  • Added allow_square_glyphs_to_overflow_width = "WhenFollowedBySpace" option to allow square symbol glyphs to deliberately overflow their specified cell width when the next cell is a space. Can be set to Always to allow overflowing regardless of the next cell being a space, or Never to strictly respect the cell width. The default is Never. #342
  • macOS: Improved key input when Option is pressed. Fixed dead key processing when use_ime=true. #357
  • macOS: Adjusted default dpi to 72 to bring point sizes into alignment with other macOS apps. #332
  • Improved font fallback; we now try harder to find a system-provided font for glyphs that are not found in your explicitly configured fonts.
  • Revised pty output processing and removed the related ratelimit_output_bytes_per_second option
  • Workaround Cocoa leaking window position saved state file descriptors to child processes on macOS Big Sur, and Gnome/Mutter doing something similar under X11
  • The 256 color cube now uses slightly brighter colors #348
  • New: added line_height configuration option to scale the computed cell height. The default is 1.0, resulting in using the font-specified metrics. Setting it to 1.2 will result in a 20% larger cell height.
  • macOS: Fixed an issue where hovering over the split between panes could result in wezterm becoming unresponsive #391
  • Closing windows and QuitApplication will now prompt for confirmation before proceeding with the close/quit. Added window_close_confirmation to control this; valid values are AlwaysPrompt and NeverPrompt. #280
  • Tidied up logging. Previously ERROR level logging was used to make sure that informational things showed up in the stderr stream. Now we use INFO level logging for this to avoid alarming the user. You can set WEZTERM_LOG=trace in the environment to get more verbose logging for troubleshooting purposes.
  • Windows: fix an issue where VNC-server-emulated AltGr was not treated as AltGr #392
  • X11: fix an issue where keys that produce unicode characters retained SHIFT as a modifier instead of normalizing it away. #394
  • Fixed an issue where a symbol-only font would be seen as 0-width and panic wezterm #404
  • Tweaked mouse selection: we now round the x-coordinate to the nearest cell which makes it a bit more forgiving if the mouse cursor is slightly to the left of the intended cell start. #350
  • Added selection_word_boundary option to control double-click word selection boundaries. The default is \t\n{}[]()"'`. #405
  • Added support for Curly, Dotted and Dashed underlines. See this documentation on the escape sequences how enable undercurl support in vim and nvim. #415
  • Fixed an issue where wezterm would spawn processes with umask 077 on unix systems, rather than the more commonly expected umask 022. #416
  • macOS: We now ship a Universal binary containing both Intel and "Apple Silicon" architectures
  • Setting a really large or really small font scale (using CTRL +/-) no longer causes a panic #428
  • Fixed an issue where the mouse wheel wasn't mapped to cursor up/down when the alternate screen was active #429
  • Fixed ToggleFullScreen not working on macOS and X11. It still doesn't function on Windows. native_macos_fullscreen_mode = false uses a fast full-screen window on macOS. Set it to true to use the slower macOS native "Spaces" style fullscreen mode. #177
  • Windows: fix an issue where the initial window size didn't factor the correct DPI when the system-wide display scaling was not 100%. #427
  • New: adjust_window_size_when_changing_font_size option to control whether changing the font size adjusts the dimensions of the window (true) or adjusts the number of terminal rows/columns (false). The default is true. #431
  • macOS: we no longer use MetalANGLE to render the gui; it was short lived as macOS Big Sur now uses Metal in its CGL implementation. Support for using MetalANGLE is still present if the dylib is found on startup, but we no longer ship the dylib.
  • Windows: when pasting text, ensure that the text has CRLF line endings unless bracketed paste is enabled. This imperfect heuristic helps to keep multi-line pastes on multiple lines when using Windows console applications and to avoid interleaved blank lines when using unix applications. #411
  • New: ClearScrollback now accepts a parameter to control whether the viewport is cleared along with the scrollback. Thanks to @dfrankland!
  • New: default_cwd to specify an alternative current working directory. Thanks to @dfrankland!
  • New: CopyTo and PasteFrom actions. Copy, Paste and PastePrimarySelection are now deprecated in favor of these new options.
  • X11: Mouse-based selection now copies-to and pastes-from the PrimarySelection by default. The CompleteSelection and CompleteSelectionOrOpenLinkAtMouseCursor actions now require a parameter to specify the clipboard.
  • X11: SHIFT-CTRL-C and SHIFT-CTRL-V now copy-to and paste from the Clipboard by default. SHIFT-Insert pastes from the PrimarySelection by default.
  • New: Added a new default CTRL-Insert key assignment bound to CopyTo(PrimarySelection)
  • macOS: Windows now have drop-shadows when they are opaque. These were disabled due transparency support was added. Thanks to Rice! #445
  • Unix: adjust font-config patterns to also match "dual spacing" fonts such as Iosevka Term. Thanks to Leiser! #446
  • New: Added alternate_buffer_wheel_scroll_speed option to control how many cursor key presses are generated by the mouse wheel when the alternate screen is active. The new default for this is a faster-than-previous-releases 3 lines per wheel tick. #432
  • macOS: Dead Keys are now processed even when use_ime=false. More details in the docs. #410.
  • X11: attempt to load cursors from the XCursor.theme resource specified on the root window #524
  • Added file:// URL matching to the default list of implicit hyperlink rules #525

20201101-103216-403d002d

  • Whoops! fixed a crash on macOS when using multiple windows in the new Metal renderer #316

20201031-154415-9614e117

  • New: split/pane support! CTRL+SHIFT+ALT+" to SplitVertical, and CTRL+SHIFT+ALT+% to SplitHorizontal.
  • New: LEADER modifier key support
  • New: window_background_opacity and window_background_image options to control using background images, transparent windows. More info
  • New color schemes: Dracula+, Gruvbox Light, MaterialDarker, Overnight Slumber, Popping and Locking, Rapture, jubi, nord.
  • New: expanded lua API allows handling URI clicks and keyboard events with lua callbacks. See wezterm.on docs.
  • The GUI layer now normalizes SHIFT state for keyboard processing. If a keypress is ASCII uppercase and SHIFT is held then the SHIFT modifier is removed from the set of active modifiers. This has implications for your key assignment configuration; previously you would write {key="T", mods="CTRL|SHIFT"}, after updating to this release you need to write {key="T", mods="CTRL"} in order for your key bindings to take effect.
  • Added show_tab_index_in_tab_bar option which defaults to true. Causes the tab's ordinal index to be prefixed to tab titles. The displayed number is 1-based. You can set tab_and_split_indices_are_zero_based=true if you prefer the number to be zero based.
  • On Linux and macOS systems, wezterm can now attempt to guess the current working directory that should be set in newly spawned local panes/tabs, in case you don't have OSC 7 integration setup in your shell.
  • We now bundle JetBrains Mono and use it as the default font, and add it as a default fallback font. Similarly, we also bundle Noto Color Emoji as a default fallback for emoji.
  • Added automatically_reload_config=false option to disable automatic config reloading. When set to false, you will need to manually trigger a config reload (default: SUPER+R or CTRL+SHIFT+R)
  • CloseCurrentTab now requires a confirm parameter.
  • Halved the memory usage requirements per Cell in the common case (saving 32 bytes per cell), which gives more headroom for users with large scrollback.
  • Reduced initial GPU VRAM requirement to 2MiB. Improved texture allocation to avoid needing lots of VRAM.
  • macOS: Fix issue where new windows would open as Cocoa tabs when wezterm was maximized.
  • macOS: Fix issue where wezterm wouldn't adjust to DPI changes when dragging across monitors or the screen resolution changed
  • macOS: Reduced trackpad based scrolling sensitivity; it was hyper sensitive in previous releases, and now it is more reasonable.
  • Fix an issue where EGL failed to initialize on Linux
  • If EGL/WGL/OpenGL fail to initialize, we now try to fallback to Mesa OpenGL in software render mode. This should result in its llvmpipe renderer being used as a fallback, which has improved visuals compared to wezterm's own basic CPU based renderer. (This applies to X11/Wayland and Windows systems).
  • Setting front_end="Software" will try to use the Mesa OpenGL software renderer if available (X11/Wayland/Windows). The old basic CPU renderer has been removed.
  • The multiplexer server has been moved into its own wezterm-mux-server executable. You will need to revise your serve_command configuration.
  • Windows: when started in an RDP session, force the use of the Mesa software renderer to work around problems with RDP GPU emulation.
  • Fixed an issue with TLS Multiplexing where bootstrapping certificates would usually fail.
  • Windows: Fixed an issue that prevented ALT-Space from showing the system menu in the window.
  • Windows: Fixed dead key handling. By default dead keys behave the same as in other programs and produce diacritics. However, setting use_dead_keys = false in the config will cause dead keys to behave like a regular key; eg: ^ would just emit ^ as its own character.
  • Windows: Fixed an issue with the Hide key assignment; it would hide the window with no way to show it again! Hide now minimizes the window instead.
  • macOS: we now use Metal to render the gui, via MetalANGLE
  • Windows: we now prefer to use Direct3D11 to render the gui, via ANGLE EGL. The primary benefit of this is that upgrading your graphics drivers while you have a stateful wezterm session will no longer terminate the wezterm process. Resize behavior is not as smooth with ANGLE as the prior WGL. If you wish, you can set prefer_egl = false to use WGL.
  • Improved image protocol support to have better render fidelity and to reduce VRAM usage when the same image it displayed multiple times in the same pane.

20200909-002054-4c9af461

  • Added support for OSC 1 (Icon Title changing), and changed how that interacts with OSC 2 (Window Title changing). If you specify OSC 1 as a non-empty string, then that will be used for the title of that terminal instance in the GUI. Otherwise the Window Title will be reported instead.
  • Added missing mappings for Application Keypad keys on Linux
  • Workaround an EGL issue where Mesa reports the least-best alpha value when enumerating configs, rather than the best alpha. This could lead to incorrect alpha under XWayland and failure to initialize EGL and fallbacks to the Software renderer in some other cases.
  • enable_wayland now defaults to false; mutter keeps breaking client-side window decoration so let's just make it opt-in so that the default experience is better.
  • Fixed a crash on Linux/X11 when using wezterm connect HOST
  • Added tab_max_width config setting to limit the maximum width of tabs in the tab bar. This defaults to 16 glyphs in width.

20200718-095447-d2315640

  • Added support for DECSET 1004 Focus Reporting to local (not multiplexer) terminal sessions.
  • Added support for SGR 53/55 which enable/disable Overline style. printf "\x1b[53moverline\x1b[0m\n"
  • Windows: updated bundled openconsole.exe to efb1fdd to resolve an issue where bold text didn't respect the configured color scheme.
  • Added bold_brightens_ansi_colors option to allow disabling the automatic brightening of bold text.
  • Unix: fix an issue where setting the current working directory for a custom spawned command would not take effect (thanks @john01dav!)
  • Windows: fixed buffering/timing issue where a response to a color query in vim could be misinterpreted and replace a character in the editor with the letter g.
  • X11: Improved support for non-24bpp display depths. WezTerm now tries harder to obtain an 8bpc surface on both 16bpp and 30bpp (10bpc) displays.
  • Windows: fixed falling back to a simpler OpenGL context if WGL is unable to negotiate a robust context. This is useful on systems with dual high/low power GPU hardware where the OpenGL versions for the two GPUs are different!
  • Color Schemes: synced with ea2c841 which includes new schemes: Adventure, Banana Blueberry, Blue Matrix, BlueBerryPie, Cyberdyne, Django, DjangoRebornAgain, DjangoSmooth, DoomOne, Konsolas, Laser, Mirage, Rouge 2, Sakura, Scarlet Protocol, synthwave-everything, Tinacious Design (Dark), Tinacious Design (Light).

20200620-160318-e00b076c

  • Fixed default mapping of ambiguous ctrl key combinations (i, m, [, {, @) so that they emit the old school tab, newline, escape etc. values. These got broken as part of prototyping CSI-u support a while back.
  • Added option to enable CSI-u key encodings. This is a new mapping scheme defined here http://www.leonerd.org.uk/hacks/fixterms/ that disambiguates and otherwise enables more key binding combinations. You can enable this setting using enable_csi_u_key_encoding = true in your config file.
  • Very early support for sixel graphics
  • macos: use_ime now defaults to false; this is a better out of the box experience for most users.
  • macos: we now attempt to set a reasonable default LANG environment based on the locale settings at the time that wezterm is launched.
  • macos: introduce send_composed_key_when_left_alt_is_pressed and send_composed_key_when_right_alt_is_pressed boolean config settings. Like the existing send_composed_key_when_alt_is_pressed option, these control whether the Alt or Option modifier produce composed output or generate the raw key position with the ALT modifier applied. The difference from the existing config option is that on systems where Left and Right Alt can be distinguished you now have the ability to control this behavior independently. The default behavior on these systems is send_composed_key_when_left_alt_is_pressed=false and send_composed_key_when_right_alt_is_pressed=true so that the right Alt key behaves more like an AltGr key and generates the composed input, while the Left Alt is regular uncomposed Alt.
  • Fonts: fixed an issue where specifying italic or bold in the second parameter of wezterm.font didn't work as intended or documented
  • Improved terminal emulation conformance; added left/right margin support and now passes esctest to a similar degree as iTerm2
  • Fixed an issue where unmodified F5+ would use the CSI-u encoded-modifiers format, and confused eg: htop.
  • ActivateTab now accepts negative numbers as a way to reference the last tab in the Window. The default assignment for CTRL+SHIFT+9 and CMD+9 is now ActivateTab=-1, which selects the last tab.
  • Fixed an issue when applying hyperlink rules to lines that had mixed width characters

20200607-144723-74889cd4

  • Windows: Fixed AltGr handling for European layouts
  • X11: Added PastePrimarySelection key assignment that pastes the contents of the primary selection rather than the clipboard.
  • Removed old TOML config file parsing code
  • Removed old arg="something" key binding parameter. This was a remnant from the TOML based configuration. You're unlikely to notice this unless you followed an example from the docs; migrate instead to using eg: action=wezterm.action{ActivateTab=i-1} to pass the integer argument.
  • Windows: now also available with a setup.exe installer. The installer enables "Open WezTerm Here" in the explorer.exe context menu.
  • Added ClearScrollback key assignment to clear the scrollback. This is bound to CMD-K and CTRL-SHIFT-K by default.
  • Added Search key assignment to search the scrollback. Read the new scrollback section for more information!
  • Fixed an issue where ALT+number would send the wrong output for European keyboard layouts on macOS and Linux. As part of this the default behavior has changed: we used to force ALT+number to produce ALT+number instead of the composed key for that layout. We now emit the composed key by default. You can switch to the old behavior either by explicitly binding those keys or by setting send_composed_key_when_alt_is_pressed = false in your configuration file.
  • Windows: the launcher menu now automatically lists out any WSL environments you have installed so that you can quickly spawn a shell in any of them. You can suppress this behavior if you wish by setting add_wsl_distributions_to_launch_menu = false. Read more about the launcher menu
  • Added ActivateCopyMode key assignment to put the tab into mouseless-copy mode; use the keyboard to define the selected text region. This is bound to CTRL-SHIFT-X by default.

20200517-122836-92c201c6

  • AppImage: Support looking for configuration in WezTerm.AppImage.config and WezTerm.AppImage.home to support portable thumbdrive use of wezterm on linux systems
  • We now check the github releases section for updated stable releases and show a simple UI to let you know about the update, with links to download/install it. We don't automatically download the release: just make a small REST API call to github. There is no data collection performed by the wezterm project as part of this. We check once every 24 hours. You can set check_for_updates = false in your config to disable this completely if desired, or set check_for_updates_interval_seconds to an alternative update interval.
  • Added support for OSC 110-119 to reset dynamic colors, improving our support for Neovim.
  • Change OSC rendering to use the long-form ST sequence ESC \ rather than the more convenient alternative BEL representation, which was not recognized by Neovim when querying for color information.
  • Fixed Shift-Tab key on X11 and Wayland
  • WezTerm is now also available to Windows users via Scoop

20200503-171512-b13ef15f

  • Added the launch_menu configuration for the launcher menu as described in Launching Programs.
  • Fixed a crash when reloading a config with enable_tab_bar=false
  • Fixed missing icon when running under X11 and Wayland
  • Wayland client-side-decorations improved and now also render window title
  • Implicitly SGR reset when switching alt and primary screen
  • Improved config error reporting UI: we now show just a single window with all errors rather than one window per failed reload.

20200406-151651-5b700e4

  • Added lua based configuration. Reading TOML configuration will be rapidly phased out in favor of the more flexible lua config; for now, both are supported, but new features may not be available via TOML.
  • Added launcher overlay. Right click the + button on the tab bar or bind a key to ShowLauncher to activate it. It allows spawning tabs in various domains as well as attaching multiplexer sessions that were not connected automatically at startup.
  • Windows: we now support mouse reporting on Windows native ptys. For this to work, conpty.dll and OpenConsole.exe must be present alongside wezterm.exe when starting wezterm.
  • Added initial_rows and initial_cols config options to set the starting size of new terminal windows
  • Added hide_tab_bar_if_only_one_tab = true config option to hide the tab bar when the window contains only a single tab.
  • Added HideApplication key action (defaults to CMD-H on macOS only) which hides the wezterm application. This is macOS specific.
  • Added QuitApplication key action which causes the gui loop to terminate and the application to exit. This is not bound by default, but you may choose to assign it to something like CMD-Q.
  • Added set_environment_variables configuration section to allow defining some environment variables to be passed to your shell.
  • Improved connectivity UI that shows ssh and mux connection progress/status
  • Fixed a bug where the baud rate was not applied when opening a serial port
  • Added predictive local echo to the multiplexer for higher latency connections
  • We now grey out the UI for lagging multiplexer connections
  • Set an upper bound on the memory usage for multiplexer connections

20200202-181957-765184e5

  • Improved font shaping performance 2-3x by adding a shaper cache
  • Windows: now has support for TLS based multiplexer connections
  • Multiplexer: TLS multiplexer can now be bootstrapped via SSH, and automatically manages certificates
  • Unix: We now default to spawning shells with the -l argument to request a login shell. This is important on macOS where the default GUI environment doesn't source a working PATH from the shell, resulting in an anemic PATH unless the user has taken care to cover this in their shell startup. -l works to enable a login shell in zsh, bash, fish and tcsh. If it doesn't work with your shell, you can use the default_prog configuration option to override this.
  • We now accept rgb:XX/XX/XX color syntax for OSC 4 and related escape sequences; previously only #XXXXXX and named colors were accepted.
  • We now accept OSC 104 to reset custom colors to their defaults.
  • Added Tab Navigator overlay for folks that hoard tabs; it presents an interactive UI for selecting and activating a tab from a vertically oriented list. This is bound to Alt-9 by default.
  • Added support for DEC Origin Mode (DECOM) which improves cursor positioning with some applications
  • Added support for DEC AutoWrap Mode (DECAWM) which was previously always on. This improves rendering for applications that explicitly disable it.
  • We now show a connection status window while establishing MUX and SSH connections. The status window is also where any interactive authentication is carried out for eg: SSH sessions.
  • Improved SSH authentication handling; we now give you a few opportunities to authenticate and are now able to successfully authenticate with sites that have configured 2-Factor authentication in their server side SSH configuration.
  • Fixed an issue where SHIFT-Space would swallow the space key.
  • Nightly builds are now available for Linux in AppImage format.
  • Shift+Left Mouse button can now be used to extend the selection to the clicked location. This is particularly helpful when you want to select something that is larger than the viewport.
  • Windows: a single mouse wheel tick now scrolls by the number of positions configured in the Windows system settings (default 3)
  • Windows: fixed IME position when the tab bar is enabled
  • Windows: removed support for WinPty, which was too difficult to obtain, configure and use.
  • Configuration errors now show in a separate window on startup, or when the configuration is reloaded
  • Improved reliability and performance of MUX sessions, although they still have room for further improvement

20200113-214446-bb6251f

  • Added color_scheme configuration option and more than 200 color schemes
  • Improved resize behavior; lines that were split due to the width of the terminal are now rewrapped on resize. Issue 14
  • Double-click and triple-click and hold followed by a drag now extends the selection by word and line respectively.
  • The OSC 7 (CurrentWorkingDirectory) escape sequence is now supported; wezterm records the cwd in a tab and that will be used to set the working directory when spawning new tabs in the same domain. You will need to configure your shell to emit OSC 7 when appropriate.
  • Changed Backspace/Delete handling
  • Added MoveTabRelative for changing the ordering of tabs within a window using key assignments CTRL+SHIFT+PageUp and CTRL+SHIFT+PageDown
  • The multiplexer protocol is undergoing major changes. The multiplexer will now raise an error if the client and server are incompatible.
  • Fixed an issue where wezterm would linger for a few seconds after the last tab was closed
  • Fixed an issue where wezterm wouldn't repaint the screen after a tab was closed
  • Clicking the OS window close button in the titlebar now closes the window rather than the active tab
  • Added use_ime option to optionally disable the use of the IME on macOS. You might consider enabling this if you don't like the way that the IME swallows key repeats for some keys.
  • Fix an issue where the pidfile would leak into child processes and block restarting the mux server
  • Fix an issue where the title bars of remote tabs were not picked up at domain attach time
  • Fixed selection and scrollbar position for multiplexer tabs
  • Added ScrollByPage key assignment and moved the SHIFT+PageUp handling up to the gui layer so that it can be rebound.
  • X11: a single mouse wheel tick now scrolls by 5 rows rather than 1
  • Wayland: normalize line endings to unix line endings when pasting
  • Windows: fixed handling of focus related messages, which impacted both the appearance of the text cursor and copy and paste handling.
  • When hovering over implicitly hyperlinked items, we no longer show the underline for every other URL with the same destination

20191229-193639-e7aa2f3

  • Fixed a hang when using middle mouse button to paste
  • Recognize 8-bit C1 codes encoded as UTF-8, which are used in the Fedora 31 bash prexec notification for gnome terminal
  • Ensure that underlines are a minimum of 1 pixel tall
  • Reduced CPU utilization on some Wayland compositors
  • Added $WEZTERM_CONFIG_FILE to the start of the config file search path
  • Added new font rendering options:
font_antialias = "Subpixel" # None, Greyscale, Subpixel
font_hinting = "Full" # None, Vertical, VerticalSubpixel, Full
  • Early startup errors now generate a "toast" notification, giving you more of a clue about what went wrong
  • We now use the default configuration if the config file had errors, rather than refusing to start
  • Wayland compositors: Improved detection of display scaling on startup
  • Added harfbuzz_features option to specify stylistic sets for fonts such as Fira Code, and to control various typographical options
  • Added a window_padding config section to add padding to the window display
  • We now respect DECSCUSR and DECTCEM escape sequence to select between hidden, block, underline and bar cursor types, as well as blinking cursors. New configuration options have been added to control the appearance and blink rate.
  • We now support an optional basic scroll bar. The scroll bar occupies the right window padding and has a configurable color. Scroll bars are not yet supported for multiplexer connections and remain disabled by default for the moment.
  • Color scheme changes made in the config file now take effect at config reload time for all tabs that have not applied a dynamic color scheme.

20191218-101156-bf35707

  • Configuration errors detected during config loading are now shown as a system notification
  • New font_dirs configuration option to specify a set of dirs to search for fonts. Useful for self-contained wezterm deployments.
  • The font_system option has been split into font_locator, font_shaper and font_rasterizer options.
  • Don't allow child processes to inherit open font files on posix systems!
  • Disable Nagle's algorithm for wezterm ssh sessions
  • Add native Wayland window system support

20191124-233250-cb9fd7d

  • New tab bar UI displays tabs and allows creating new tabs
  • Configuration file changes are hot reloaded and take effect automatically on save
  • wezterm ssh user@host for ad-hoc SSH sessions. You may also define SSH multiplexer sessions.
  • wezterm serial /dev/ttyUSB0 to connect to your Arduino
  • wezterm imgcat /some/image.png to display images inline in the terminal using the iTerm2 image protocol
  • IME support on macOS and Windows systems
  • Automatic fallback to software rendering if no GPU is available (eg: certain types of remote desktop sessions)

Sponsoring

If you use and find wezterm valuable, please consider sponsoring its development.

Your support helps to validate the time spent so far and encourages me to spend more time working on it in the future, keeping the project alive and current.

It may not be readily apparent, but maintaining software that runs across multiple different operating systems and graphical environments is particularly labor intensive.

Add to that the time it takes to triage and respond to questions and issues on GitHub and Element, and that's a significant amount of time and energy just to keep things ticking over, even without adding new features or making significant improvements.

It feels like a full time job, but with your support, maybe it could actually be a full time job?

If you are in a position to provide recurring or even a one-time sponsorship, I would appreciate it.

You can find me on the following platforms:

:simple-githubsponsors: GitHub{ .md-button } :simple-patreon: Patreon{ .md-button } :simple-kofi: Ko-Fi { .md-button } :simple-liberapay: Liberapay{ .md-button }