This uses the new TreeCursor type from the parent commit to reimplement
the tree-sitter motions (`A-p/o/i/n`). Other tree-sitter related
features like textobjects are not touched with this change and will
need a different, unrelated approach to solve.
This uses the layer parentage information from the parent commit to
traverse the layers. It's a similar API to `tree_sitter:TreeCursor`
but internally it does not use a `tree_sitter::TreeCursor` currently
because that interface is behaving very unexpectedly. Using the
`next_sibling`/`prev_sibling`/`parent` API on `tree_sitter::Node`
reflects the previous code's behavior so this should result in no
surprising changes.
This commit adds a `parent` field to the `LanguageLayer`. This
information is conveniently already available when we parse injections.
This will be used in the child commit to create a type that can
traverse injection layers using this information.
This adds parameter highlighting for reference parameters and defaulted
parameters. For example:
```cpp
auto strip_prefix_only(std::string& s,
Hidden_Homonym skip_hidden_homonym = {}) const
-> Affixing_Result<Prefix>;
```
Previously both parameters were only highlighted as variables.
A few changes:
* 0-arity type specs like the following previously would not have the
expected 'variable.parameter' highlighting for the return type:
-spec foo() -> Value when Value :: term().
* Highlight module, type and function docs as documentation comments
and inject markdown into them.
* Replace `#match?` predicates with `#any-of?` where possible.
* Remove custom auto-pairs. Now that Erlang uses markdown for
documentation, the asciidoc-style backtick-singlequote pair is no
longer useful.
* WIP
* WIP
* WIP
* Update runtime/tutor
Co-authored-by: David Else <12832280+David-Else@users.noreply.github.com>
* WIP
* WIP
* WIP
* Fix typos
* Fix typos
* Minor updates
* Update runtime/tutor
Co-authored-by: Michael Davis <mcarsondavis@gmail.com>
* Update runtime/tutor
Co-authored-by: Michael Davis <mcarsondavis@gmail.com>
* Update runtime/tutor
Co-authored-by: Michael Davis <mcarsondavis@gmail.com>
* Update runtime/tutor
Co-authored-by: Michael Davis <mcarsondavis@gmail.com>
* Update runtime/tutor
Co-authored-by: Michael Davis <mcarsondavis@gmail.com>
* Update runtime/tutor
Co-authored-by: Michael Davis <mcarsondavis@gmail.com>
* Remove mention of arrows in split tutorial
* Do not mention starting in normal mode
* Fix right drift of titles
* Update runtime/tutor
Co-authored-by: David Else <12832280+David-Else@users.noreply.github.com>
* Update runtime/tutor
Co-authored-by: David Else <12832280+David-Else@users.noreply.github.com>
* Update runtime/tutor
Co-authored-by: David Else <12832280+David-Else@users.noreply.github.com>
* Update runtime/tutor
Co-authored-by: David Else <12832280+David-Else@users.noreply.github.com>
* Update runtime/tutor
Co-authored-by: David Else <12832280+David-Else@users.noreply.github.com>
* Update runtime/tutor
Co-authored-by: David Else <12832280+David-Else@users.noreply.github.com>
* Update runtime/tutor
Co-authored-by: David Else <12832280+David-Else@users.noreply.github.com>
* Update runtime/tutor
Co-authored-by: David Else <12832280+David-Else@users.noreply.github.com>
* Update runtime/tutor
Co-authored-by: David Else <12832280+David-Else@users.noreply.github.com>
* Update runtime/tutor
Co-authored-by: David Else <12832280+David-Else@users.noreply.github.com>
* Update runtime/tutor
Co-authored-by: David Else <12832280+David-Else@users.noreply.github.com>
* Reflow paragraphs
* Update runtime/tutor
Co-authored-by: Michael Davis <mcarsondavis@gmail.com>
* Update runtime/tutor
Co-authored-by: Michael Davis <mcarsondavis@gmail.com>
* Update runtime/tutor
Co-authored-by: Michael Davis <mcarsondavis@gmail.com>
* Update runtime/tutor
Co-authored-by: Michael Davis <mcarsondavis@gmail.com>
* Update runtime/tutor
Co-authored-by: Michael Davis <mcarsondavis@gmail.com>
* Update runtime/tutor
Co-authored-by: Michael Davis <mcarsondavis@gmail.com>
* Update runtime/tutor
Co-authored-by: Michael Davis <mcarsondavis@gmail.com>
---------
Co-authored-by: David Else <12832280+David-Else@users.noreply.github.com>
Co-authored-by: Michael Davis <mcarsondavis@gmail.com>
The refactor in bcf7b263 introduced a possible subtraction with overflow
when the statusline is layed out so that the left or right sides are
larger than the padding it would take to align the center area to the
middle.
When the left or right areas are too large, we can evenly space the
elements rather than trying to align the center area to the middle.
This prevents possible underflows and makes sense visually - it's
still easy to tell the areas apart at a glance.
* feat: add support for ember .hbs (glimmer) templates
* adjust highlights to helix
* highlight this correctly in block statements
* correctly highlight attributes
* correctly highlight hash_pair
* add newline to highlights.scm
* refactor: use #any-of and #eq instead of #match
* chore: add newline to languages.toml
The `shell_impl` and `shell_impl_async` functions no longer return
`success` because it was always `true`. If the command didn't succeed
both functions would return an `Err`.
This was also the reason, why `shell_keep_pipe` didn't work. It relied
upon the value of `success` and aborted in case of an `Err`.
It now removes any selection for which `shell_impl` returns `Err`.
If the command always fails, the selections are preserved and an error
message is displayed in the status bar.
* Adding initial support for ada language, based off #7790 PR from tomekw
* More translation to helix-specific tree-sitter scm labels, add ada gpr switch to ada LSP
* Generate ada in lang-support.md using cargo xtask docgen
* Update tree-sitter definitions according to comments
* Remove .gpr glob from languages.toml
* Fix unit in languages.toml for ada, update locals.scm to helix needs
In the `reload-all` command, we should not stop reloading the documents
if one error is found. Instead, we should report the error and continue
trying to reload the current open documents. This is useful in cases
where a backing file does not exist temporarily (e.g. when editing a git
patch in the outstanding chain that doesn't have a file just yet).
This change also remove the error messages in the cases where the
backing is `None`, like in new docs or `tutor`.
I have just found out that my recent Windows Terminal version
supported rendering undercurl (see
https://devblogs.microsoft.com/commandline/windows-terminal-preview-1-20-release
). However, looking at the source, terminfo is required for helix to
emit the undercurl control code, which isn't available on Windows AFAIK.
This commit make helix respects the `editor.undercurl` option when
there is no terminfo.
Tested on Windows Terminal Preview 1.20
Signed-off-by: Khang Nguyen <khang.nguyenduycse@hcmut.edu.vn>
Before the fix, the color that the original (Neovim) tokyonight uses for
Neovim's visual mode was used in Helix for highlighting the selected
item in the picker. But for the highlighting of selected _text_ in
Helix (corresponding to Neovim's visual mode), a much darker background
was used. This made it very hard to pick out selected text, in
particular in suboptimal lighting conditions.
I swapped the two colors, so that text selection now looks like in
Neovim, while selected items in the picker are highlighted a bit less
strongly. (But still easy to see because the whole line is highlighted.)
* Extend groovy support
Use more complete parser introduced in nvm-treesitter in
d4dac523d2
* Update runtime/queries/groovy/locals.scm
Co-authored-by: Michael Davis <mcarsondavis@gmail.com>
* Drop indent.scm for groovy
It was copied from the tree-sitter repository but is not
compatiblw with the way indent queries are implemented
in Helix.
* Adapt groovy highlights to helix syntax
* Update documentation
---------
Co-authored-by: Michael Davis <mcarsondavis@gmail.com>
* feat: add 'file-abs-path' to statusline (#4434)
* cleanup implementation
* rename to be non-abbreviated names
---------
Co-authored-by: Michael Davis <mcarsondavis@gmail.com>
* Added `jsonc` language with support for comments
The `vscode-json-language-server` accepts `jsonc` as a language id.
Allowing the use of comments within JSON files.
* fix: Update `injdection-rejex` to be unique
* fix: use includes to remove redundant queries
* ci: Generate language-support docs
* implement another selection modifying command
* Selection feels more ergonomic in case of swapping the direction. This also fixes a problem when starting at an empty line.
* rename select_line_up/down to select_line_above/below
* apply clippy suggestion of using cmp instead of if-chain
* revert `Extent` implementing `Clone/Copy`
* move select_line functions below extend_line implementations
* implement help add function, which saturates at the number of text lines
---------
Co-authored-by: Emi <emanuel.boehm@gmail.com>
* fix: close#9771 update OCaml
* fix: no longer match on ( ) as the underlying grammar handles these
* fix: implement excellent corrections from review
* fix: module -> namespace to match theme scopes
Test Document
-------------
```
a)b
```
Steps to Reproduce
------------------
1. % # select_all
1. ms( # surround_add
1. mam # select_textobject_around
Debug and Release
-----------------
`thread 'main' panicked at 'Attempt to index past end of RopeSlice:
char index 7, RopeSlice char length 6', ropey-1.6.1/src/slice.rs:796:13`
Description
-----------
An index was selected beyond the end of the slice with chars_at. The fix
adds a guard check to `find_nth_open_pair`, like in the other find_nth*
functions.
Test Document
-------------
```
{{
}
}
```
Steps To Reproduce
------------------
1. 2j # move_visual_line_down
1. C # copy_selection_on_next_line
1. mdm # surround_delete
Debug
-----
`assertion failed: last <= from', transaction.rs:597:13`
Release
-------
`called `Result::unwrap()` on an `Err` value: Char range out of bounds:
char range 18446744073709551614..18446744073709551615,
Rope/RopeSlice char length 7', ropey-1.6.1/src/rope.rs:546:37`
Description
-----------
Processing the surrounding pairs in order violates the assertion the
ranges are ordered. To handle nested surrounds all positions have to
be sorted. Also surround_replace has to track the proper replacement
character for each position.
Current `file-types` only supports up to a `Dockerfile.frontend` naming scheme.
With these changes `frontend.Dockerfile` now gives proper highlights and lsp actions.
1. Create a document containing `{A}`
1. C-w v # vsplit
1. gl # goto_line_end
1. b # move_prev_word_start
1. ` # switch_to_lowercase
1. mrm( # surround replace
1. C-w v # vsplit
In the debug build surround_replace/delete will immedately assert with
`assertion failed: last <= from', transaction.rs:597:13`. The splits and
lowercase conversion are not needed to trigger the bug.
In the release build the surround becomes `)a(` and the last vsplit
causes the transaction to panic.
`internal error: entered unreachable code:
(Some(Retain(18446744073709551573)))', transaction.rs:185:46`
Since the selection direction is backwards get_surround_pos returns the
pairs reversed but the downstream code assumes they are in the forward
direction.
Joining lines with Alt-J does not properly select the inserted spaces
when the selection contains blank lines. In the worst case it panics
with an out of bounds index.
thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value:
Char index out of bounds: char index 11, Rope/RopeSlice char length 10'
Steps to reproduce:
* Create a new document
```
a
b
c
d
e
```
* % (Select all)
* Alt-J (join and select the spaces)
* Fix bug 9703 by commenting out the wrong command
This fixes issue https://github.com/helix-editor/helix/issues/9703 by removing the wrong formatting command for justfiles.
* Fix indentation width for justfile
* update languages.toml: tree-sitter-lua grammar
repo has moved, use new URL and the rev of the latest release (v0.0.19)
* update highlight queries
a novice attempt to port query updates from the
source repo to Helix captures and ordering
* Apply suggestions from code review
Co-authored-by: Michael Davis <mcarsondavis@gmail.com>
---------
Co-authored-by: Michael Davis <mcarsondavis@gmail.com>
URIs need to be normalized to be comparable. For example a language
server could send a URI for a path containing '+' as '%2B' but we might
encode this in something like 'Document::url' as just '+'. We can
normalize the URI straight into a PathBuf though since this is the only
value we compare these diagnostics URIs against. This also covers
edge-cases like windows drive letter capitalization.
@ -68,6 +68,7 @@ Its settings will be merged with the configuration directory `config.toml` and t
| `insert-final-newline` | Whether to automatically insert a trailing line-ending on write if missing | `true` |
| `popup-border` | Draw border around `popup`, `menu`, `all`, or `none` | `none` |
| `indent-heuristic` | How the indentation for a newly inserted line is computed: `simple` just copies the indentation level from the previous line, `tree-sitter` computes the indentation based on the syntax tree and `hybrid` combines both approaches. If the chosen heuristic is not available, a different one will be used as a fallback (the fallback order being `hybrid` -> `tree-sitter` -> `simple`). | `hybrid`
| `jump-label-alphabet` | The characters that are used to generate two character jump labels. Characters at the start of the alphabet are used first. | "abcdefghijklmnopqrstuvwxyz"
### `[editor.statusline]` Section
@ -108,6 +109,7 @@ The following statusline elements can be configured:
| `mode` | The current editor mode (`mode.normal`/`mode.insert`/`mode.select`) |
| `spinner` | A progress spinner indicating LSP activity |
| `file-name` | The path/name of the opened file |
| `file-absolute-path` | The absolute path/name of the opened file |
| `file-base-name` | The basename of the opened file |
| `file-modification-indicator` | The indicator to show whether the file is modified (a `[+]` appears when there are unsaved changes) |
| `file-encoding` | The encoding of the opened file if it differs from UTF-8 |
@ -375,8 +377,25 @@ wrap-indicator = "" # set wrap-indicator to "" to hide it
### `[editor.smart-tab]` Section
Options for navigating and editing using tab key.
| Key | Description | Default |
|------------|-------------|---------|
| `enable` | If set to true, then when the cursor is in a position with non-whitespace to its left, instead of inserting a tab, it will run `move_parent_node_end`. If there is only whitespace to the left, then it inserts a tab as normal. With the default bindings, to explicitly insert a tab character, press Shift-tab. | `true` |
| `supersede-menu` | Normally, when a menu is on screen, such as when auto complete is triggered, the tab key is bound to cycling through the items. This means when menus are on screen, one cannot use the tab key to trigger the `smart-tab` command. If this option is set to true, the `smart-tab` command always takes precedence, which means one cannot use the tab key to cycle through menu items. One of the other bindings must be used instead, such as arrow keys or `C-n`/`C-p`. | `false` |
Due to lack of support for S-tab in some terminals, the default keybindings don't fully embrace smart-tab editing experience. If you enjoy smart-tab navigation and a terminal that supports the [Enhanced Keyboard protocol](https://github.com/helix-editor/helix/wiki/Terminal-Support#enhanced-keyboard-protocol), consider setting extra keybindings:
@ -61,7 +61,8 @@ These configuration keys are available:
| `roots` | A set of marker files to look for when trying to find the workspace root. For example `Cargo.lock`, `yarn.lock` |
| `auto-format` | Whether to autoformat this language when saving |
| `diagnostic-severity` | Minimal severity of diagnostic for it to be displayed. (Allowed values: `Error`, `Warning`, `Info`, `Hint`) |
| `comment-token` | The token to use as a comment-token |
| `comment-tokens` | The tokens to use as a comment token, either a single token `"//"` or an array `["//", "///", "//!"]` (the first token will be used for commenting). Also configurable as `comment-token` for backwards compatibility|
| `block-comment-tokens`| The start and end tokens for a multiline comment either an array or single table of `{ start = "/*", end = "*/"}`. The first set of tokens will be used for commenting, any pairs in the array can be uncommented |
| `indent` | The indent to use. Has sub keys `unit` (the text inserted into the document when indenting; usually set to N spaces or `"\t"` for tabs) and `tab-width` (the number of spaces rendered for a tab) |
| `language-servers` | The Language Servers used for this language. See below for more information in the section [Configuring Language Servers for a language](#configuring-language-servers-for-a-language) |
| `grammar` | The tree-sitter grammar to use (defaults to the value of `name`) |