mirror of
https://github.com/helix-editor/helix.git
synced 2024-11-22 01:16:18 +04:00
Rewrite and refactor all documentation (#5534)
* Rewrite and refactor all documentation * Rewrite and refactor the guides * update runtime directory instructions for windows * Update the Ubuntu 3rd party repo section with 22.10 * Merge from upstream * Rewrite and refactor all documentation * Apply suggestions from code review Apply the suggestions that can be committed from the GitHub web interface. Co-authored-by: Michael Davis <mcarsondavis@gmail.com> * Add Windows themes folder Co-authored-by: digidoor <37601466+digidoor@users.noreply.github.com> * Apply the rest of the suggestions from the code review * Revert "Apply the rest of the suggestions from the code review" This reverts commit498be1b7a1
. * Revert "Merge branch 'rewrite-and-refactor-all-documentation' of github.com:David-Else/helix into rewrite-and-refactor-all-documentation" This reverts commit7c8404248f
, reversing changes made tod932969cfc
. * Apply code review suggestions * Changes after re-reading all documents * Missed a full stop * Code review suggestions and remove macOS and Windows specific sections * Add OpenBSD to heading * Add back macOS and Windows sections and further simplify and improve * Change wording to nightly * Remove README installation section and turn into a link * Simplify building from source and follow code review suggestions * Code review revisions * Fix copy paste mistake * Apply the latest code review suggestions * More small code review items * Change minor modes for code review * Fix link and typos * Add note that you need a c++ compiler to install the tree-sitter grammars * Add pacman example * Make sure all headings are lower case * Revert to the original passage adding a reference to Windows that was missing * Update book/src/guides/adding_languages.md Fix grammar typo Co-authored-by: Michael Davis <mcarsondavis@gmail.com> * Update book/src/install.md Fix tree sitter typo Co-authored-by: Michael Davis <mcarsondavis@gmail.com> * Remove TOC links to main heading --------- Co-authored-by: CptPotato <3957610+CptPotato@users.noreply.github.com> Co-authored-by: Michael Davis <mcarsondavis@gmail.com> Co-authored-by: digidoor <37601466+digidoor@users.noreply.github.com>
This commit is contained in:
parent
5ebe1014ac
commit
707457c632
84
README.md
84
README.md
@ -45,92 +45,10 @@ # Features
|
|||||||
|
|
||||||
# Installation
|
# Installation
|
||||||
|
|
||||||
Packages are available for various distributions (see [Installation docs](https://docs.helix-editor.com/install.html)).
|
[Installation documentation](https://docs.helix-editor.com/install.html).
|
||||||
|
|
||||||
If you would like to build from source:
|
|
||||||
|
|
||||||
```shell
|
|
||||||
git clone https://github.com/helix-editor/helix
|
|
||||||
cd helix
|
|
||||||
cargo install --locked --path helix-term
|
|
||||||
```
|
|
||||||
|
|
||||||
This will install the `hx` binary to `$HOME/.cargo/bin` and build tree-sitter grammars in `./runtime/grammars`.
|
|
||||||
|
|
||||||
Helix needs its runtime files so make sure to copy/symlink the `runtime/` directory into the
|
|
||||||
config directory (for example `~/.config/helix/runtime` on Linux/macOS, or `%AppData%/helix/runtime` on Windows).
|
|
||||||
|
|
||||||
| OS | Command |
|
|
||||||
| -------------------- | ------------------------------------------------ |
|
|
||||||
| Windows (Cmd) | `xcopy /e /i runtime %AppData%\helix\runtime` |
|
|
||||||
| Windows (PowerShell) | `xcopy /e /i runtime $Env:AppData\helix\runtime` |
|
|
||||||
| Linux / macOS | `ln -s $PWD/runtime ~/.config/helix/runtime` |
|
|
||||||
|
|
||||||
Starting with Windows Vista you can also create symbolic links on Windows. Note that this requires
|
|
||||||
elevated privileges - i.e. PowerShell or Cmd must be run as administrator.
|
|
||||||
|
|
||||||
**PowerShell:**
|
|
||||||
|
|
||||||
```powershell
|
|
||||||
New-Item -ItemType Junction -Target "runtime" -Path "$Env:AppData\helix\runtime"
|
|
||||||
```
|
|
||||||
Note: "runtime" must be absolute path to the runtime directory.
|
|
||||||
|
|
||||||
**Cmd:**
|
|
||||||
|
|
||||||
```cmd
|
|
||||||
cd %appdata%\helix
|
|
||||||
mklink /D runtime "<helix-repo>\runtime"
|
|
||||||
```
|
|
||||||
|
|
||||||
The runtime location can be overridden via the `HELIX_RUNTIME` environment variable.
|
|
||||||
|
|
||||||
> NOTE: if `HELIX_RUNTIME` is set prior to calling `cargo install --locked --path helix-term`,
|
|
||||||
> tree-sitter grammars will be built in `$HELIX_RUNTIME/grammars`.
|
|
||||||
|
|
||||||
If you plan on keeping the repo locally, an alternative to copying/symlinking
|
|
||||||
runtime files is to set `HELIX_RUNTIME=/path/to/helix/runtime`
|
|
||||||
(`HELIX_RUNTIME=$PWD/runtime` if you're in the helix repo directory).
|
|
||||||
|
|
||||||
Packages already solve this for you by wrapping the `hx` binary with a wrapper
|
|
||||||
that sets the variable to the install dir.
|
|
||||||
|
|
||||||
> NOTE: running via cargo also doesn't require setting explicit `HELIX_RUNTIME` path, it will automatically
|
|
||||||
> detect the `runtime` directory in the project root.
|
|
||||||
|
|
||||||
If you want to customize your `languages.toml` config,
|
|
||||||
tree-sitter grammars may be manually fetched and built with `hx --grammar fetch` and `hx --grammar build`.
|
|
||||||
|
|
||||||
In order to use LSP features like auto-complete, you will need to
|
|
||||||
[install the appropriate Language Server](https://github.com/helix-editor/helix/wiki/How-to-install-the-default-language-servers)
|
|
||||||
for a language.
|
|
||||||
|
|
||||||
[![Packaging status](https://repology.org/badge/vertical-allrepos/helix.svg)](https://repology.org/project/helix/versions)
|
[![Packaging status](https://repology.org/badge/vertical-allrepos/helix.svg)](https://repology.org/project/helix/versions)
|
||||||
|
|
||||||
## Adding Helix to your desktop environment
|
|
||||||
|
|
||||||
If installing from source, to use Helix in desktop environments that supports [XDG desktop menu](https://specifications.freedesktop.org/menu-spec/menu-spec-latest.html), including Gnome and KDE, copy the provided `.desktop` file to the correct folder:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cp contrib/Helix.desktop ~/.local/share/applications
|
|
||||||
cp contrib/helix.png ~/.local/share/icons
|
|
||||||
```
|
|
||||||
|
|
||||||
To use another terminal than the default, you will need to modify the `.desktop` file. For example, to use `kitty`:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
sed -i "s|Exec=hx %F|Exec=kitty hx %F|g" ~/.local/share/applications/Helix.desktop
|
|
||||||
sed -i "s|Terminal=true|Terminal=false|g" ~/.local/share/applications/Helix.desktop
|
|
||||||
```
|
|
||||||
|
|
||||||
## macOS
|
|
||||||
|
|
||||||
Helix can be installed on macOS through homebrew:
|
|
||||||
|
|
||||||
```
|
|
||||||
brew install helix
|
|
||||||
```
|
|
||||||
|
|
||||||
# Contributing
|
# Contributing
|
||||||
|
|
||||||
Contributing guidelines can be found [here](./docs/CONTRIBUTING.md).
|
Contributing guidelines can be found [here](./docs/CONTRIBUTING.md).
|
||||||
|
@ -6,13 +6,13 @@ # Summary
|
|||||||
- [Usage](./usage.md)
|
- [Usage](./usage.md)
|
||||||
- [Keymap](./keymap.md)
|
- [Keymap](./keymap.md)
|
||||||
- [Commands](./commands.md)
|
- [Commands](./commands.md)
|
||||||
- [Language Support](./lang-support.md)
|
- [Language support](./lang-support.md)
|
||||||
- [Migrating from Vim](./from-vim.md)
|
- [Migrating from Vim](./from-vim.md)
|
||||||
- [Configuration](./configuration.md)
|
- [Configuration](./configuration.md)
|
||||||
- [Themes](./themes.md)
|
- [Themes](./themes.md)
|
||||||
- [Key Remapping](./remapping.md)
|
- [Key remapping](./remapping.md)
|
||||||
- [Languages](./languages.md)
|
- [Languages](./languages.md)
|
||||||
- [Guides](./guides/README.md)
|
- [Guides](./guides/README.md)
|
||||||
- [Adding Languages](./guides/adding_languages.md)
|
- [Adding languages](./guides/adding_languages.md)
|
||||||
- [Adding Textobject Queries](./guides/textobject.md)
|
- [Adding textobject queries](./guides/textobject.md)
|
||||||
- [Adding Indent Queries](./guides/indent.md)
|
- [Adding indent queries](./guides/indent.md)
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
# Commands
|
# Commands
|
||||||
|
|
||||||
Command mode can be activated by pressing `:`, similar to Vim. Built-in commands:
|
Command mode can be activated by pressing `:`. The built-in commands are:
|
||||||
|
|
||||||
{{#include ./generated/typable-cmd.md}}
|
{{#include ./generated/typable-cmd.md}}
|
||||||
|
@ -2,10 +2,10 @@ # Configuration
|
|||||||
|
|
||||||
To override global configuration parameters, create a `config.toml` file located in your config directory:
|
To override global configuration parameters, create a `config.toml` file located in your config directory:
|
||||||
|
|
||||||
* Linux and Mac: `~/.config/helix/config.toml`
|
- Linux and Mac: `~/.config/helix/config.toml`
|
||||||
* Windows: `%AppData%\helix\config.toml`
|
- Windows: `%AppData%\helix\config.toml`
|
||||||
|
|
||||||
> Hint: You can easily open the config file by typing `:config-open` within Helix normal mode.
|
> 💡 You can easily open the config file by typing `:config-open` within Helix normal mode.
|
||||||
|
|
||||||
Example config:
|
Example config:
|
||||||
|
|
||||||
@ -25,12 +25,10 @@ # Configuration
|
|||||||
hidden = false
|
hidden = false
|
||||||
```
|
```
|
||||||
|
|
||||||
You may also specify a file to use for configuration with the `-c` or
|
You can use a custom configuration file by specifying it with the `-c` or
|
||||||
`--config` CLI argument: `hx -c path/to/custom-config.toml`.
|
`--config` command line argument, for example `hx -c path/to/custom-config.toml`.
|
||||||
|
Additionally, you can reload the configuration file by sending the USR1
|
||||||
It is also possible to trigger configuration file reloading by sending the `USR1`
|
signal to the Helix process on Unix operating systems, such as by using the command `pkill -USR1 hx`.
|
||||||
signal to the helix process, e.g. via `pkill -USR1 hx`. This is only supported
|
|
||||||
on unix operating systems.
|
|
||||||
|
|
||||||
## Editor
|
## Editor
|
||||||
|
|
||||||
@ -38,23 +36,23 @@ ### `[editor]` Section
|
|||||||
|
|
||||||
| Key | Description | Default |
|
| Key | Description | Default |
|
||||||
|--|--|---------|
|
|--|--|---------|
|
||||||
| `scrolloff` | Number of lines of padding around the edge of the screen when scrolling. | `5` |
|
| `scrolloff` | Number of lines of padding around the edge of the screen when scrolling | `5` |
|
||||||
| `mouse` | Enable mouse mode. | `true` |
|
| `mouse` | Enable mouse mode | `true` |
|
||||||
| `middle-click-paste` | Middle click paste support. | `true` |
|
| `middle-click-paste` | Middle click paste support | `true` |
|
||||||
| `scroll-lines` | Number of lines to scroll per scroll wheel step. | `3` |
|
| `scroll-lines` | Number of lines to scroll per scroll wheel step | `3` |
|
||||||
| `shell` | Shell to use when running external commands. | Unix: `["sh", "-c"]`<br/>Windows: `["cmd", "/C"]` |
|
| `shell` | Shell to use when running external commands | Unix: `["sh", "-c"]`<br/>Windows: `["cmd", "/C"]` |
|
||||||
| `line-number` | Line number display: `absolute` simply shows each line's number, while `relative` shows the distance from the current line. When unfocused or in insert mode, `relative` will still show absolute line numbers. | `absolute` |
|
| `line-number` | Line number display: `absolute` simply shows each line's number, while `relative` shows the distance from the current line. When unfocused or in insert mode, `relative` will still show absolute line numbers | `absolute` |
|
||||||
| `cursorline` | Highlight all lines with a cursor. | `false` |
|
| `cursorline` | Highlight all lines with a cursor | `false` |
|
||||||
| `cursorcolumn` | Highlight all columns with a cursor. | `false` |
|
| `cursorcolumn` | Highlight all columns with a cursor | `false` |
|
||||||
| `gutters` | Gutters to display: Available are `diagnostics` and `diff` and `line-numbers` and `spacer`, note that `diagnostics` also includes other features like breakpoints, 1-width padding will be inserted if gutters is non-empty | `["diagnostics", "spacer", "line-numbers", "spacer", "diff"]` |
|
| `gutters` | Gutters to display: Available are `diagnostics` and `diff` and `line-numbers` and `spacer`, note that `diagnostics` also includes other features like breakpoints, 1-width padding will be inserted if gutters is non-empty | `["diagnostics", "spacer", "line-numbers", "spacer", "diff"]` |
|
||||||
| `auto-completion` | Enable automatic pop up of auto-completion. | `true` |
|
| `auto-completion` | Enable automatic pop up of auto-completion | `true` |
|
||||||
| `auto-format` | Enable automatic formatting on save. | `true` |
|
| `auto-format` | Enable automatic formatting on save | `true` |
|
||||||
| `auto-save` | Enable automatic saving on focus moving away from Helix. Requires [focus event support](https://github.com/helix-editor/helix/wiki/Terminal-Support) from your terminal. | `false` |
|
| `auto-save` | Enable automatic saving on the focus moving away from Helix. Requires [focus event support](https://github.com/helix-editor/helix/wiki/Terminal-Support) from your terminal | `false` |
|
||||||
| `idle-timeout` | Time in milliseconds since last keypress before idle timers trigger. Used for autocompletion, set to 0 for instant. | `400` |
|
| `idle-timeout` | Time in milliseconds since last keypress before idle timers trigger. Used for autocompletion, set to 0 for instant | `400` |
|
||||||
| `completion-trigger-len` | The min-length of word under cursor to trigger autocompletion | `2` |
|
| `completion-trigger-len` | The min-length of word under cursor to trigger autocompletion | `2` |
|
||||||
| `auto-info` | Whether to display infoboxes | `true` |
|
| `auto-info` | Whether to display info boxes | `true` |
|
||||||
| `true-color` | Set to `true` to override automatic detection of terminal truecolor support in the event of a false negative. | `false` |
|
| `true-color` | Set to `true` to override automatic detection of terminal truecolor support in the event of a false negative | `false` |
|
||||||
| `rulers` | List of column positions at which to display the rulers. Can be overridden by language specific `rulers` in `languages.toml` file. | `[]` |
|
| `rulers` | List of column positions at which to display the rulers. Can be overridden by language specific `rulers` in `languages.toml` file | `[]` |
|
||||||
| `bufferline` | Renders a line at the top of the editor displaying open buffers. Can be `always`, `never` or `multiple` (only shown if more than one buffer is in use) | `never` |
|
| `bufferline` | Renders a line at the top of the editor displaying open buffers. Can be `always`, `never` or `multiple` (only shown if more than one buffer is in use) | `never` |
|
||||||
| `color-modes` | Whether to color the mode indicator with different colors depending on the mode itself | `false` |
|
| `color-modes` | Whether to color the mode indicator with different colors depending on the mode itself | `false` |
|
||||||
|
|
||||||
@ -125,10 +123,12 @@ ### `[editor.lsp]` Section
|
|||||||
|
|
||||||
### `[editor.cursor-shape]` Section
|
### `[editor.cursor-shape]` Section
|
||||||
|
|
||||||
Defines the shape of cursor in each mode. Note that due to limitations
|
Defines the shape of cursor in each mode.
|
||||||
of the terminal environment, only the primary cursor can change shape.
|
|
||||||
Valid values for these options are `block`, `bar`, `underline`, or `hidden`.
|
Valid values for these options are `block`, `bar`, `underline`, or `hidden`.
|
||||||
|
|
||||||
|
> 💡 Due to limitations of the terminal environment, only the primary cursor can
|
||||||
|
> change shape.
|
||||||
|
|
||||||
| Key | Description | Default |
|
| Key | Description | Default |
|
||||||
| --- | ----------- | ------- |
|
| --- | ----------- | ------- |
|
||||||
| `normal` | Cursor shape in [normal mode][normal mode] | `block` |
|
| `normal` | Cursor shape in [normal mode][normal mode] | `block` |
|
||||||
@ -141,25 +141,22 @@ ### `[editor.cursor-shape]` Section
|
|||||||
|
|
||||||
### `[editor.file-picker]` Section
|
### `[editor.file-picker]` Section
|
||||||
|
|
||||||
Sets options for file picker and global search. All but the last key listed in
|
Set options for file picker and global search. Ignoring a file means it is
|
||||||
the default file-picker configuration below are IgnoreOptions: whether hidden
|
not visible in the Helix file picker and global search.
|
||||||
files and files listed within ignore files are ignored by (not visible in) the
|
|
||||||
helix file picker and global search. There is also one other key, `max-depth`
|
|
||||||
available, which is not defined by default.
|
|
||||||
|
|
||||||
All git related options are only enabled in a git repository.
|
All git related options are only enabled in a git repository.
|
||||||
|
|
||||||
| Key | Description | Default |
|
| Key | Description | Default |
|
||||||
|--|--|---------|
|
|--|--|---------|
|
||||||
|`hidden` | Enables ignoring hidden files. | true
|
|`hidden` | Enables ignoring hidden files | true
|
||||||
|`follow-links` | Follow symlinks instead of ignoring them | true
|
|`follow-links` | Follow symlinks instead of ignoring them | true
|
||||||
|`deduplicate-links` | Ignore symlinks that point at files already shown in the picker | true
|
|`deduplicate-links` | Ignore symlinks that point at files already shown in the picker | true
|
||||||
|`parents` | Enables reading ignore files from parent directories. | true
|
|`parents` | Enables reading ignore files from parent directories | true
|
||||||
|`ignore` | Enables reading `.ignore` files. | true
|
|`ignore` | Enables reading `.ignore` files | true
|
||||||
|`git-ignore` | Enables reading `.gitignore` files. | true
|
|`git-ignore` | Enables reading `.gitignore` files | true
|
||||||
|`git-global` | Enables reading global .gitignore, whose path is specified in git's config: `core.excludefile` option. | true
|
|`git-global` | Enables reading global `.gitignore`, whose path is specified in git's config: `core.excludefile` option | true
|
||||||
|`git-exclude` | Enables reading `.git/info/exclude` files. | true
|
|`git-exclude` | Enables reading `.git/info/exclude` files | true
|
||||||
|`max-depth` | Set with an integer value for maximum depth to recurse. | Defaults to `None`.
|
|`max-depth` | Set with an integer value for maximum depth to recurse | Defaults to `None`.
|
||||||
|
|
||||||
### `[editor.auto-pairs]` Section
|
### `[editor.auto-pairs]` Section
|
||||||
|
|
||||||
@ -211,7 +208,7 @@ ### `[editor.search]` Section
|
|||||||
|
|
||||||
| Key | Description | Default |
|
| Key | Description | Default |
|
||||||
|--|--|---------|
|
|--|--|---------|
|
||||||
| `smart-case` | Enable smart case regex searching (case insensitive unless pattern contains upper case characters) | `true` |
|
| `smart-case` | Enable smart case regex searching (case-insensitive unless pattern contains upper case characters) | `true` |
|
||||||
| `wrap-around`| Whether the search should wrap after depleting the matches | `true` |
|
| `wrap-around`| Whether the search should wrap after depleting the matches | `true` |
|
||||||
|
|
||||||
### `[editor.whitespace]` Section
|
### `[editor.whitespace]` Section
|
||||||
@ -220,7 +217,7 @@ ### `[editor.whitespace]` Section
|
|||||||
|
|
||||||
| Key | Description | Default |
|
| Key | Description | Default |
|
||||||
|-----|-------------|---------|
|
|-----|-------------|---------|
|
||||||
| `render` | Whether to render whitespace. May either be `"all"` or `"none"`, or a table with sub-keys `space`, `nbsp`, `tab`, and `newline`. | `"none"` |
|
| `render` | Whether to render whitespace. May either be `"all"` or `"none"`, or a table with sub-keys `space`, `nbsp`, `tab`, and `newline` | `"none"` |
|
||||||
| `characters` | Literal characters to use when rendering whitespace. Sub-keys may be any of `tab`, `space`, `nbsp`, `newline` or `tabpad` | See example below |
|
| `characters` | Literal characters to use when rendering whitespace. Sub-keys may be any of `tab`, `space`, `nbsp`, `newline` or `tabpad` | See example below |
|
||||||
|
|
||||||
Example
|
Example
|
||||||
@ -248,7 +245,7 @@ ### `[editor.indent-guides]` Section
|
|||||||
|
|
||||||
| Key | Description | Default |
|
| Key | Description | Default |
|
||||||
| --- | --- | --- |
|
| --- | --- | --- |
|
||||||
| `render` | Whether to render indent guides. | `false` |
|
| `render` | Whether to render indent guides | `false` |
|
||||||
| `character` | Literal character to use for rendering the indent guide | `│` |
|
| `character` | Literal character to use for rendering the indent guide | `│` |
|
||||||
| `skip-levels` | Number of indent levels to skip | `0` |
|
| `skip-levels` | Number of indent levels to skip | `0` |
|
||||||
|
|
||||||
@ -273,7 +270,7 @@ ### `[editor.gutters]` Section
|
|||||||
|
|
||||||
To customize the behavior of gutters, the `[editor.gutters]` section must
|
To customize the behavior of gutters, the `[editor.gutters]` section must
|
||||||
be used. This section contains top level settings, as well as settings for
|
be used. This section contains top level settings, as well as settings for
|
||||||
specific gutter components as sub-sections.
|
specific gutter components as subsections.
|
||||||
|
|
||||||
| Key | Description | Default |
|
| Key | Description | Default |
|
||||||
| --- | --- | --- |
|
| --- | --- | --- |
|
||||||
@ -315,13 +312,13 @@ #### `[editor.gutters.spacer]` Section
|
|||||||
|
|
||||||
### `[editor.soft-wrap]` Section
|
### `[editor.soft-wrap]` Section
|
||||||
|
|
||||||
Options for soft wrapping lines that exceed the view width
|
Options for soft wrapping lines that exceed the view width:
|
||||||
|
|
||||||
| Key | Description | Default |
|
| Key | Description | Default |
|
||||||
| --- | --- | --- |
|
| --- | --- | --- |
|
||||||
| `enable` | Whether soft wrapping is enabled. | `false` |
|
| `enable` | Whether soft wrapping is enabled | `false` |
|
||||||
| `max-wrap` | Maximum free space left at the end of the line. | `20` |
|
| `max-wrap` | Maximum free space left at the end of the line | `20` |
|
||||||
| `max-indent-retain` | Maximum indentation to carry over when soft wrapping a line. | `40` |
|
| `max-indent-retain` | Maximum indentation to carry over when soft wrapping a line | `40` |
|
||||||
| `wrap-indicator` | Text inserted before soft wrapped lines, highlighted with `ui.virtual.wrap` | `↪ ` |
|
| `wrap-indicator` | Text inserted before soft wrapped lines, highlighted with `ui.virtual.wrap` | `↪ ` |
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
# Guides
|
# Guides
|
||||||
|
|
||||||
This section contains guides for adding new language server configurations,
|
This section contains guides for adding new language server configurations,
|
||||||
tree-sitter grammars, textobject queries, etc.
|
tree-sitter grammars, textobject queries, and other similar items.
|
||||||
|
@ -1,45 +1,52 @@
|
|||||||
# Adding languages
|
# Adding new languages to Helix
|
||||||
|
|
||||||
|
In order to add a new language to Helix, you will need to follow the steps
|
||||||
|
below.
|
||||||
|
|
||||||
## Language configuration
|
## Language configuration
|
||||||
|
|
||||||
To add a new language, you need to add a `[[language]]` entry to the
|
1. Add a new `[[language]]` entry in the `languages.toml` file and provide the
|
||||||
`languages.toml` (see the [language configuration section]).
|
necessary configuration for the new language. For more information on
|
||||||
|
language configuration, refer to the
|
||||||
|
[language configuration section](../languages.md) of the documentation.
|
||||||
|
2. If you are adding a new language or updating an existing language server
|
||||||
|
configuration, run the command `cargo xtask docgen` to update the
|
||||||
|
[Language Support](../lang-support.md) documentation.
|
||||||
|
|
||||||
When adding a new language or Language Server configuration for an existing
|
> 💡 If you are adding a new Language Server configuration, make sure to update
|
||||||
language, run `cargo xtask docgen` to add the new configuration to the
|
> the
|
||||||
[Language Support][lang-support] docs before creating a pull request.
|
> [Language Server Wiki](https://github.com/helix-editor/helix/wiki/How-to-install-the-default-language-servers)
|
||||||
When adding a Language Server configuration, be sure to update the
|
> with the installation instructions.
|
||||||
[Language Server Wiki][install-lsp-wiki] with installation notes.
|
|
||||||
|
|
||||||
## Grammar configuration
|
## Grammar configuration
|
||||||
|
|
||||||
If a tree-sitter grammar is available for the language, add a new `[[grammar]]`
|
1. If a tree-sitter grammar is available for the new language, add a new
|
||||||
entry to `languages.toml`.
|
`[[grammar]]` entry to the `languages.toml` file.
|
||||||
|
2. If you are testing the grammar locally, you can use the `source.path` key
|
||||||
You may use the `source.path` key rather than `source.git` with an absolute path
|
with an absolute path to the grammar. However, before submitting a pull
|
||||||
to a locally available grammar for testing, but switch to `source.git` before
|
request, make sure to switch to using `source.git`.
|
||||||
submitting a pull request.
|
|
||||||
|
|
||||||
## Queries
|
## Queries
|
||||||
|
|
||||||
For a language to have syntax-highlighting and indentation among
|
1. In order to provide syntax highlighting and indentation for the new language,
|
||||||
other things, you have to add queries. Add a directory for your
|
you will need to add queries.
|
||||||
language with the path `runtime/queries/<name>/`. The tree-sitter
|
2. Create a new directory for the language with the path
|
||||||
[website](https://tree-sitter.github.io/tree-sitter/syntax-highlighting#queries)
|
`runtime/queries/<name>/`.
|
||||||
gives more info on how to write queries.
|
3. Refer to the
|
||||||
|
[tree-sitter website](https://tree-sitter.github.io/tree-sitter/syntax-highlighting#queries)
|
||||||
|
for more information on writing queries.
|
||||||
|
|
||||||
> NOTE: When evaluating queries, the first matching query takes
|
> 💡 In Helix, the first matching query takes precedence when evaluating
|
||||||
precedence, which is different from other editors like Neovim where
|
> queries, which is different from other editors such as Neovim where the last
|
||||||
the last matching query supersedes the ones before it. See
|
> matching query supersedes the ones before it. See
|
||||||
[this issue][neovim-query-precedence] for an example.
|
> [this issue](https://github.com/helix-editor/helix/pull/1170#issuecomment-997294090)
|
||||||
|
> for an example.
|
||||||
|
|
||||||
## Common Issues
|
## Common issues
|
||||||
|
|
||||||
- If you get errors when running after switching branches, you may have to update the tree-sitter grammars. Run `hx --grammar fetch` to fetch the grammars and `hx --grammar build` to build any out-of-date grammars.
|
- If you encounter errors when running Helix after switching branches, you may
|
||||||
|
need to update the tree-sitter grammars. Run the command `hx --grammar fetch`
|
||||||
- If a parser is segfaulting or you want to remove the parser, make sure to remove the compiled parser in `runtime/grammar/<name>.so`
|
to fetch the grammars and `hx --grammar build` to build any out-of-date
|
||||||
|
grammars.
|
||||||
[language configuration section]: ../languages.md
|
- If a parser is causing a segfault, or you want to remove it, make sure to
|
||||||
[neovim-query-precedence]: https://github.com/helix-editor/helix/pull/1170#issuecomment-997294090
|
remove the compiled parser located at `runtime/grammars/<name>.so`.
|
||||||
[install-lsp-wiki]: https://github.com/helix-editor/helix/wiki/How-to-install-the-default-language-servers
|
|
||||||
[lang-support]: ../lang-support.md
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
# Adding Indent Queries
|
# Adding indent queries
|
||||||
|
|
||||||
Helix uses tree-sitter to correctly indent new lines. This requires
|
Helix uses tree-sitter to correctly indent new lines. This requires
|
||||||
a tree-sitter grammar and an `indent.scm` query file placed in
|
a tree-sitter grammar and an `indent.scm` query file placed in
|
||||||
@ -36,7 +36,7 @@ ## Scopes
|
|||||||
(#set! "scope" "all"))
|
(#set! "scope" "all"))
|
||||||
```
|
```
|
||||||
|
|
||||||
## Capture Types
|
## Capture types
|
||||||
|
|
||||||
- `@indent` (default scope `tail`):
|
- `@indent` (default scope `tail`):
|
||||||
Increase the indent level by 1. Multiple occurrences in the same line
|
Increase the indent level by 1. Multiple occurrences in the same line
|
||||||
|
@ -1,14 +1,14 @@
|
|||||||
# Adding Textobject Queries
|
# Adding textobject queries
|
||||||
|
|
||||||
Textobjects that are language specific ([like functions, classes, etc][textobjects])
|
Helix supports textobjects that are language specific, such as functions, classes, etc.
|
||||||
require an accompanying tree-sitter grammar and a `textobjects.scm` query file
|
These textobjects require an accompanying tree-sitter grammar and a `textobjects.scm` query file
|
||||||
to work properly. Tree-sitter allows us to query the source code syntax tree
|
to work properly. Tree-sitter allows us to query the source code syntax tree
|
||||||
and capture specific parts of it. The queries are written in a lisp dialect.
|
and capture specific parts of it. The queries are written in a lisp dialect.
|
||||||
More information on how to write queries can be found in the [official tree-sitter
|
More information on how to write queries can be found in the [official tree-sitter
|
||||||
documentation][tree-sitter-queries].
|
documentation][tree-sitter-queries].
|
||||||
|
|
||||||
Query files should be placed in `runtime/queries/{language}/textobjects.scm`
|
Query files should be placed in `runtime/queries/{language}/textobjects.scm`
|
||||||
when contributing. Note that to test the query files locally you should put
|
when contributing to Helix. Note that to test the query files locally you should put
|
||||||
them under your local runtime directory (`~/.config/helix/runtime` on Linux
|
them under your local runtime directory (`~/.config/helix/runtime` on Linux
|
||||||
for example).
|
for example).
|
||||||
|
|
||||||
@ -28,9 +28,9 @@ # Adding Textobject Queries
|
|||||||
|
|
||||||
[Example query files][textobject-examples] can be found in the helix GitHub repository.
|
[Example query files][textobject-examples] can be found in the helix GitHub repository.
|
||||||
|
|
||||||
## Queries for Textobject Based Navigation
|
## Queries for textobject based navigation
|
||||||
|
|
||||||
[Tree-sitter based navigation][textobjects-nav] is done using captures in the
|
Tree-sitter based navigation in Helix is done using captures in the
|
||||||
following order:
|
following order:
|
||||||
|
|
||||||
- `object.movement`
|
- `object.movement`
|
||||||
@ -38,12 +38,10 @@ ## Queries for Textobject Based Navigation
|
|||||||
- `object.inside`
|
- `object.inside`
|
||||||
|
|
||||||
For example if a `function.around` capture has been already defined for a language
|
For example if a `function.around` capture has been already defined for a language
|
||||||
in it's `textobjects.scm` file, function navigation should also work automatically.
|
in its `textobjects.scm` file, function navigation should also work automatically.
|
||||||
`function.movement` should be defined only if the node captured by `function.around`
|
`function.movement` should be defined only if the node captured by `function.around`
|
||||||
doesn't make sense in a navigation context.
|
doesn't make sense in a navigation context.
|
||||||
|
|
||||||
[textobjects]: ../usage.md#textobjects
|
|
||||||
[textobjects-nav]: ../usage.md#tree-sitter-textobject-based-navigation
|
|
||||||
[tree-sitter-queries]: https://tree-sitter.github.io/tree-sitter/using-parsers#query-syntax
|
[tree-sitter-queries]: https://tree-sitter.github.io/tree-sitter/using-parsers#query-syntax
|
||||||
[tree-sitter-captures]: https://tree-sitter.github.io/tree-sitter/using-parsers#capturing-nodes
|
[tree-sitter-captures]: https://tree-sitter.github.io/tree-sitter/using-parsers#capturing-nodes
|
||||||
[textobject-examples]: https://github.com/search?q=repo%3Ahelix-editor%2Fhelix+filename%3Atextobjects.scm&type=Code&ref=advsearch&l=&l=
|
[textobject-examples]: https://github.com/search?q=repo%3Ahelix-editor%2Fhelix+filename%3Atextobjects.scm&type=Code&ref=advsearch&l=&l=
|
||||||
|
@ -1,180 +1,223 @@
|
|||||||
# Installation
|
# Installing Helix
|
||||||
|
|
||||||
We provide pre-built binaries on the [GitHub Releases page](https://github.com/helix-editor/helix/releases).
|
<!--toc:start-->
|
||||||
|
- [Pre-built binaries](#pre-built-binaries)
|
||||||
|
- [Linux, macOS, Windows and OpenBSD packaging status](#linux-macos-windows-and-openbsd-packaging-status)
|
||||||
|
- [Linux](#linux)
|
||||||
|
- [Ubuntu](#ubuntu)
|
||||||
|
- [Fedora/RHEL](#fedorarhel)
|
||||||
|
- [Arch Linux community](#arch-linux-community)
|
||||||
|
- [NixOS](#nixos)
|
||||||
|
- [macOS](#macos)
|
||||||
|
- [Homebrew Core](#homebrew-core)
|
||||||
|
- [Windows](#windows)
|
||||||
|
- [Scoop](#scoop)
|
||||||
|
- [Chocolatey](#chocolatey)
|
||||||
|
- [MSYS2](#msys2)
|
||||||
|
- [Building from source](#building-from-source)
|
||||||
|
- [Configuring Helix's runtime files](#configuring-helixs-runtime-files)
|
||||||
|
- [Validating the installation](#validating-the-installation)
|
||||||
|
- [Configure the desktop shortcut](#configure-the-desktop-shortcut)
|
||||||
|
<!--toc:end-->
|
||||||
|
|
||||||
|
To install Helix, follow the instructions specific to your operating system.
|
||||||
|
Note that:
|
||||||
|
|
||||||
|
- To get the latest nightly version of Helix, you need to
|
||||||
|
[build from source](#building-from-source).
|
||||||
|
|
||||||
|
- To take full advantage of Helix, install the language servers for your
|
||||||
|
preferred programming languages. See the
|
||||||
|
[wiki](https://github.com/helix-editor/helix/wiki/How-to-install-the-default-language-servers)
|
||||||
|
for instructions.
|
||||||
|
|
||||||
|
## Pre-built binaries
|
||||||
|
|
||||||
|
Download pre-built binaries from the
|
||||||
|
[GitHub Releases page](https://github.com/helix-editor/helix/releases). Add the binary to your system's `$PATH` to use it from the command
|
||||||
|
line.
|
||||||
|
|
||||||
|
## Linux, macOS, Windows and OpenBSD packaging status
|
||||||
|
|
||||||
|
Helix is available for Linux, macOS and Windows via the official repositories listed below.
|
||||||
|
|
||||||
[![Packaging status](https://repology.org/badge/vertical-allrepos/helix.svg)](https://repology.org/project/helix/versions)
|
[![Packaging status](https://repology.org/badge/vertical-allrepos/helix.svg)](https://repology.org/project/helix/versions)
|
||||||
|
|
||||||
## OSX
|
|
||||||
|
|
||||||
Helix is available in homebrew-core:
|
|
||||||
|
|
||||||
```
|
|
||||||
brew install helix
|
|
||||||
```
|
|
||||||
|
|
||||||
## Linux
|
## Linux
|
||||||
|
|
||||||
### NixOS
|
The following third party repositories are available:
|
||||||
|
|
||||||
A [flake](https://nixos.wiki/wiki/Flakes) containing the package is available in
|
### Ubuntu
|
||||||
the project root. The flake can also be used to spin up a reproducible development
|
|
||||||
shell for working on Helix with `nix develop`.
|
|
||||||
|
|
||||||
Flake outputs are cached for each push to master using
|
Helix is available via [Maveonair's PPA](https://launchpad.net/~maveonair/+archive/ubuntu/helix-editor):
|
||||||
[Cachix](https://www.cachix.org/). The flake is configured to
|
|
||||||
automatically make use of this cache assuming the user accepts
|
|
||||||
the new settings on first use.
|
|
||||||
|
|
||||||
If you are using a version of Nix without flakes enabled you can
|
|
||||||
[install Cachix cli](https://docs.cachix.org/installation); `cachix use helix` will
|
|
||||||
configure Nix to use cached outputs when possible.
|
|
||||||
|
|
||||||
### Arch Linux
|
|
||||||
|
|
||||||
Releases are available in the `community` repository.
|
|
||||||
|
|
||||||
A [helix-git](https://aur.archlinux.org/packages/helix-git/) package is also available on the AUR, which builds the master branch.
|
|
||||||
|
|
||||||
### Fedora Linux
|
|
||||||
|
|
||||||
You can install the COPR package for Helix via
|
|
||||||
|
|
||||||
|
```sh
|
||||||
|
sudo add-apt-repository ppa:maveonair/helix-editor
|
||||||
|
sudo apt update
|
||||||
|
sudo apt install helix
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Fedora/RHEL
|
||||||
|
|
||||||
|
Helix is available via `copr`:
|
||||||
|
|
||||||
|
```sh
|
||||||
sudo dnf copr enable varlad/helix
|
sudo dnf copr enable varlad/helix
|
||||||
sudo dnf install helix
|
sudo dnf install helix
|
||||||
```
|
```
|
||||||
|
|
||||||
### Void Linux
|
### Arch Linux community
|
||||||
|
|
||||||
|
Releases are available in the `community` repository:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
sudo pacman -S helix
|
||||||
```
|
```
|
||||||
sudo xbps-install helix
|
Additionally, a [helix-git](https://aur.archlinux.org/packages/helix-git/) package is available
|
||||||
|
in the AUR, which builds the master branch.
|
||||||
|
|
||||||
|
### NixOS
|
||||||
|
|
||||||
|
Helix is available as a [flake](https://nixos.wiki/wiki/Flakes) in the project
|
||||||
|
root. Use `nix develop` to spin up a reproducible development shell. Outputs are
|
||||||
|
cached for each push to master using [Cachix](https://www.cachix.org/). The
|
||||||
|
flake is configured to automatically make use of this cache assuming the user
|
||||||
|
accepts the new settings on first use.
|
||||||
|
|
||||||
|
If you are using a version of Nix without flakes enabled,
|
||||||
|
[install Cachix CLI](https://docs.cachix.org/installation) and use
|
||||||
|
`cachix use helix` to configure Nix to use cached outputs when possible.
|
||||||
|
|
||||||
|
## macOS
|
||||||
|
|
||||||
|
### Homebrew Core
|
||||||
|
|
||||||
|
```sh
|
||||||
|
brew install helix
|
||||||
```
|
```
|
||||||
|
|
||||||
## Windows
|
## Windows
|
||||||
|
|
||||||
Helix can be installed using [Scoop](https://scoop.sh/), [Chocolatey](https://chocolatey.org/)
|
Install on Windows using [Scoop](https://scoop.sh/), [Chocolatey](https://chocolatey.org/)
|
||||||
or [MSYS2](https://msys2.org/).
|
or [MSYS2](https://msys2.org/).
|
||||||
|
|
||||||
**Scoop:**
|
### Scoop
|
||||||
|
|
||||||
```
|
```sh
|
||||||
scoop install helix
|
scoop install helix
|
||||||
```
|
```
|
||||||
|
|
||||||
**Chocolatey:**
|
### Chocolatey
|
||||||
|
|
||||||
```
|
```sh
|
||||||
choco install helix
|
choco install helix
|
||||||
```
|
```
|
||||||
|
|
||||||
**MSYS2:**
|
### MSYS2
|
||||||
|
|
||||||
Choose the [proper command](https://www.msys2.org/docs/package-naming/) for your system from below:
|
For 64-bit Windows 8.1 or above:
|
||||||
|
|
||||||
- For 32 bit Windows 7 or above:
|
```sh
|
||||||
|
|
||||||
```
|
|
||||||
pacman -S mingw-w64-i686-helix
|
|
||||||
```
|
|
||||||
|
|
||||||
- For 64 bit Windows 7 or above:
|
|
||||||
|
|
||||||
```
|
|
||||||
pacman -S mingw-w64-x86_64-helix
|
|
||||||
```
|
|
||||||
|
|
||||||
- For 64 bit Windows 8.1 or above:
|
|
||||||
|
|
||||||
```
|
|
||||||
pacman -S mingw-w64-ucrt-x86_64-helix
|
pacman -S mingw-w64-ucrt-x86_64-helix
|
||||||
```
|
```
|
||||||
|
|
||||||
## Build from source
|
## Building from source
|
||||||
|
|
||||||
```
|
Clone the repository:
|
||||||
|
|
||||||
|
```sh
|
||||||
git clone https://github.com/helix-editor/helix
|
git clone https://github.com/helix-editor/helix
|
||||||
cd helix
|
cd helix
|
||||||
|
```
|
||||||
|
|
||||||
|
Compile from source:
|
||||||
|
|
||||||
|
```sh
|
||||||
cargo install --path helix-term --locked
|
cargo install --path helix-term --locked
|
||||||
```
|
```
|
||||||
|
|
||||||
This will install the `hx` binary to `$HOME/.cargo/bin` and build tree-sitter grammars in `./runtime/grammars`.
|
This command will create the `hx` executable and construct the tree-sitter
|
||||||
|
grammars either in the `runtime` folder, or in the folder specified in `HELIX_RUNTIME`
|
||||||
|
(as described below). To build the tree-sitter grammars requires a c++ compiler to be installed, for example `gcc-c++`.
|
||||||
|
|
||||||
If you are using the musl-libc instead of glibc the following environment variable must be set during the build
|
> 💡 If you are using the musl-libc instead of glibc the following environment variable must be set during the build
|
||||||
to ensure tree sitter grammars can be loaded correctly:
|
> to ensure tree-sitter grammars can be loaded correctly:
|
||||||
|
>
|
||||||
|
> ```sh
|
||||||
|
> RUSTFLAGS="-C target-feature=-crt-static"
|
||||||
|
> ```
|
||||||
|
|
||||||
```
|
> 💡 Tree-sitter grammars can be fetched and compiled if not pre-packaged. Fetch
|
||||||
RUSTFLAGS="-C target-feature=-crt-static"
|
> grammars with `hx --grammar fetch` (requires `git`) and compile them with
|
||||||
|
> `hx --grammar build` (requires a C++ compiler).
|
||||||
|
|
||||||
|
### Configuring Helix's runtime files
|
||||||
|
|
||||||
|
- **Linux and macOS**
|
||||||
|
|
||||||
|
Either set the `HELIX_RUNTIME` environment variable to point to the runtime files and add it to your `~/.bashrc` or equivalent:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
HELIX_RUNTIME=/home/user-name/src/helix/runtime
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Or, create a symlink in `~/.config/helix` that links to the source code directory:
|
||||||
|
|
||||||
Helix also needs its runtime files so make sure to copy/symlink the `runtime/` directory into the
|
```sh
|
||||||
config directory (for example `~/.config/helix/runtime` on Linux/macOS). This location can be overridden
|
ln -s $PWD/runtime ~/.config/helix/runtime
|
||||||
via the `HELIX_RUNTIME` environment variable.
|
|
||||||
|
|
||||||
| OS | Command |
|
|
||||||
| -------------------- | ------------------------------------------------ |
|
|
||||||
| Windows (Cmd) | `xcopy /e /i runtime %AppData%\helix\runtime` |
|
|
||||||
| Windows (PowerShell) | `xcopy /e /i runtime $Env:AppData\helix\runtime` |
|
|
||||||
| Linux / macOS | `ln -s $PWD/runtime ~/.config/helix/runtime` |
|
|
||||||
|
|
||||||
Starting with Windows Vista you can also create symbolic links on Windows. Note that this requires
|
|
||||||
elevated privileges - i.e. PowerShell or Cmd must be run as administrator.
|
|
||||||
|
|
||||||
**PowerShell:**
|
|
||||||
|
|
||||||
```powershell
|
|
||||||
New-Item -ItemType Junction -Target "runtime" -Path "$Env:AppData\helix\runtime"
|
|
||||||
```
|
|
||||||
Note: "runtime" must be the absolute path to the runtime directory.
|
|
||||||
|
|
||||||
**Cmd:**
|
|
||||||
|
|
||||||
```cmd
|
|
||||||
cd %appdata%\helix
|
|
||||||
mklink /D runtime "<helix-repo>\runtime"
|
|
||||||
```
|
```
|
||||||
|
|
||||||
The runtime location can be overridden via the `HELIX_RUNTIME` environment variable.
|
- **Windows**
|
||||||
|
|
||||||
> NOTE: if `HELIX_RUNTIME` is set prior to calling `cargo install --path helix-term --locked`,
|
Either set the `HELIX_RUNTIME` environment variable to point to the runtime files using the Windows setting (search for
|
||||||
> tree-sitter grammars will be built in `$HELIX_RUNTIME/grammars`.
|
`Edit environment variables for your account`) or use the `setx` command in
|
||||||
|
Cmd:
|
||||||
|
|
||||||
If you plan on keeping the repo locally, an alternative to copying/symlinking
|
```sh
|
||||||
runtime files is to set `HELIX_RUNTIME=/path/to/helix/runtime`
|
setx HELIX_RUNTIME "%userprofile%\source\repos\helix\runtime"
|
||||||
(`HELIX_RUNTIME=$PWD/runtime` if you're in the helix repo directory).
|
|
||||||
|
|
||||||
To use Helix in desktop environments that supports [XDG desktop menu](https://specifications.freedesktop.org/menu-spec/menu-spec-latest.html), including Gnome and KDE, copy the provided `.desktop` file to the correct folder:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cp contrib/Helix.desktop ~/.local/share/applications
|
|
||||||
```
|
```
|
||||||
|
|
||||||
To use another terminal than the default, you will need to modify the `.desktop` file. For example, to use `kitty`:
|
> 💡 `%userprofile%` resolves to your user directory like
|
||||||
|
> `C:\Users\Your-Name\` for example.
|
||||||
|
|
||||||
```bash
|
Or, create a symlink in `%appdata%\helix\` that links to the source code directory:
|
||||||
sed -i "s|Exec=hx %F|Exec=kitty hx %F|g" ~/.local/share/applications/Helix.desktop
|
|
||||||
sed -i "s|Terminal=true|Terminal=false|g" ~/.local/share/applications/Helix.desktop
|
|
||||||
```
|
|
||||||
|
|
||||||
Please note: there is no icon for Helix yet, so the system default will be used.
|
| Method | Command |
|
||||||
|
| ---------- | -------------------------------------------------------------------------------------- |
|
||||||
|
| PowerShell | `New-Item -ItemType Junction -Target "runtime" -Path "$Env:AppData\helix\runtime"` |
|
||||||
|
| Cmd | `cd %appdata%\helix` <br/> `mklink /D runtime "%userprofile%\src\helix\runtime"` |
|
||||||
|
|
||||||
## Finishing up the installation
|
> 💡 On Windows, creating a symbolic link may require running PowerShell or
|
||||||
|
> Cmd as an administrator.
|
||||||
|
|
||||||
To make sure everything is set up as expected you should finally run the helix healthcheck via
|
### Validating the installation
|
||||||
|
|
||||||
```
|
To make sure everything is set up as expected you should run the Helix health
|
||||||
|
check:
|
||||||
|
|
||||||
|
```sh
|
||||||
hx --health
|
hx --health
|
||||||
```
|
```
|
||||||
|
|
||||||
For more information on the information displayed in the health check results refer to [Healthcheck](https://github.com/helix-editor/helix/wiki/Healthcheck).
|
For more information on the health check results refer to
|
||||||
|
[Health check](https://github.com/helix-editor/helix/wiki/Healthcheck).
|
||||||
|
|
||||||
### Building tree-sitter grammars
|
### Configure the desktop shortcut
|
||||||
|
|
||||||
Tree-sitter grammars must be fetched and compiled if not pre-packaged.
|
If your desktop environment supports the
|
||||||
Fetch grammars with `hx --grammar fetch` (requires `git`) and compile them
|
[XDG desktop menu](https://specifications.freedesktop.org/menu-spec/menu-spec-latest.html)
|
||||||
with `hx --grammar build` (requires a C++ compiler).
|
you can configure Helix to show up in the application menu by copying the
|
||||||
|
provided `.desktop` and icon files to their correct folders:
|
||||||
|
|
||||||
### Installing language servers
|
```sh
|
||||||
|
cp contrib/Helix.desktop ~/.local/share/applications
|
||||||
|
cp contrib/helix.png ~/.icons # or ~/.local/share/icons
|
||||||
|
```
|
||||||
|
|
||||||
Language servers can optionally be installed if you want their features (auto-complete, diagnostics etc.).
|
To use another terminal than the system default, you can modify the `.desktop`
|
||||||
Follow the [instructions on the wiki page](https://github.com/helix-editor/helix/wiki/How-to-install-the-default-language-servers) to add your language servers of choice.
|
file. For example, to use `kitty`:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
sed -i "s|Exec=hx %F|Exec=kitty hx %F|g" ~/.local/share/applications/Helix.desktop
|
||||||
|
sed -i "s|Terminal=true|Terminal=false|g" ~/.local/share/applications/Helix.desktop
|
||||||
|
```
|
||||||
|
@ -14,14 +14,14 @@ # Keymap
|
|||||||
- [Space mode](#space-mode)
|
- [Space mode](#space-mode)
|
||||||
- [Popup](#popup)
|
- [Popup](#popup)
|
||||||
- [Unimpaired](#unimpaired)
|
- [Unimpaired](#unimpaired)
|
||||||
- [Insert Mode](#insert-mode)
|
- [Insert mode](#insert-mode)
|
||||||
- [Select / extend mode](#select--extend-mode)
|
- [Select / extend mode](#select-extend-mode)
|
||||||
- [Picker](#picker)
|
- [Picker](#picker)
|
||||||
- [Prompt](#prompt)
|
- [Prompt](#prompt)
|
||||||
|
|
||||||
> 💡 Mappings marked (**LSP**) require an active language server for the file.
|
> 💡 Mappings marked (**LSP**) require an active language server for the file.
|
||||||
|
|
||||||
> 💡 Mappings marked (**TS**) require a tree-sitter grammar for the filetype.
|
> 💡 Mappings marked (**TS**) require a tree-sitter grammar for the file type.
|
||||||
|
|
||||||
## Normal mode
|
## Normal mode
|
||||||
|
|
||||||
@ -109,7 +109,7 @@ ### Selection manipulation
|
|||||||
| Key | Description | Command |
|
| Key | Description | Command |
|
||||||
| ----- | ----------- | ------- |
|
| ----- | ----------- | ------- |
|
||||||
| `s` | Select all regex matches inside selections | `select_regex` |
|
| `s` | Select all regex matches inside selections | `select_regex` |
|
||||||
| `S` | Split selection into subselections on regex matches | `split_selection` |
|
| `S` | Split selection into sub selections on regex matches | `split_selection` |
|
||||||
| `Alt-s` | Split selection on newlines | `split_selection_on_newline` |
|
| `Alt-s` | Split selection on newlines | `split_selection_on_newline` |
|
||||||
| `Alt-_ ` | Merge consecutive selections | `merge_consecutive_selections` |
|
| `Alt-_ ` | Merge consecutive selections | `merge_consecutive_selections` |
|
||||||
| `&` | Align selection in columns | `align_selections` |
|
| `&` | Align selection in columns | `align_selections` |
|
||||||
@ -141,7 +141,7 @@ ### Selection manipulation
|
|||||||
|
|
||||||
### Search
|
### Search
|
||||||
|
|
||||||
Search commands all operate on the `/` register by default. Use `"<char>` to operate on a different one.
|
Search commands all operate on the `/` register by default. To use a different register, use `"<char>`.
|
||||||
|
|
||||||
| Key | Description | Command |
|
| Key | Description | Command |
|
||||||
| ----- | ----------- | ------- |
|
| ----- | ----------- | ------- |
|
||||||
@ -175,9 +175,8 @@ #### View mode
|
|||||||
|
|
||||||
View mode is intended for scrolling and manipulating the view without changing
|
View mode is intended for scrolling and manipulating the view without changing
|
||||||
the selection. The "sticky" variant of this mode (accessed by typing `Z` in
|
the selection. The "sticky" variant of this mode (accessed by typing `Z` in
|
||||||
normal mode) is persistent; use the Escape key to return to normal mode after
|
normal mode) is persistent and can be exited using the escape key. This is
|
||||||
usage (useful when you're simply looking over text and not actively editing
|
useful when you're simply looking over text and not actively editing it.
|
||||||
it).
|
|
||||||
|
|
||||||
|
|
||||||
| Key | Description | Command |
|
| Key | Description | Command |
|
||||||
@ -225,7 +224,7 @@ #### Match mode
|
|||||||
Accessed by typing `m` in [normal mode](#normal-mode).
|
Accessed by typing `m` in [normal mode](#normal-mode).
|
||||||
|
|
||||||
See the relevant section in [Usage](./usage.md) for an explanation about
|
See the relevant section in [Usage](./usage.md) for an explanation about
|
||||||
[surround](./usage.md#surround) and [textobject](./usage.md#textobjects) usage.
|
[surround](./usage.md#surround) and [textobject](./usage.md#navigating-using-tree-sitter-textobjects) usage.
|
||||||
|
|
||||||
| Key | Description | Command |
|
| Key | Description | Command |
|
||||||
| ----- | ----------- | ------- |
|
| ----- | ----------- | ------- |
|
||||||
@ -242,7 +241,7 @@ #### Window mode
|
|||||||
|
|
||||||
Accessed by typing `Ctrl-w` in [normal mode](#normal-mode).
|
Accessed by typing `Ctrl-w` in [normal mode](#normal-mode).
|
||||||
|
|
||||||
This layer is similar to Vim keybindings as Kakoune does not support window.
|
This layer is similar to Vim keybindings as Kakoune does not support windows.
|
||||||
|
|
||||||
| Key | Description | Command |
|
| Key | Description | Command |
|
||||||
| ----- | ------------- | ------- |
|
| ----- | ------------- | ------- |
|
||||||
@ -293,7 +292,7 @@ #### Space mode
|
|||||||
| `/` | Global search in workspace folder | `global_search` |
|
| `/` | Global search in workspace folder | `global_search` |
|
||||||
| `?` | Open command palette | `command_palette` |
|
| `?` | Open command palette | `command_palette` |
|
||||||
|
|
||||||
> TIP: Global search displays results in a fuzzy picker, use `Space + '` to bring it back up after opening a file.
|
> 💡 Global search displays results in a fuzzy picker, use `Space + '` to bring it back up after opening a file.
|
||||||
|
|
||||||
##### Popup
|
##### Popup
|
||||||
|
|
||||||
@ -306,7 +305,7 @@ ##### Popup
|
|||||||
|
|
||||||
#### Unimpaired
|
#### Unimpaired
|
||||||
|
|
||||||
Mappings in the style of [vim-unimpaired](https://github.com/tpope/vim-unimpaired).
|
These mappings are in the style of [vim-unimpaired](https://github.com/tpope/vim-unimpaired).
|
||||||
|
|
||||||
| Key | Description | Command |
|
| Key | Description | Command |
|
||||||
| ----- | ----------- | ------- |
|
| ----- | ----------- | ------- |
|
||||||
@ -335,12 +334,13 @@ #### Unimpaired
|
|||||||
|
|
||||||
## Insert mode
|
## Insert mode
|
||||||
|
|
||||||
Insert mode bindings are somewhat minimal by default. Helix is designed to
|
Insert mode bindings are minimal by default. Helix is designed to
|
||||||
be a modal editor, and this is reflected in the user experience and internal
|
be a modal editor, and this is reflected in the user experience and internal
|
||||||
mechanics. For example, changes to the text are only saved for undos when
|
mechanics. Changes to the text are only saved for undos when
|
||||||
escaping from insert mode to normal mode. For this reason, new users are
|
escaping from insert mode to normal mode.
|
||||||
strongly encouraged to learn the modal editing paradigm to get the smoothest
|
|
||||||
experience.
|
> 💡 New users are strongly encouraged to learn the modal editing paradigm
|
||||||
|
> to get the smoothest experience.
|
||||||
|
|
||||||
| Key | Description | Command |
|
| Key | Description | Command |
|
||||||
| ----- | ----------- | ------- |
|
| ----- | ----------- | ------- |
|
||||||
@ -370,8 +370,8 @@ ## Insert mode
|
|||||||
| `Home` | Move to line start | `goto_line_start` |
|
| `Home` | Move to line start | `goto_line_start` |
|
||||||
| `End` | Move to line end | `goto_line_end_newline` |
|
| `End` | Move to line end | `goto_line_end_newline` |
|
||||||
|
|
||||||
If you want to disable them in insert mode as you become more comfortable with modal editing, you can use
|
As you become more comfortable with modal editing, you may want to disable some
|
||||||
the following in your `config.toml`:
|
insert mode bindings. You can do this by editing your `config.toml` file.
|
||||||
|
|
||||||
```toml
|
```toml
|
||||||
[keys.insert]
|
[keys.insert]
|
||||||
@ -387,7 +387,7 @@ ## Insert mode
|
|||||||
|
|
||||||
## Select / extend mode
|
## Select / extend mode
|
||||||
|
|
||||||
This mode echoes Normal mode, but changes any movements to extend
|
Select mode echoes Normal mode, but changes any movements to extend
|
||||||
selections rather than replace them. Goto motions are also changed to
|
selections rather than replace them. Goto motions are also changed to
|
||||||
extend, so that `vgl` for example extends the selection to the end of
|
extend, so that `vgl` for example extends the selection to the end of
|
||||||
the line.
|
the line.
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
# Language Support
|
# Language Support
|
||||||
|
|
||||||
The following languages and Language Servers are supported. In order to use
|
The following languages and Language Servers are supported. To use
|
||||||
Language Server features, you must first [install][lsp-install-wiki] the
|
Language Server features, you must first [install][lsp-install-wiki] the
|
||||||
appropriate Language Server.
|
appropriate Language Server.
|
||||||
|
|
||||||
Check the language support in your installed helix version with `hx --health`.
|
You can check the language support in your installed helix version with `hx --health`.
|
||||||
|
|
||||||
Also see the [Language Configuration][lang-config] docs and the [Adding
|
Also see the [Language Configuration][lang-config] docs and the [Adding
|
||||||
Languages][adding-languages] guide for more language configuration information.
|
Languages][adding-languages] guide for more language configuration information.
|
||||||
|
@ -5,13 +5,15 @@ # Languages
|
|||||||
|
|
||||||
## `languages.toml` files
|
## `languages.toml` files
|
||||||
|
|
||||||
There are three possible `languages.toml` files. The first is compiled into
|
There are three possible locations for a `languages.toml` file:
|
||||||
Helix and lives in the [Helix repository](https://github.com/helix-editor/helix/blob/master/languages.toml).
|
|
||||||
This provides the default configurations for languages and language servers.
|
|
||||||
|
|
||||||
You may define a `languages.toml` in your [configuration directory](./configuration.md)
|
1. In the Helix source code, this lives in the
|
||||||
which overrides values from the built-in language configuration. For example
|
[Helix repository](https://github.com/helix-editor/helix/blob/master/languages.toml).
|
||||||
to disable auto-LSP-formatting in Rust:
|
It provides the default configurations for languages and language servers.
|
||||||
|
|
||||||
|
2. In your [configuration directory](./configuration.md). This overrides values
|
||||||
|
from the built-in language configuration. For example to disable
|
||||||
|
auto-LSP-formatting in Rust:
|
||||||
|
|
||||||
```toml
|
```toml
|
||||||
# in <config_dir>/helix/languages.toml
|
# in <config_dir>/helix/languages.toml
|
||||||
@ -21,10 +23,10 @@ # in <config_dir>/helix/languages.toml
|
|||||||
auto-format = false
|
auto-format = false
|
||||||
```
|
```
|
||||||
|
|
||||||
Language configuration may also be overridden local to a project by creating
|
3. In a `.helix` folder in your project. Language configuration may also be
|
||||||
a `languages.toml` file under a `.helix` directory. Its settings will be merged
|
overridden local to a project by creating a `languages.toml` file in a
|
||||||
with the language configuration in the configuration directory and the built-in
|
`.helix` folder. Its settings will be merged with the language configuration
|
||||||
configuration.
|
in the configuration directory and the built-in configuration.
|
||||||
|
|
||||||
## Language configuration
|
## Language configuration
|
||||||
|
|
||||||
@ -65,7 +67,7 @@ ## Language configuration
|
|||||||
|
|
||||||
### File-type detection and the `file-types` key
|
### File-type detection and the `file-types` key
|
||||||
|
|
||||||
Helix determines which language configuration to use with the `file-types` key
|
Helix determines which language configuration to use based on the `file-types` key
|
||||||
from the above section. `file-types` is a list of strings or tables, for
|
from the above section. `file-types` is a list of strings or tables, for
|
||||||
example:
|
example:
|
||||||
|
|
||||||
|
@ -1,18 +1,18 @@
|
|||||||
# Key Remapping
|
# Key remapping
|
||||||
|
|
||||||
One-way key remapping is temporarily supported via a simple TOML configuration
|
Helix currently supports one-way key remapping through a simple TOML configuration
|
||||||
file. (More powerful solutions such as rebinding via commands will be
|
file. (More powerful solutions such as rebinding via commands will be
|
||||||
available in the future).
|
available in the future).
|
||||||
|
|
||||||
To remap keys, write a `config.toml` file in your `helix` configuration
|
To remap keys, create a `config.toml` file in your `helix` configuration
|
||||||
directory (default `~/.config/helix` in Linux systems) with a structure like
|
directory (default `~/.config/helix` on Linux systems) with a structure like
|
||||||
this:
|
this:
|
||||||
|
|
||||||
```toml
|
```toml
|
||||||
# At most one section each of 'keys.normal', 'keys.insert' and 'keys.select'
|
# At most one section each of 'keys.normal', 'keys.insert' and 'keys.select'
|
||||||
[keys.normal]
|
[keys.normal]
|
||||||
C-s = ":w" # Maps the Ctrl-s to the typable command :w which is an alias for :write (save file)
|
C-s = ":w" # Maps Ctrl-s to the typable command :w which is an alias for :write (save file)
|
||||||
C-o = ":open ~/.config/helix/config.toml" # Maps the Ctrl-o to opening of the helix config file
|
C-o = ":open ~/.config/helix/config.toml" # Maps Ctrl-o to opening of the helix config file
|
||||||
a = "move_char_left" # Maps the 'a' key to the move_char_left command
|
a = "move_char_left" # Maps the 'a' key to the move_char_left command
|
||||||
w = "move_line_up" # Maps the 'w' key move_line_up
|
w = "move_line_up" # Maps the 'w' key move_line_up
|
||||||
"C-S-esc" = "extend_line" # Maps Ctrl-Shift-Escape to extend_line
|
"C-S-esc" = "extend_line" # Maps Ctrl-Shift-Escape to extend_line
|
||||||
@ -20,10 +20,9 @@ # At most one section each of 'keys.normal', 'keys.insert' and 'keys.select'
|
|||||||
"ret" = ["open_below", "normal_mode"] # Maps the enter key to open_below then re-enter normal mode
|
"ret" = ["open_below", "normal_mode"] # Maps the enter key to open_below then re-enter normal mode
|
||||||
|
|
||||||
[keys.insert]
|
[keys.insert]
|
||||||
"A-x" = "normal_mode" # Maps Alt-X to enter normal mode
|
"A-x" = "normal_mode" # Maps Alt-X to enter normal mode
|
||||||
j = { k = "normal_mode" } # Maps `jk` to exit insert mode
|
j = { k = "normal_mode" } # Maps `jk` to exit insert mode
|
||||||
```
|
```
|
||||||
> NOTE: Typable commands can also be remapped, remember to keep the `:` prefix to indicate it's a typable command.
|
|
||||||
|
|
||||||
## Minor modes
|
## Minor modes
|
||||||
|
|
||||||
@ -76,5 +75,5 @@ ## Special keys and modifiers
|
|||||||
|
|
||||||
Keys can be disabled by binding them to the `no_op` command.
|
Keys can be disabled by binding them to the `no_op` command.
|
||||||
|
|
||||||
Commands can be found at [Keymap](https://docs.helix-editor.com/keymap.html) Commands.
|
A list of commands is available in the [Keymap](https://docs.helix-editor.com/keymap.html) documentation
|
||||||
> Commands can also be found in the source code at [`helix-term/src/commands.rs`](https://github.com/helix-editor/helix/blob/master/helix-term/src/commands.rs) at the invocation of `static_commands!` macro and the `TypableCommandList`.
|
and in the source code at [`helix-term/src/commands.rs`](https://github.com/helix-editor/helix/blob/master/helix-term/src/commands.rs) at the invocation of `static_commands!` macro and the `TypableCommandList`.
|
||||||
|
@ -1,14 +1,15 @@
|
|||||||
# Themes
|
# Themes
|
||||||
|
|
||||||
To use a theme add `theme = "<name>"` to your [`config.toml`](./configuration.md) at the very top of the file before the first section or select it during runtime using `:theme <name>`.
|
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>`.
|
||||||
|
|
||||||
## Creating a theme
|
## Creating a theme
|
||||||
|
|
||||||
Create a file with the name of your theme as file name (i.e `mytheme.toml`) and place it in your `themes` directory (i.e `~/.config/helix/themes`). The directory might have to be created beforehand.
|
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.
|
||||||
|
|
||||||
The names "default" and "base16_default" are reserved for the builtin themes and cannot be overridden by user defined themes.
|
> 💡 The names "default" and "base16_default" are reserved for built-in themes
|
||||||
|
> and cannot be overridden by user-defined themes.
|
||||||
|
|
||||||
The default theme.toml can be found [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).
|
### Overview
|
||||||
|
|
||||||
Each line in the theme file is specified as below:
|
Each line in the theme file is specified as below:
|
||||||
|
|
||||||
@ -16,7 +17,7 @@ ## Creating a theme
|
|||||||
key = { fg = "#ffffff", bg = "#000000", underline = { color = "#ff0000", style = "curl"}, modifiers = ["bold", "italic"] }
|
key = { fg = "#ffffff", bg = "#000000", underline = { color = "#ff0000", style = "curl"}, modifiers = ["bold", "italic"] }
|
||||||
```
|
```
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
To specify only the foreground color:
|
To specify only the foreground color:
|
||||||
|
|
||||||
@ -24,15 +25,30 @@ ## Creating a theme
|
|||||||
key = "#ffffff"
|
key = "#ffffff"
|
||||||
```
|
```
|
||||||
|
|
||||||
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).
|
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).
|
||||||
|
|
||||||
```toml
|
```toml
|
||||||
"key.key" = "#ffffff"
|
"key.key" = "#ffffff"
|
||||||
```
|
```
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
### Color palettes
|
### Color palettes
|
||||||
|
|
||||||
It's recommended define a palette of named colors, and refer to them from the
|
It's recommended to define a palette of named colors, and refer to them in the
|
||||||
configuration values in your theme. To do this, add a table called
|
configuration values in your theme. To do this, add a table called
|
||||||
`palette` to your theme file:
|
`palette` to your theme file:
|
||||||
|
|
||||||
@ -45,8 +61,8 @@ ### Color palettes
|
|||||||
black = "#000000"
|
black = "#000000"
|
||||||
```
|
```
|
||||||
|
|
||||||
Remember that the `[palette]` table includes all keys after its header,
|
Keep in mind that the `[palette]` table includes all keys after its header,
|
||||||
so you should define the palette after normal theme options.
|
so it should be defined after the normal theme options.
|
||||||
|
|
||||||
The default palette uses the terminal's default 16 colors, and the colors names
|
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
|
are listed below. The `[palette]` section in the config file takes precedence
|
||||||
@ -73,9 +89,8 @@ ### Color palettes
|
|||||||
|
|
||||||
### Modifiers
|
### Modifiers
|
||||||
|
|
||||||
The following values may be used as modifiers.
|
The following values may be used as modifier, provided they are supported by
|
||||||
|
your terminal emulator.
|
||||||
Less common modifiers might not be supported by your terminal emulator.
|
|
||||||
|
|
||||||
| Modifier |
|
| Modifier |
|
||||||
| --- |
|
| --- |
|
||||||
@ -89,14 +104,13 @@ ### Modifiers
|
|||||||
| `hidden` |
|
| `hidden` |
|
||||||
| `crossed_out` |
|
| `crossed_out` |
|
||||||
|
|
||||||
> Note: The `underlined` modifier is deprecated and only available for backwards compatibility.
|
> 💡 The `underlined` modifier is deprecated and only available for backwards compatibility.
|
||||||
> Its behavior is equivalent to setting `underline.style="line"`.
|
> Its behavior is equivalent to setting `underline.style="line"`.
|
||||||
|
|
||||||
### Underline Style
|
### Underline style
|
||||||
|
|
||||||
One of the following values may be used as a value for `underline.style`.
|
One of the following values may be used as a value for `underline.style`, providing it is
|
||||||
|
supported by your terminal emulator.
|
||||||
Some styles might not be supported by your terminal emulator.
|
|
||||||
|
|
||||||
| Modifier |
|
| Modifier |
|
||||||
| --- |
|
| --- |
|
||||||
@ -109,7 +123,7 @@ ### Underline Style
|
|||||||
|
|
||||||
### Inheritance
|
### Inheritance
|
||||||
|
|
||||||
Extend upon other themes by setting the `inherits` property to an existing theme.
|
Extend other themes by setting the `inherits` property to an existing theme.
|
||||||
|
|
||||||
```toml
|
```toml
|
||||||
inherits = "boo_berry"
|
inherits = "boo_berry"
|
||||||
@ -124,19 +138,19 @@ # Override colors in the palette:
|
|||||||
|
|
||||||
### Scopes
|
### Scopes
|
||||||
|
|
||||||
The following is a list of scopes available to use for styling.
|
The following is a list of scopes available to use for styling:
|
||||||
|
|
||||||
#### Syntax highlighting
|
#### Syntax highlighting
|
||||||
|
|
||||||
These keys match [tree-sitter scopes](https://tree-sitter.github.io/tree-sitter/syntax-highlighting#theme).
|
These keys match [tree-sitter scopes](https://tree-sitter.github.io/tree-sitter/syntax-highlighting#theme).
|
||||||
|
|
||||||
For a given highlight produced, styling will be determined based on the longest matching theme key. For example, the highlight `function.builtin.static` would match the key `function.builtin` rather than `function`.
|
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`.
|
||||||
|
|
||||||
We use a similar set of scopes as
|
We use a similar set of scopes as
|
||||||
[SublimeText](https://www.sublimetext.com/docs/scope_naming.html). See also
|
[Sublime Text](https://www.sublimetext.com/docs/scope_naming.html). See also
|
||||||
[TextMate](https://macromates.com/manual/en/language_grammars) scopes.
|
[TextMate](https://macromates.com/manual/en/language_grammars) scopes.
|
||||||
|
|
||||||
- `attribute` - Class attributes, html tag attributes
|
- `attribute` - Class attributes, HTML tag attributes
|
||||||
|
|
||||||
- `type` - Types
|
- `type` - Types
|
||||||
- `builtin` - Primitive types provided by the language (`int`, `usize`)
|
- `builtin` - Primitive types provided by the language (`int`, `usize`)
|
||||||
@ -144,7 +158,7 @@ #### Syntax highlighting
|
|||||||
- `variant`
|
- `variant`
|
||||||
- `constructor`
|
- `constructor`
|
||||||
|
|
||||||
- `constant` (TODO: constant.other.placeholder for %v)
|
- `constant` (TODO: constant.other.placeholder for `%v`)
|
||||||
- `builtin` Special constants provided by the language (`true`, `false`, `nil` etc)
|
- `builtin` Special constants provided by the language (`true`, `false`, `nil` etc)
|
||||||
- `boolean`
|
- `boolean`
|
||||||
- `character`
|
- `character`
|
||||||
@ -162,11 +176,11 @@ #### Syntax highlighting
|
|||||||
|
|
||||||
- `comment` - Code comments
|
- `comment` - Code comments
|
||||||
- `line` - Single line comments (`//`)
|
- `line` - Single line comments (`//`)
|
||||||
- `block` - Block comments (e.g. (`/* */`)
|
- `block` - Block comments (e.g. (`/* */`)
|
||||||
- `documentation` - Documentation comments (e.g. `///` in Rust)
|
- `documentation` - Documentation comments (e.g. `///` in Rust)
|
||||||
|
|
||||||
- `variable` - Variables
|
- `variable` - Variables
|
||||||
- `builtin` - Reserved language variables (`self`, `this`, `super`, etc)
|
- `builtin` - Reserved language variables (`self`, `this`, `super`, etc.)
|
||||||
- `parameter` - Function parameters
|
- `parameter` - Function parameters
|
||||||
- `other`
|
- `other`
|
||||||
- `member` - Fields of composite data types (e.g. structs, unions)
|
- `member` - Fields of composite data types (e.g. structs, unions)
|
||||||
@ -186,10 +200,10 @@ #### Syntax highlighting
|
|||||||
- `return`
|
- `return`
|
||||||
- `exception`
|
- `exception`
|
||||||
- `operator` - `or`, `in`
|
- `operator` - `or`, `in`
|
||||||
- `directive` - Preprocessor directives (`#if` in C)
|
- `directive` - Preprocessor directives (`#if` in C)
|
||||||
- `function` - `fn`, `func`
|
- `function` - `fn`, `func`
|
||||||
- `storage` - Keywords describing how things are stored
|
- `storage` - Keywords describing how things are stored
|
||||||
- `type` - The type of something, `class`, `function`, `var`, `let`, etc.
|
- `type` - The type of something, `class`, `function`, `var`, `let`, etc.
|
||||||
- `modifier` - Storage modifiers like `static`, `mut`, `const`, `ref`, etc.
|
- `modifier` - Storage modifiers like `static`, `mut`, `const`, `ref`, etc.
|
||||||
|
|
||||||
- `operator` - `||`, `+=`, `>`
|
- `operator` - `||`, `+=`, `>`
|
||||||
@ -216,9 +230,9 @@ #### Syntax highlighting
|
|||||||
- `bold`
|
- `bold`
|
||||||
- `italic`
|
- `italic`
|
||||||
- `link`
|
- `link`
|
||||||
- `url` - urls pointed to by links
|
- `url` - URLs pointed to by links
|
||||||
- `label` - non-url link references
|
- `label` - non-URL link references
|
||||||
- `text` - url and image descriptions in links
|
- `text` - URL and image descriptions in links
|
||||||
- `quote`
|
- `quote`
|
||||||
- `raw`
|
- `raw`
|
||||||
- `inline`
|
- `inline`
|
||||||
@ -232,19 +246,19 @@ #### Syntax highlighting
|
|||||||
|
|
||||||
#### Interface
|
#### Interface
|
||||||
|
|
||||||
These scopes are used for theming the editor interface.
|
These scopes are used for theming the editor interface:
|
||||||
|
|
||||||
- `markup`
|
- `markup`
|
||||||
- `normal`
|
- `normal`
|
||||||
- `completion` - for completion doc popup ui
|
- `completion` - for completion doc popup UI
|
||||||
- `hover` - for hover popup ui
|
- `hover` - for hover popup UI
|
||||||
- `heading`
|
- `heading`
|
||||||
- `completion` - for completion doc popup ui
|
- `completion` - for completion doc popup UI
|
||||||
- `hover` - for hover popup ui
|
- `hover` - for hover popup UI
|
||||||
- `raw`
|
- `raw`
|
||||||
- `inline`
|
- `inline`
|
||||||
- `completion` - for completion doc popup ui
|
- `completion` - for completion doc popup UI
|
||||||
- `hover` - for hover popup ui
|
- `hover` - for hover popup UI
|
||||||
|
|
||||||
|
|
||||||
| Key | Notes |
|
| Key | Notes |
|
||||||
@ -270,9 +284,9 @@ #### Interface
|
|||||||
| `ui.statusline.insert` | Statusline mode during insert 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.select` | Statusline mode during select mode ([only if `editor.color-modes` is enabled][editor-section]) |
|
||||||
| `ui.statusline.separator` | Separator character in statusline |
|
| `ui.statusline.separator` | Separator character in statusline |
|
||||||
| `ui.popup` | Documentation popups (e.g Space + k) |
|
| `ui.popup` | Documentation popups (e.g. Space + k) |
|
||||||
| `ui.popup.info` | Prompt for multiple key options |
|
| `ui.popup.info` | Prompt for multiple key options |
|
||||||
| `ui.window` | Border lines separating splits |
|
| `ui.window` | Borderlines separating splits |
|
||||||
| `ui.help` | Description box for commands |
|
| `ui.help` | Description box for commands |
|
||||||
| `ui.text` | Command prompts, popup text, etc. |
|
| `ui.text` | Command prompts, popup text, etc. |
|
||||||
| `ui.text.focus` | |
|
| `ui.text.focus` | |
|
||||||
@ -301,10 +315,4 @@ #### Interface
|
|||||||
| `diagnostic.warning` | Diagnostics warning (editing area) |
|
| `diagnostic.warning` | Diagnostics warning (editing area) |
|
||||||
| `diagnostic.error` | Diagnostics error (editing area) |
|
| `diagnostic.error` | Diagnostics error (editing area) |
|
||||||
|
|
||||||
You can check compliance to spec with
|
|
||||||
|
|
||||||
```shell
|
|
||||||
cargo xtask themelint onedark # replace onedark with <name>
|
|
||||||
```
|
|
||||||
|
|
||||||
[editor-section]: ./configuration.md#editor-section
|
[editor-section]: ./configuration.md#editor-section
|
||||||
|
@ -1,22 +1,43 @@
|
|||||||
# Usage
|
# Using Helix
|
||||||
|
|
||||||
(Currently not fully documented, see the [keymappings](./keymap.md) list for more.)
|
<!--toc:start-->
|
||||||
|
- [Registers](#registers)
|
||||||
|
- [User-defined registers](#user-defined-registers)
|
||||||
|
- [Special registers](#special-registers)
|
||||||
|
- [Surround](#surround)
|
||||||
|
- [Selecting and manipulating text with textobjects](#selecting-and-manipulating-text-with-textobjects)
|
||||||
|
- [Navigating using tree-sitter textobjects](#navigating-using-tree-sitter-textobjects)
|
||||||
|
- [Moving the selection with syntax-aware motions](#moving-the-selection-with-syntax-aware-motions)
|
||||||
|
<!--toc:end-->
|
||||||
|
|
||||||
See [tutor](https://github.com/helix-editor/helix/blob/master/runtime/tutor) (accessible via `hx --tutor` or `:tutor`) for a vimtutor-like introduction.
|
For a full interactive introduction to Helix, refer to the
|
||||||
|
[tutor](https://github.com/helix-editor/helix/blob/master/runtime/tutor) which
|
||||||
|
can be accessed via the command `hx --tutor` or `:tutor`.
|
||||||
|
|
||||||
|
> 💡 Currently, not all functionality is fully documented, please refer to the
|
||||||
|
> [key mappings](./keymap.md) list.
|
||||||
|
|
||||||
## Registers
|
## Registers
|
||||||
|
|
||||||
Vim-like registers can be used to yank and store text to be pasted later. Usage is similar, with `"` being used to select a register:
|
In Helix, registers are storage locations for text and other data, such as the
|
||||||
|
result of a search. Registers can be used to cut, copy, and paste text, similar
|
||||||
|
to the clipboard in other text editors. Usage is similar to Vim, with `"` being
|
||||||
|
used to select a register.
|
||||||
|
|
||||||
|
### User-defined registers
|
||||||
|
|
||||||
|
Helix allows you to create your own named registers for storing text, for
|
||||||
|
example:
|
||||||
|
|
||||||
- `"ay` - Yank the current selection to register `a`.
|
- `"ay` - Yank the current selection to register `a`.
|
||||||
- `"op` - Paste the text in register `o` after the selection.
|
- `"op` - Paste the text in register `o` after the selection.
|
||||||
|
|
||||||
If there is a selected register before invoking a change or delete command, the selection will be stored in the register and the action will be carried out:
|
If a register is selected before invoking a change or delete command, the selection will be stored in the register and the action will be carried out:
|
||||||
|
|
||||||
- `"hc` - Store the selection in register `h` and then change it (delete and enter insert mode).
|
- `"hc` - Store the selection in register `h` and then change it (delete and enter insert mode).
|
||||||
- `"md` - Store the selection in register `m` and delete it.
|
- `"md` - Store the selection in register `m` and delete it.
|
||||||
|
|
||||||
### Special Registers
|
### Special registers
|
||||||
|
|
||||||
| Register character | Contains |
|
| Register character | Contains |
|
||||||
| --- | --- |
|
| --- | --- |
|
||||||
@ -25,41 +46,90 @@ ### Special Registers
|
|||||||
| `"` | Last yanked text |
|
| `"` | Last yanked text |
|
||||||
| `_` | Black hole |
|
| `_` | Black hole |
|
||||||
|
|
||||||
> There is no special register for copying to system clipboard, instead special commands and keybindings are provided. See the [keymap](keymap.md#space-mode) for the specifics.
|
The system clipboard is not directly supported by a special register. Instead, special commands and keybindings are provided. Refer to the
|
||||||
> The black hole register works as a no-op register, meaning no data will be written to / read from it.
|
[key map](keymap.md#space-mode) for more details.
|
||||||
|
|
||||||
|
The black hole register is a no-op register, meaning that no data will be read or written to it.
|
||||||
|
|
||||||
## Surround
|
## Surround
|
||||||
|
|
||||||
Functionality similar to [vim-surround](https://github.com/tpope/vim-surround) is built into
|
Helix includes built-in functionality similar to [vim-surround](https://github.com/tpope/vim-surround).
|
||||||
helix. The keymappings have been inspired from [vim-sandwich](https://github.com/machakann/vim-sandwich):
|
The keymappings have been inspired from [vim-sandwich](https://github.com/machakann/vim-sandwich):
|
||||||
|
|
||||||
![surround demo](https://user-images.githubusercontent.com/23398472/122865801-97073180-d344-11eb-8142-8f43809982c6.gif)
|
![Surround demo](https://user-images.githubusercontent.com/23398472/122865801-97073180-d344-11eb-8142-8f43809982c6.gif)
|
||||||
|
|
||||||
- `ms` - Add surround characters
|
| Key Sequence | Action |
|
||||||
- `mr` - Replace surround characters
|
| --------------------------------- | --------------------------------------- |
|
||||||
- `md` - Delete surround characters
|
| `ms<char>` (after selecting text) | Add surround characters to selection |
|
||||||
|
| `mr<char_to_replace><new_char>` | Replace the closest surround characters |
|
||||||
|
| `md<char_to_delete>` | Delete the closest surround characters |
|
||||||
|
|
||||||
`ms` acts on a selection, so select the text first and use `ms<char>`. `mr` and `md` work
|
You can use counts to act on outer pairs.
|
||||||
on the closest pairs found and selections are not required; use counts to act in outer pairs.
|
|
||||||
|
|
||||||
It can also act on multiple selections (yay!). For example, to change every occurrence of `(use)` to `[use]`:
|
Surround can also act on multiple selections. For example, to change every occurrence of `(use)` to `[use]`:
|
||||||
|
|
||||||
- `%` to select the whole file
|
1. `%` to select the whole file
|
||||||
- `s` to split the selections on a search term
|
2. `s` to split the selections on a search term
|
||||||
- Input `use` and hit Enter
|
3. Input `use` and hit Enter
|
||||||
- `mr([` to replace the parens with square brackets
|
4. `mr([` to replace the parentheses with square brackets
|
||||||
|
|
||||||
Multiple characters are currently not supported, but planned.
|
Multiple characters are currently not supported, but planned for future release.
|
||||||
|
|
||||||
## Syntax-tree Motions
|
## Selecting and manipulating text with textobjects
|
||||||
|
|
||||||
`Alt-p`, `Alt-o`, `Alt-i`, and `Alt-n` (or `Alt` and arrow keys) move the primary
|
In Helix, textobjects are a way to select, manipulate and operate on a piece of
|
||||||
selection according to the selection's place in the syntax tree. Let's walk
|
text in a structured way. They allow you to refer to blocks of text based on
|
||||||
through an example to get familiar with them. Many languages have a syntax like
|
their structure or purpose, such as a word, sentence, paragraph, or even a
|
||||||
so for function calls:
|
function or block of code.
|
||||||
|
|
||||||
```
|
![Textobject demo](https://user-images.githubusercontent.com/23398472/124231131-81a4bb00-db2d-11eb-9d10-8e577ca7b177.gif)
|
||||||
func(arg1, arg2, arg3)
|
![Textobject tree-sitter demo](https://user-images.githubusercontent.com/23398472/132537398-2a2e0a54-582b-44ab-a77f-eb818942203d.gif)
|
||||||
|
|
||||||
|
- `ma` - Select around the object (`va` in Vim, `<alt-a>` in Kakoune)
|
||||||
|
- `mi` - Select inside the object (`vi` in Vim, `<alt-i>` in Kakoune)
|
||||||
|
|
||||||
|
| Key after `mi` or `ma` | Textobject selected |
|
||||||
|
| --- | --- |
|
||||||
|
| `w` | Word |
|
||||||
|
| `W` | WORD |
|
||||||
|
| `p` | Paragraph |
|
||||||
|
| `(`, `[`, `'`, etc. | Specified surround pairs |
|
||||||
|
| `m` | The closest surround pair |
|
||||||
|
| `f` | Function |
|
||||||
|
| `c` | Class |
|
||||||
|
| `a` | Argument/parameter |
|
||||||
|
| `o` | Comment |
|
||||||
|
| `t` | Test |
|
||||||
|
| `g` | Change |
|
||||||
|
|
||||||
|
> 💡 `f`, `c`, etc. need a tree-sitter grammar active for the current
|
||||||
|
document and a special tree-sitter query file to work properly. [Only
|
||||||
|
some grammars][lang-support] currently have the query file implemented.
|
||||||
|
Contributions are welcome!
|
||||||
|
|
||||||
|
## Navigating using tree-sitter textobjects
|
||||||
|
|
||||||
|
Navigating between functions, classes, parameters, and other elements is
|
||||||
|
possible using tree-sitter and textobject queries. For
|
||||||
|
example to move to the next function use `]f`, to move to previous
|
||||||
|
class use `[c`, and so on.
|
||||||
|
|
||||||
|
![Tree-sitter-nav-demo][tree-sitter-nav-demo]
|
||||||
|
|
||||||
|
For the full reference see the [unimpaired][unimpaired-keybinds] section of the key bind
|
||||||
|
documentation.
|
||||||
|
|
||||||
|
> 💡 This feature relies on tree-sitter textobjects
|
||||||
|
> and requires the corresponding query file to work properly.
|
||||||
|
|
||||||
|
## Moving the selection with syntax-aware motions
|
||||||
|
|
||||||
|
`Alt-p`, `Alt-o`, `Alt-i`, and `Alt-n` (or `Alt` and arrow keys) allow you to move the
|
||||||
|
selection according to its location in the syntax tree. For example, many languages have the
|
||||||
|
following syntax for function calls:
|
||||||
|
|
||||||
|
```js
|
||||||
|
func(arg1, arg2, arg3);
|
||||||
```
|
```
|
||||||
|
|
||||||
A function call might be parsed by tree-sitter into a tree like the following.
|
A function call might be parsed by tree-sitter into a tree like the following.
|
||||||
@ -93,77 +163,29 @@ ## Syntax-tree Motions
|
|||||||
└──────────┘ └──────────┘ └──────────┘
|
└──────────┘ └──────────┘ └──────────┘
|
||||||
```
|
```
|
||||||
|
|
||||||
Say we have a selection that wraps `arg1`. The selection is on the `arg1` leaf
|
If you have a selection that wraps `arg1` (see the tree above), and you use
|
||||||
in the tree above.
|
`Alt-n`, it will select the next sibling in the syntax tree: `arg2`.
|
||||||
|
|
||||||
```
|
```js
|
||||||
|
// before
|
||||||
func([arg1], arg2, arg3)
|
func([arg1], arg2, arg3)
|
||||||
|
// after
|
||||||
|
func(arg1, [arg2], arg3);
|
||||||
```
|
```
|
||||||
|
|
||||||
Using `Alt-n` would select the next sibling in the syntax tree: `arg2`.
|
Similarly, `Alt-o` will expand the selection to the parent node, in this case, the
|
||||||
|
arguments node.
|
||||||
|
|
||||||
```
|
```js
|
||||||
func(arg1, [arg2], arg3)
|
func[(arg1, arg2, arg3)];
|
||||||
```
|
|
||||||
|
|
||||||
While `Alt-o` would expand the selection to the parent node. In the tree above we
|
|
||||||
can see that we would select the `arguments` node.
|
|
||||||
|
|
||||||
```
|
|
||||||
func[(arg1, arg2, arg3)]
|
|
||||||
```
|
```
|
||||||
|
|
||||||
There is also some nuanced behavior that prevents you from getting stuck on a
|
There is also some nuanced behavior that prevents you from getting stuck on a
|
||||||
node with no sibling. If we have a selection on `arg1`, `Alt-p` would bring us
|
node with no sibling. When using `Alt-p` with a selection on `arg1`, the previous
|
||||||
to the previous child node. Since `arg1` doesn't have a sibling to its left,
|
child node will be selected. In the event that `arg1` does not have a previous
|
||||||
though, we climb the syntax tree and then take the previous selection. So
|
sibling, the selection will move up the syntax tree and select the previous
|
||||||
`Alt-p` will move the selection over to the "func" `identifier`.
|
element. As a result, using `Alt-p` with a selection on `arg1` will move the
|
||||||
|
selection to the "func" `identifier`.
|
||||||
```
|
|
||||||
[func](arg1, arg2, arg3)
|
|
||||||
```
|
|
||||||
|
|
||||||
## Textobjects
|
|
||||||
|
|
||||||
![textobject-demo](https://user-images.githubusercontent.com/23398472/124231131-81a4bb00-db2d-11eb-9d10-8e577ca7b177.gif)
|
|
||||||
![textobject-treesitter-demo](https://user-images.githubusercontent.com/23398472/132537398-2a2e0a54-582b-44ab-a77f-eb818942203d.gif)
|
|
||||||
|
|
||||||
- `ma` - Select around the object (`va` in Vim, `<alt-a>` in Kakoune)
|
|
||||||
- `mi` - Select inside the object (`vi` in Vim, `<alt-i>` in Kakoune)
|
|
||||||
|
|
||||||
| Key after `mi` or `ma` | Textobject selected |
|
|
||||||
| --- | --- |
|
|
||||||
| `w` | Word |
|
|
||||||
| `W` | WORD |
|
|
||||||
| `p` | Paragraph |
|
|
||||||
| `(`, `[`, `'`, etc | Specified surround pairs |
|
|
||||||
| `m` | Closest surround pair |
|
|
||||||
| `f` | Function |
|
|
||||||
| `c` | Class |
|
|
||||||
| `a` | Argument/parameter |
|
|
||||||
| `o` | Comment |
|
|
||||||
| `t` | Test |
|
|
||||||
| `g` | Change |
|
|
||||||
|
|
||||||
> NOTE: `f`, `c`, etc need a tree-sitter grammar active for the current
|
|
||||||
document and a special tree-sitter query file to work properly. [Only
|
|
||||||
some grammars][lang-support] currently have the query file implemented.
|
|
||||||
Contributions are welcome!
|
|
||||||
|
|
||||||
## Tree-sitter Textobject Based Navigation
|
|
||||||
|
|
||||||
Navigating between functions, classes, parameters, etc is made
|
|
||||||
possible by leveraging tree-sitter and textobjects queries. For
|
|
||||||
example to move to the next function use `]f`, to move to previous
|
|
||||||
class use `[c`, and so on.
|
|
||||||
|
|
||||||
![tree-sitter-nav-demo][tree-sitter-nav-demo]
|
|
||||||
|
|
||||||
See the [unimpaired][unimpaired-keybinds] section of the keybind
|
|
||||||
documentation for the full reference.
|
|
||||||
|
|
||||||
> NOTE: This feature is dependent on tree-sitter based textobjects
|
|
||||||
and therefore requires the corresponding query file to work properly.
|
|
||||||
|
|
||||||
[lang-support]: ./lang-support.md
|
[lang-support]: ./lang-support.md
|
||||||
[unimpaired-keybinds]: ./keymap.md#unimpaired
|
[unimpaired-keybinds]: ./keymap.md#unimpaired
|
||||||
|
Loading…
Reference in New Issue
Block a user