2021-06-19 13:19:31 +02:00
# Themes
2023-03-06 09:27:17 +00:00
To use a theme add `theme = "<name>"` to the top of your [`config.toml` ](./configuration.md ) file, or select it during runtime using `:theme <name>` .
2021-06-19 13:19:31 +02:00
2022-01-07 19:14:31 +01:00
## Creating a theme
2021-06-19 13:19:31 +02:00
2023-03-06 09:27:17 +00:00
Create a file with the name of your theme as the file name (i.e `mytheme.toml` ) and place it in your `themes` directory (i.e `~/.config/helix/themes` or `%AppData%\helix\themes` on Windows). The directory might have to be created beforehand.
2021-06-19 13:19:31 +02:00
2023-03-06 09:27:17 +00:00
> 💡 The names "default" and "base16_default" are reserved for built-in themes
> and cannot be overridden by user-defined themes.
2021-06-19 13:19:31 +02:00
2023-03-06 09:27:17 +00:00
### Overview
2021-06-19 13:19:31 +02:00
Each line in the theme file is specified as below:
```toml
2022-10-13 19:03:58 +02:00
key = { fg = "#ffffff ", bg = "#000000 ", underline = { color = "#ff0000 ", style = "curl"}, modifiers = ["bold", "italic"] }
2021-06-19 13:19:31 +02:00
```
2023-03-06 09:27:17 +00:00
Where `key` represents what you want to style, `fg` specifies the foreground color, `bg` the background color, `underline` the underline `style` /`color` , and `modifiers` is a list of style modifiers. `bg` , `underline` and `modifiers` can be omitted to defer to the defaults.
2021-06-19 13:19:31 +02:00
To specify only the foreground color:
```toml
key = "#ffffff "
```
2023-03-06 09:27:17 +00:00
If the key contains a dot `'.'` , it must be quoted to prevent it being parsed as a [dotted key ](https://toml.io/en/v1.0.0#keys ).
2021-06-19 13:19:31 +02:00
```toml
"key.key" = "#ffffff "
```
2023-03-06 09:27:17 +00:00
For inspiration, you can find the default `theme.toml`
[here ](https://github.com/helix-editor/helix/blob/master/theme.toml ) and
user-submitted themes
[here ](https://github.com/helix-editor/helix/blob/master/runtime/themes ).
### Using the linter
Use the supplied linting tool to check for errors and missing scopes:
```sh
cargo xtask themelint onedark # replace onedark with < name >
```
## The details of theme creation
2021-09-07 13:00:52 +09:00
### Color palettes
2021-06-19 13:19:31 +02:00
2023-03-06 09:27:17 +00:00
It's recommended to define a palette of named colors, and refer to them in the
2021-06-30 16:24:30 +02:00
configuration values in your theme. To do this, add a table called
`palette` to your theme file:
```toml
2022-04-08 15:21:52 -07:00
"ui.background" = "white"
"ui.text" = "black"
2021-06-30 16:24:30 +02:00
[palette]
white = "#ffffff "
black = "#000000 "
```
2023-03-06 09:27:17 +00:00
Keep in mind that the `[palette]` table includes all keys after its header,
so it should be defined after the normal theme options.
2021-09-02 22:05:33 +05:30
2021-09-03 16:42:29 +05:30
The default palette uses the terminal's default 16 colors, and the colors names
are listed below. The `[palette]` section in the config file takes precedence
over it and is merged into the default palette.
2021-09-02 22:05:33 +05:30
| Color Name |
| --- |
| `black` |
| `red` |
| `green` |
| `yellow` |
| `blue` |
| `magenta` |
| `cyan` |
| `gray` |
| `light-red` |
| `light-green` |
| `light-yellow` |
| `light-blue` |
| `light-magenta` |
| `light-cyan` |
| `light-gray` |
| `white` |
2021-09-07 13:00:52 +09:00
### Modifiers
2023-03-06 09:27:17 +00:00
The following values may be used as modifier, provided they are supported by
your terminal emulator.
2021-09-07 13:00:52 +09:00
2022-09-04 17:57:14 +03:00
| Modifier |
| --- |
| `bold` |
| `dim` |
| `italic` |
| `underlined` |
| `slow_blink` |
| `rapid_blink` |
| `reversed` |
| `hidden` |
| `crossed_out` |
2021-09-07 13:00:52 +09:00
2023-03-06 09:27:17 +00:00
> 💡 The `underlined` modifier is deprecated and only available for backwards compatibility.
2022-10-13 19:03:58 +02:00
> Its behavior is equivalent to setting `underline.style="line"`.
2022-10-08 16:39:02 +02:00
2023-03-06 09:27:17 +00:00
### Underline style
2022-10-01 02:15:25 +02:00
2023-03-06 09:27:17 +00:00
One of the following values may be used as a value for `underline.style` , providing it is
supported by your terminal emulator.
2022-10-01 02:15:25 +02:00
2021-09-07 13:00:52 +09:00
| Modifier |
| --- |
2022-10-01 02:15:25 +02:00
| `line` |
| `curl` |
| `dashed` |
2022-12-12 03:14:10 +09:00
| `dotted` |
2022-10-06 20:50:54 +02:00
| `double_line` |
2022-10-01 02:15:25 +02:00
2021-09-07 13:00:52 +09:00
2022-10-04 14:33:45 -07:00
### Inheritance
2023-03-06 09:27:17 +00:00
Extend other themes by setting the `inherits` property to an existing theme.
2022-10-04 14:33:45 -07:00
```toml
inherits = "boo_berry"
# Override the theming for "keyword"s:
"keyword" = { fg = "gold" }
# Override colors in the palette:
[palette]
berry = "#2A2A4D "
```
2021-09-07 13:00:52 +09:00
### Scopes
2023-03-06 09:27:17 +00:00
The following is a list of scopes available to use for styling:
2021-09-07 13:00:52 +09:00
#### Syntax highlighting
These keys match [tree-sitter scopes ](https://tree-sitter.github.io/tree-sitter/syntax-highlighting#theme ).
2023-03-06 09:27:17 +00:00
When determining styling for a highlight, the longest matching theme key will be used. For example, if the highlight is `function.builtin.static` , the key `function.builtin` will be used instead of `function` .
2021-09-07 13:00:52 +09:00
We use a similar set of scopes as
2023-03-06 09:27:17 +00:00
[Sublime Text ](https://www.sublimetext.com/docs/scope_naming.html ). See also
2021-09-07 13:00:52 +09:00
[TextMate ](https://macromates.com/manual/en/language_grammars ) scopes.
2023-03-06 09:27:17 +00:00
- `attribute` - Class attributes, HTML tag attributes
2022-08-14 14:35:15 +01:00
2021-09-07 13:00:52 +09:00
- `type` - Types
- `builtin` - Primitive types provided by the language (`int` , `usize` )
2023-01-09 02:26:08 +00:00
- `enum`
- `variant`
2021-12-19 00:05:43 +05:30
- `constructor`
2021-09-07 13:00:52 +09:00
2023-03-06 09:27:17 +00:00
- `constant` (TODO: constant.other.placeholder for `%v` )
2021-09-07 13:00:52 +09:00
- `builtin` Special constants provided by the language (`true` , `false` , `nil` etc)
- `boolean`
- `character`
2021-11-02 23:00:52 -04:00
- `escape`
- `numeric` (numbers)
- `integer`
- `float`
2021-09-07 13:00:52 +09:00
- `string` (TODO: string.quoted.{single, double}, string.raw/.unquoted)?
- `regexp` - Regular expressions
- `special`
- `path`
- `url`
2021-10-14 13:58:08 -05:00
- `symbol` - Erlang/Elixir atoms, Ruby symbols, Clojure keywords
2021-10-14 13:45:32 -05:00
2021-09-07 13:00:52 +09:00
- `comment` - Code comments
- `line` - Single line comments (`//` )
2023-03-06 09:27:17 +00:00
- `block` - Block comments (e.g. (`/* */` )
2021-09-07 13:00:52 +09:00
- `documentation` - Documentation comments (e.g. `///` in Rust)
- `variable` - Variables
2023-03-06 09:27:17 +00:00
- `builtin` - Reserved language variables (`self` , `this` , `super` , etc.)
2021-09-07 13:00:52 +09:00
- `parameter` - Function parameters
2021-11-02 23:00:52 -04:00
- `other`
- `member` - Fields of composite data types (e.g. structs, unions)
2021-09-07 13:00:52 +09:00
- `label`
- `punctuation`
- `delimiter` - Commas, colons
- `bracket` - Parentheses, angle brackets, etc.
2022-08-14 14:35:15 +01:00
- `special` - String interpolation brackets.
2021-09-07 13:00:52 +09:00
- `keyword`
- `control`
- `conditional` - `if` , `else`
- `repeat` - `for` , `while` , `loop`
- `import` - `import` , `export`
2021-11-28 20:38:17 -05:00
- `return`
2022-01-03 20:31:17 -06:00
- `exception`
2021-11-28 20:38:17 -05:00
- `operator` - `or` , `in`
2023-03-06 09:27:17 +00:00
- `directive` - Preprocessor directives (`#if` in C)
2021-09-07 13:00:52 +09:00
- `function` - `fn` , `func`
2022-07-06 13:54:07 +00:00
- `storage` - Keywords describing how things are stored
2023-03-06 09:27:17 +00:00
- `type` - The type of something, `class` , `function` , `var` , `let` , etc.
2022-07-06 13:54:07 +00:00
- `modifier` - Storage modifiers like `static` , `mut` , `const` , `ref` , etc.
2021-09-07 13:00:52 +09:00
2021-11-28 20:38:17 -05:00
- `operator` - `||` , `+=` , `>`
2021-09-07 13:00:52 +09:00
- `function`
- `builtin`
- `method`
- `macro`
2022-04-27 14:21:20 -05:00
- `special` (preprocessor in C)
2021-09-07 13:00:52 +09:00
- `tag` - Tags (e.g. `<body>` in HTML)
2023-03-10 17:32:45 +01:00
- `builtin`
2021-09-07 13:00:52 +09:00
- `namespace`
2023-01-09 02:26:08 +00:00
- `special`
2021-12-15 17:46:40 +09:00
- `markup`
- `heading`
2022-02-21 08:45:48 +01:00
- `marker`
- `1` , `2` , `3` , `4` , `5` , `6` - heading text for h1 through h6
2021-12-15 17:46:40 +09:00
- `list`
- `unnumbered`
- `numbered`
2023-03-26 00:41:31 +08:00
- `checked`
- `unchecked`
2021-12-15 17:46:40 +09:00
- `bold`
- `italic`
2023-03-13 00:56:54 +08:00
- `strikethrough`
2021-12-19 00:05:43 +05:30
- `link`
2023-03-06 09:27:17 +00:00
- `url` - URLs pointed to by links
- `label` - non-URL link references
- `text` - URL and image descriptions in links
2021-12-15 17:46:40 +09:00
- `quote`
- `raw`
- `inline`
- `block`
2021-12-22 09:58:51 -06:00
- `diff` - version control changes
- `plus` - additions
- `minus` - deletions
- `delta` - modifications
- `moved` - renamed or moved files/changes
2021-09-07 13:00:52 +09:00
#### Interface
2023-03-06 09:27:17 +00:00
These scopes are used for theming the editor interface:
2021-09-07 13:00:52 +09:00
2022-01-24 09:41:25 +08:00
- `markup`
- `normal`
2023-03-06 09:27:17 +00:00
- `completion` - for completion doc popup UI
- `hover` - for hover popup UI
2022-01-24 09:41:25 +08:00
- `heading`
2023-03-06 09:27:17 +00:00
- `completion` - for completion doc popup UI
- `hover` - for hover popup UI
2022-01-24 09:41:25 +08:00
- `raw`
- `inline`
2023-03-06 09:27:17 +00:00
- `completion` - for completion doc popup UI
- `hover` - for hover popup UI
2022-01-24 09:41:25 +08:00
2021-09-07 13:00:52 +09:00
2023-03-11 03:32:14 +01:00
| Key | Notes |
| --- | --- |
| `ui.background` | |
| `ui.background.separator` | Picker separator below input line |
| `ui.cursor` | |
| `ui.cursor.normal` | |
| `ui.cursor.insert` | |
| `ui.cursor.select` | |
| `ui.cursor.match` | Matching bracket etc. |
| `ui.cursor.primary` | Cursor with primary selection |
| `ui.cursor.primary.normal` | |
| `ui.cursor.primary.insert` | |
| `ui.cursor.primary.select` | |
| `ui.gutter` | Gutter |
| `ui.gutter.selected` | Gutter for the line the cursor is on |
| `ui.linenr` | Line numbers |
| `ui.linenr.selected` | Line number for the line the cursor is on |
| `ui.statusline` | Statusline |
| `ui.statusline.inactive` | Statusline (unfocused document) |
| `ui.statusline.normal` | Statusline mode during normal mode ([only if `editor.color-modes` is enabled][editor-section]) |
| `ui.statusline.insert` | Statusline mode during insert mode ([only if `editor.color-modes` is enabled][editor-section]) |
| `ui.statusline.select` | Statusline mode during select mode ([only if `editor.color-modes` is enabled][editor-section]) |
| `ui.statusline.separator` | Separator character in statusline |
| `ui.popup` | Documentation popups (e.g. Space + k) |
| `ui.popup.info` | Prompt for multiple key options |
| `ui.window` | Borderlines separating splits |
| `ui.help` | Description box for commands |
| `ui.text` | Command prompts, popup text, etc. |
| `ui.text.focus` | |
| `ui.text.inactive` | Same as `ui.text` but when the text is inactive (e.g. suggestions) |
| `ui.text.info` | The key: command text in `ui.popup.info` boxes |
| `ui.virtual.ruler` | Ruler columns (see the [`editor.rulers` config][editor-section]) |
| `ui.virtual.whitespace` | Visible whitespace characters |
| `ui.virtual.indent-guide` | Vertical indent width guides |
| `ui.virtual.inlay-hint` | Default style for inlay hints of all kinds |
| `ui.virtual.inlay-hint.parameter` | Style for inlay hints of kind `parameter` (LSPs are not required to set a kind) |
| `ui.virtual.inlay-hint.type` | Style for inlay hints of kind `type` (LSPs are not required to set a kind) |
| `ui.virtual.wrap` | Soft-wrap indicator (see the [`editor.soft-wrap` config][editor-section]) |
| `ui.menu` | Code and command completion menus |
| `ui.menu.selected` | Selected autocomplete item |
| `ui.menu.scroll` | `fg` sets thumb color, `bg` sets track color of scrollbar |
| `ui.selection` | For selections in the editing area |
| `ui.selection.primary` | |
2023-03-20 06:55:48 -07:00
| `ui.highlight` | Highlighted lines in the picker preview |
2023-03-11 03:32:14 +01:00
| `ui.cursorline.primary` | The line of the primary cursor ([if cursorline is enabled][editor-section]) |
| `ui.cursorline.secondary` | The lines of any other cursors ([if cursorline is enabled][editor-section]) |
| `ui.cursorcolumn.primary` | The column of the primary cursor ([if cursorcolumn is enabled][editor-section]) |
| `ui.cursorcolumn.secondary` | The columns of any other cursors ([if cursorcolumn is enabled][editor-section]) |
| `warning` | Diagnostics warning (gutter) |
| `error` | Diagnostics error (gutter) |
| `info` | Diagnostics info (gutter) |
| `hint` | Diagnostics hint (gutter) |
| `diagnostic` | Diagnostics fallback style (editing area) |
| `diagnostic.hint` | Diagnostics hint (editing area) |
| `diagnostic.info` | Diagnostics info (editing area) |
| `diagnostic.warning` | Diagnostics warning (editing area) |
| `diagnostic.error` | Diagnostics error (editing area) |
2022-04-20 13:04:17 -05:00
2022-06-30 05:26:00 -04:00
[editor-section]: ./configuration.md#editor -section