Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support different kinds of underline rendering (updated) #4061

Merged
merged 14 commits into from
Oct 19, 2022

Conversation

pascalkuthe
Copy link
Member

@pascalkuthe pascalkuthe commented Oct 1, 2022

Supersedes #3015 (and closes #2809).

I have rebased the original PR on master and addressed the issues raised in the original PR.
The reasons for the disappearing undercurls/underlines was that the orignal PR
treated them as modifiers. However, underlines styles behave more like colors than modifiers:
There are multiple different underline styles that are incompatible, overwrite each other and
are removed with a single escape sequence.
Modifiers on the other hand can be added and removed independent of other modifiers.

Tracking underline styles in the modifier set can not work correctly.
The fix suggested by @archseer of only emitting NoUnderline if there is no
underline left in to does not work for nested highlights.
Consider the following example of 3 nested highlights (underline used by syntax highlight, underdotted used by diagnostic, undercurl used by cursor):

The input highlight ranges look like this (which correspond to the modifier sets)

  ~
 ...
______
foobar

The expected output looks like this:

foobar
_.~.__

The corresponding escape sequences look like this:

[_]f[.]o[~]o[.]b[_]ar[nounderline]

From the modifier set it is not possible to build these escape sequences.
Because the modifier set only contains which modifiers are present but not
the order in which they were added removed (so after the foo it's impossible
to determine which underline should be shown).

This example might seem contrived, but I noticed this almost immediately in real world use.
To fix the problems in the original PR I renamed the underline style attribute to underline_color
and added the underline_style attribute for underline styles.
Now underline styles are tracked through the same mechanisms that fg/bg/underline-color are tracked
and therefore cases with nested highlights are handled correctly.

To esnure backwards compatibility of themes the underlined modifier will keep working and is equivalent to underline-style="line"

Edit: This updated PR also improves upon the original PR by using a much more robust terminfo parsing library (called termini written by me), because cxterminfo was barely tested and caused crashes. Furthermore a workaround for an issue in crossterm was implemented that caused visual artifacts in terminal emulators that do not support underline colors.

sudormrfbin and others added 6 commits October 1, 2022 17:00
Adds four new  modifiers that can be used in themes:

- undercurled
- underdashed
- underdotted
- double-underline
Add underline field to doctests, and fix bugs
The cxterminfo crate has been used over popular alternatives
like `term` since it supports querying for extended capabilities
and also for it's small codebase size (which will make it easy
to inline it into helix in the future if required).
Underline styles are mutally exclusive and overwrite each other.
Therefore implementing as an modifier lead to incorrect behaviour
when the underline style is overwritten.

For backwards compatability the "underline" modified is retained (but
deprecated). Instead the "underline_style" and "underline_color"
optios should be used to style underlines.
@kirawi kirawi added A-theme Area: Theme and appearence related A-gui Area: Helix gui improvements S-waiting-on-review Status: Awaiting review from a maintainer. labels Oct 1, 2022
@Omnikar
Copy link
Contributor

Omnikar commented Oct 2, 2022

cxterminfo is panicking for me, on MacOS, iTerm2 v3.4.16

thread 'main' panicked at 'attempt to add with overflow', /Users/redacted/.cargo/registry/src/github.aaakk.us.kg-1ecc6299db9ec823/cxterminfo-0.2.0/src/terminfo.rs:319:27

@pascalkuthe
Copy link
Member Author

pascalkuthe commented Oct 2, 2022

That's good to know. I personally don't own a Mac. Could you provide a back trace and the panic message so I can try to debug this?

@Omnikar
Copy link
Contributor

Omnikar commented Oct 2, 2022

Here's the output with RUST_BACKTRACE=1

Panic output
thread 'main' panicked at 'attempt to add with overflow', /Users/redacted/.cargo/registry/src/github.aaakk.us.kg-1ecc6299db9ec823/cxterminfo-0.2.0/src/terminfo.rs:319:27
stack backtrace:
   0: rust_begin_unwind
             at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/panicking.rs:584:5
   1: core::panicking::panic_fmt
             at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/core/src/panicking.rs:142:14
   2: core::panicking::panic
             at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/core/src/panicking.rs:48:5
   3: cxterminfo::terminfo::TermInfo::from_data
             at /Users/redacted/.cargo/registry/src/github.aaakk.us.kg-1ecc6299db9ec823/cxterminfo-0.2.0/src/terminfo.rs:319:27
   4: cxterminfo::terminfo::TermInfo::from_file
             at /Users/redacted/.cargo/registry/src/github.aaakk.us.kg-1ecc6299db9ec823/cxterminfo-0.2.0/src/terminfo.rs:240:9
   5: cxterminfo::terminfo::TermInfo::from_name
             at /Users/redacted/.cargo/registry/src/github.aaakk.us.kg-1ecc6299db9ec823/cxterminfo-0.2.0/src/terminfo.rs:231:24
   6: cxterminfo::terminfo::TermInfo::from_env
             at /Users/redacted/.cargo/registry/src/github.aaakk.us.kg-1ecc6299db9ec823/cxterminfo-0.2.0/src/terminfo.rs:192:13
   7: helix_tui::backend::crossterm::Capabilities::from_env_or_default
             at ./helix-tui/src/backend/crossterm.rs:30:15
   8: helix_tui::backend::crossterm::CrosstermBackend<W>::new
             at ./helix-tui/src/backend/crossterm.rs:55:27
   9: helix_term::compositor::Compositor::new
             at ./helix-term/src/compositor.rs:93:23
  10: helix_term::application::Application::new
             at ./helix-term/src/application.rs:142:30
  11: hx::main_impl::{{closure}}
             at ./helix-term/src/main.rs:143:19
  12: <core::future::from_generator::GenFuture<T> as core::future::future::Future>::poll
             at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/core/src/future/mod.rs:91:19
  13: tokio::park::thread::CachedParkThread::block_on::{{closure}}
             at /Users/redacted/.cargo/registry/src/github.aaakk.us.kg-1ecc6299db9ec823/tokio-1.21.1/src/park/thread.rs:267:54
  14: tokio::coop::with_budget::{{closure}}
             at /Users/redacted/.cargo/registry/src/github.aaakk.us.kg-1ecc6299db9ec823/tokio-1.21.1/src/coop.rs:102:9
  15: std::thread::local::LocalKey<T>::try_with
             at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/thread/local.rs:445:16
  16: std::thread::local::LocalKey<T>::with
             at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/thread/local.rs:421:9
  17: tokio::coop::with_budget
             at /Users/redacted/.cargo/registry/src/github.aaakk.us.kg-1ecc6299db9ec823/tokio-1.21.1/src/coop.rs:95:5
  18: tokio::coop::budget
             at /Users/redacted/.cargo/registry/src/github.aaakk.us.kg-1ecc6299db9ec823/tokio-1.21.1/src/coop.rs:72:5
  19: tokio::park::thread::CachedParkThread::block_on
             at /Users/redacted/.cargo/registry/src/github.aaakk.us.kg-1ecc6299db9ec823/tokio-1.21.1/src/park/thread.rs:267:31
  20: tokio::runtime::enter::Enter::block_on
             at /Users/redacted/.cargo/registry/src/github.aaakk.us.kg-1ecc6299db9ec823/tokio-1.21.1/src/runtime/enter.rs:152:13
  21: tokio::runtime::scheduler::multi_thread::MultiThread::block_on
             at /Users/redacted/.cargo/registry/src/github.aaakk.us.kg-1ecc6299db9ec823/tokio-1.21.1/src/runtime/scheduler/multi_thread/mod.rs:79:9
  22: tokio::runtime::Runtime::block_on
             at /Users/redacted/.cargo/registry/src/github.aaakk.us.kg-1ecc6299db9ec823/tokio-1.21.1/src/runtime/mod.rs:492:44
  23: hx::main_impl
             at ./helix-term/src/main.rs:147:5
  24: hx::main
             at ./helix-term/src/main.rs:37:21
  25: core::ops::function::FnOnce::call_once
             at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/core/src/ops/function.rs:248:5

@pascalkuthe
Copy link
Member Author

That looks like an upstream bug :/ Digging into this one will be a pain although it doesn't look specifically MacOS related. I don't have the time to dig into terminfo parsing right now but will try to really dig into this the next few days.

While looking into this, I noticed that the cxterminfo crate (where this bug occurred) is quite well documented (and is only like 500LOC) but has basically no tests or reverse dependencies.
Using this crate was decided upon in the previous PR because the alternatives (terminfo) have more dependencies.
I assumed due diligence was done and didn't recheck the dependencies but they probably just missed that.

I will probably have to inline that create, really understand how it works and then write a bunch of tests because using a basically untested crate will not do. Marking this as draft until then.

Thanks for pointing my attention to this

@pascalkuthe pascalkuthe marked this pull request as draft October 2, 2022 18:39
book/src/themes.md Outdated Show resolved Hide resolved
book/src/themes.md Outdated Show resolved Hide resolved
@pascalkuthe
Copy link
Member Author

pascalkuthe commented Oct 6, 2022

Looking at cxterminfo made very uncomfortable with including it in helix.
The code is quite clearly the first (or one of the first) rust projects of the author.
For example many std functions are reimplemented in the crate and the code is written
in a very panicky manner (tons of slice indexing instead of using the Read trait).
In many places a naive but insufficient solutions were implemented (for example looking up the
home directory using $HOME instead of using dirs-next).
Most importantly the code was basically untested (and without any dependencies on crates.io)
and was not very nice to read.

The code is simple enough that I choose to rewrite a small terminfo parsing library myself
instead of trying to contribute to cxterminfo.
I have published termini to crates.io and updated this PR to use it.
Like cxterminfo, termini is focused on providing a low-dependency terminfo libary.
It only has a single dependency (dirs-next) and a very small footprint (less than 1k loc).
However, termini is written using idiomatic rust to avoid panics and ensure correct behavior.
I have heavily fuzzed the implementation, so the parser should basically never panic even for completely
nonsensical input.
I have added a ton of different terminfo files as test (including detecting undercurl support from kitty and alacritty).

Could you confirm that this is now working for you @Omnikar?

@pascalkuthe pascalkuthe marked this pull request as ready for review October 6, 2022 19:06
@Omnikar
Copy link
Contributor

Omnikar commented Oct 6, 2022

It's not panicking, but I am getting this weird dimming effect, and no coloured underlines (although I'm not sure whether iTerm2 supports coloured underlines? But that should be detected shouldn't it?):
image

@Omnikar
Copy link
Contributor

Omnikar commented Oct 6, 2022

I just tested with Kitty and confirmed that it works as expected, so I'm not sure what's going on with iTerm2.

@Philipp-M
Copy link
Contributor

It's not panicking, but I am getting this weird dimming effect, ...

Yes I've also had that in alacritty.

I had to update to alacritty on master to get rid of this issue (as there isn't support for underline coloring in the current stable version yet (alacritty/alacritty#5935 has fixed that though)).

Interesting that the issue is similar in ITerm2.

I'm not sure if it's possible to check, whether the terminal supports underline coloring or not.

@pascalkuthe
Copy link
Member Author

Hmm this should indeed be detected with terminfo. Perhaphs we are checking the wrong capabilities here. But atleast the capability parsing is working as expected :D

@pascalkuthe pascalkuthe marked this pull request as draft October 6, 2022 21:17
@pascalkuthe pascalkuthe marked this pull request as ready for review October 7, 2022 09:29
@pascalkuthe
Copy link
Member Author

Perfect, that's the best we can do for terminals that don't support colored underlines

@Omnikar
Copy link
Contributor

Omnikar commented Oct 7, 2022

Should this PR add underline theming to more of the themes?

@pascalkuthe
Copy link
Member Author

Should this PR add underline theming to more of the themes?

I have taught about this but decided against it.
Instead I would rater leave that up to a future PR/each theme author individually.
Themes can make different choices here on what underlines to use and colors and we would basically need a review from every theme author.
Updating all themes would also take forever and would be super tedious to review so I would rather not do that in this PR

@EpocSquadron
Copy link
Contributor

Verified this is still working in wezterm!

The docs in this PR are unclear on if the underline-style and underline-color require the underline modifier to also be present.

@pascalkuthe
Copy link
Member Author

pascalkuthe commented Oct 8, 2022

Verified this is still working in wezterm!

The docs in this PR are unclear on if the underline-style and underline-color require the underline modifier to also be present.

Thanks for testing it on wezterm!

The underline modifier is only supported for backwards compatibility with existing themes and not required. It is mapped to underline-style=line when the theme is parsed and does not exist as an actual modifier internally.

I have added a note to the docs to make that more clear

book/src/themes.md Outdated Show resolved Hide resolved
Co-authored-by: Omnikar <[email protected]>
book/src/themes.md Outdated Show resolved Hide resolved
helix-view/src/theme.rs Outdated Show resolved Hide resolved
helix-view/src/theme.rs Outdated Show resolved Hide resolved
helix-view/src/graphics.rs Outdated Show resolved Hide resolved
@the-mikedavis the-mikedavis added S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. and removed S-waiting-on-review Status: Awaiting review from a maintainer. labels Oct 10, 2022
@the-mikedavis
Copy link
Member

This appears to also exhibit #3015 (comment): the styled underlines behave oddly when the cursor is moved across them and the cursor uses underline styling

underline.mp4

Relevant parts of the theme:

"ui.cursor.primary" = { bg = "bg3", modifiers = ["underlined"] }
"diagnostic.error" = { underline-color = "red1", underline-style = "curl" }

This is on Kitty 0.26.2 and wezterm 20220905-102802-7d4b8249

@pascalkuthe
Copy link
Member Author

pascalkuthe commented Oct 12, 2022

This appears to also exhibit #3015 (comment): the styled underlines behave oddly when the cursor is moved across them and the cursor uses underline styling
underline.mp4

Relevant parts of the theme:

"ui.cursor.primary" = { bg = "bg3", modifiers = ["underlined"] }
"diagnostic.error" = { underline-color = "red1", underline-style = "curl" }

This is on Kitty 0.26.2 and wezterm 20220905-102802-7d4b8249

I tested this case while originally working on the PR and it worked.
However since then my work on the terminfo detection introduced a new bug that happened lead to the exact same behavior (although it was completely unrelated) and I did not retest tat case. I have fixed that bug so it should work now.

Part of the bug was (partly) caused by a typo in the terminfo searchpath of termini (my unit tests all use terminfo files inside the repo so that wasn't caught by the tests) so in some cases termini actually didn't parse the terminfo file at all. Could you confirm this still working with iterm @Omnikar, just in case that bug applied on your system aswell?

@the-mikedavis the-mikedavis added S-waiting-on-review Status: Awaiting review from a maintainer. and removed S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. labels Oct 12, 2022
@the-mikedavis
Copy link
Member

Building from the latest, I see that being fixed on Kitty & WezTerm 👍

What do you think about having underline be a toml table?

"diagnostic.error" = { bg = "red0", underline = { color = "red1", style = "curl" } }

@pascalkuthe
Copy link
Member Author

What do you think about having underline be a toml table?

"diagnostic.error" = { bg = "red0", underline = { color = "red1", style = "curl" } }

I think this looks much nicer. I wasn't a big fan at first when I changed the themes because the most common use-case for these new attributes is diagnostics, which looked needlessly nested:

"diagnostic.error" = { underline = { color = "red", style = "curl"} }

However then I remembered that toml allows this:

"diagnostic.error".underline = { color = "red", style = "curl"} 

That looks is much nicer :) I have updated the PR.

On a slightly offtopic note. Wouldn't it be cleaner to alos implement highlight scopes like that so we could avaoid the quting and write:

diagnoistic.error.underline = {color = "red", style = "curl" }

@the-mikedavis
Copy link
Member

I think it might make the parsing or merging awkward if theme keys weren't strings

Copy link
Member

@the-mikedavis the-mikedavis left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm very excited for this to land, thanks for working on it!

@archseer archseer merged commit 418a622 into helix-editor:master Oct 19, 2022
netbsd-srcmastr pushed a commit to NetBSD/pkgsrc that referenced this pull request Dec 7, 2022
Rework the pkgsrc infrastructure to simplify tree-sitter-depends.mk, rewrite
the awk script to simplify things and support regular awk, and put it in the
usual place.  Also add support for Darwin (where this was tested).

# 22.12 (2022-12-06)

This is a great big release filled with changes from a 99 contributors. A big _thank you_ to you all!

As usual, the following is a summary of each of the changes since the last release.
For the full log, check out the [git log](https://github.com/helix-editor/helix/compare/22.08.1..22.12).

Breaking changes:

- Remove readline-like navigation bindings from the default insert mode keymap ([e12690e](helix-editor/helix@e12690e), [#3811](helix-editor/helix#3811), [#3827](helix-editor/helix#3827), [#3915](helix-editor/helix#3915), [#4088](helix-editor/helix#4088))
- Rename `append_to_line` as `insert_at_line_end` and `prepend_to_line` as `insert_at_line_start` ([#3753](helix-editor/helix#3753))
- Swap diagnostic picker and debug mode bindings in the space keymap ([#4229](helix-editor/helix#4229))
- Select newly inserted text on paste or from shell commands ([#4458](helix-editor/helix#4458), [#4608](helix-editor/helix#4608), [#4619](helix-editor/helix#4619), [#4824](helix-editor/helix#4824))
- Select newly inserted surrounding characters on `ms<char>` ([#4752](helix-editor/helix#4752))
- Exit select-mode after executing `replace_*` commands ([#4554](helix-editor/helix#4554))
- Exit select-mode after executing surround commands ([#4858](helix-editor/helix#4858))
- Change tree-sitter text-object keys ([#3782](helix-editor/helix#3782))
- Rename `fleetish` theme to `fleet_dark` ([#4997](helix-editor/helix#4997))

Features:

- Bufferline ([#2759](helix-editor/helix#2759))
- Support underline styles and colors ([#4061](helix-editor/helix#4061), [98c121c](helix-editor/helix@98c121c))
- Inheritance for themes ([#3067](helix-editor/helix#3067), [#4096](helix-editor/helix#4096))
- Cursorcolumn ([#4084](helix-editor/helix#4084))
- Overhauled system for writing files and quiting ([#2267](helix-editor/helix#2267), [#4397](helix-editor/helix#4397))
- Autosave when terminal loses focus ([#3178](helix-editor/helix#3178))
- Use OSC52 as a fallback for the system clipboard ([#3220](helix-editor/helix#3220))
- Show git diffs in the gutter ([#3890](helix-editor/helix#3890), [#5012](helix-editor/helix#5012), [#4995](helix-editor/helix#4995))
- Add a logo ([dc1ec56](helix-editor/helix@dc1ec56))
- Multi-cursor completion ([#4496](helix-editor/helix#4496))

Commands:

- `file_picker_in_current_directory` (`<space>F`) ([#3701](helix-editor/helix#3701))
- `:lsp-restart` to restart the current document's language server ([#3435](helix-editor/helix#3435), [#3972](helix-editor/helix#3972))
- `join_selections_space` (`A-j`) which joins selections and selects the joining whitespace ([#3549](helix-editor/helix#3549))
- `:update` to write the current file if it is modified ([#4426](helix-editor/helix#4426))
- `:lsp-workspace-command` for picking LSP commands to execute ([#3140](helix-editor/helix#3140))
- `extend_prev_word_end` - the extend variant for `move_prev_word_end` ([7468fa2](helix-editor/helix@7468fa2))
- `make_search_word_bounded` which adds regex word boundaries to the current search register value ([#4322](helix-editor/helix#4322))
- `:reload-all` - `:reload` for all open buffers ([#4663](helix-editor/helix#4663), [#4901](helix-editor/helix#4901))
- `goto_next_change` (`]g`), `goto_prev_change` (`[g`), `goto_first_change` (`[G`), `goto_last_change` (`]G`) textobjects for jumping between VCS changes ([#4650](helix-editor/helix#4650))

Usability improvements and fixes:

- Don't log 'LSP not defined' errors in the logfile ([1caba2d](helix-editor/helix@1caba2d))
- Look for the external formatter program before invoking it ([#3670](helix-editor/helix#3670))
- Don't send LSP didOpen events for documents without URLs ([44b4479](helix-editor/helix@44b4479))
- Fix off-by-one in `extend_line_above` command ([#3689](helix-editor/helix#3689))
- Use the original scroll offset when opening a split ([1acdfaa](helix-editor/helix@1acdfaa))
- Handle auto-formatting failures and save the file anyway ([#3684](helix-editor/helix#3684))
- Ensure the cursor is in view after `:reflow` ([#3733](helix-editor/helix#3733))
- Add default rulers and reflow config for git commit messages ([#3738](helix-editor/helix#3738))
- Improve grammar fetching and building output ([#3773](helix-editor/helix#3773))
- Add a `text` language to language completion ([cc47d3f](helix-editor/helix@cc47d3f))
- Improve error handling for `:set-language` ([e8add6f](helix-editor/helix@e8add6f))
- Improve error handling for `:config-reload` ([#3668](helix-editor/helix#3668))
- Improve error handling when passing improper ranges to syntax highlighting ([#3826](helix-editor/helix#3826))
- Render `<code>` tags as raw markup in markdown ([#3425](helix-editor/helix#3425))
- Remove border around the LSP code-actions popup ([#3444](helix-editor/helix#3444))
- Canonicalize the path to the runtime directory ([#3794](helix-editor/helix#3794))
- Add a `themelint` xtask for linting themes ([#3234](helix-editor/helix#3234))
- Re-sort LSP diagnostics after applying transactions ([#3895](helix-editor/helix#3895), [#4319](helix-editor/helix#4319))
- Add a command-line flag to specify the log file ([#3807](helix-editor/helix#3807))
- Track source and tag information in LSP diagnostics ([#3898](helix-editor/helix#3898), [1df32c9](helix-editor/helix@1df32c9))
- Fix theme returning to normal when exiting the `:theme` completion ([#3644](helix-editor/helix#3644))
- Improve error messages for invalid commands in the keymap ([#3931](helix-editor/helix#3931))
- Deduplicate regexs in `search_selection` command ([#3941](helix-editor/helix#3941))
- Split the finding of LSP root and config roots ([#3929](helix-editor/helix#3929))
- Ensure that the cursor is within view after auto-formatting ([#4047](helix-editor/helix#4047))
- Add pseudo-pending to commands with on-next-key callbacks ([#4062](helix-editor/helix#4062), [#4077](helix-editor/helix#4077))
- Add live preview to `:goto` ([#2982](helix-editor/helix#2982))
- Show regex compilation failure in a popup ([#3049](helix-editor/helix#3049))
- Add 'cycled to end' and 'no more matches' for search ([#3176](helix-editor/helix#3176), [#4101](helix-editor/helix#4101))
- Add extending behavior to tree-sitter textobjects ([#3266](helix-editor/helix#3266))
- Add `ui.gutter.selected` option for themes ([#3303](helix-editor/helix#3303))
- Make statusline mode names configurable ([#3311](helix-editor/helix#3311))
- Add a statusline element for total line count ([#3960](helix-editor/helix#3960))
- Add extending behavior to `goto_window_*` commands ([#3985](helix-editor/helix#3985))
- Fix a panic in signature help when the preview is too large ([#4030](helix-editor/helix#4030))
- Add command names to the command palette ([#4071](helix-editor/helix#4071), [#4223](helix-editor/helix#4223), [#4495](helix-editor/helix#4495))
- Find the LSP workspace root from the current document's path ([#3553](helix-editor/helix#3553))
- Add an option to skip indent-guide levels ([#3819](helix-editor/helix#3819), [2c36e33](helix-editor/helix@2c36e33))
- Change focus to modified docs on quit ([#3872](helix-editor/helix#3872))
- Respond to `USR1` signal by reloading config ([#3952](helix-editor/helix#3952))
- Exit gracefully when the close operation fails ([#4081](helix-editor/helix#4081))
- Fix goto/view center mismatch ([#4135](helix-editor/helix#4135))
- Highlight the current file picker document on idle-timeout ([#3172](helix-editor/helix#3172), [a85e386](helix-editor/helix@a85e386))
- Apply transactions to jumplist selections ([#4186](helix-editor/helix#4186), [#4227](helix-editor/helix#4227), [#4733](helix-editor/helix#4733), [#4865](helix-editor/helix#4865), [#4912](helix-editor/helix#4912), [#4965](helix-editor/helix#4965), [#4981](helix-editor/helix#4981))
- Use space as a separator for fuzzy matcher ([#3969](helix-editor/helix#3969))
- Overlay all diagnostics with highest severity on top ([#4113](helix-editor/helix#4113))
- Avoid re-parsing unmodified tree-sitter injections ([#4146](helix-editor/helix#4146))
- Add extending captures for indentation, re-enable python indentation ([#3382](helix-editor/helix#3382), [3e84434](helix-editor/helix@3e84434))
- Only allow either `--vsplit` or `--hsplit` CLI flags at once ([#4202](helix-editor/helix#4202))
- Fix append cursor location when selection anchor is at the end of the document ([#4147](helix-editor/helix#4147))
- Improve selection yanking message ([#4275](helix-editor/helix#4275))
- Log failures to load tree-sitter grammars as errors ([#4315](helix-editor/helix#4315))
- Fix rendering of lines longer than 65,536 columns ([#4172](helix-editor/helix#4172))
- Skip searching `.git` in `global_search` ([#4334](helix-editor/helix#4334))
- Display tree-sitter scopes in a popup ([#4337](helix-editor/helix#4337))
- Fix deleting a word from the end of the buffer ([#4328](helix-editor/helix#4328))
- Pretty print the syntax tree in `:tree-sitter-subtree` ([#4295](helix-editor/helix#4295), [#4606](helix-editor/helix#4606))
- Allow specifying suffixes for file-type detection ([#2455](helix-editor/helix#2455), [#4414](helix-editor/helix#4414))
- Fix multi-byte auto-pairs ([#4024](helix-editor/helix#4024))
- Improve sort scoring for LSP code-actions and completions ([#4134](helix-editor/helix#4134))
- Fix the handling of quotes within shellwords ([#4098](helix-editor/helix#4098))
- Fix `delete_word_backward` and `delete_word_forward` on newlines ([#4392](helix-editor/helix#4392))
- Fix 'no entry found for key' crash on `:write-all` ([#4384](helix-editor/helix#4384))
- Remove lowercase requirement for tree-sitter grammars ([#4346](helix-editor/helix#4346))
- Resolve LSP completion items on idle-timeout ([#4406](helix-editor/helix#4406), [#4797](helix-editor/helix#4797))
- Render diagnostics in the file picker preview ([#4324](helix-editor/helix#4324))
- Fix terminal freezing on `shell_insert_output` ([#4156](helix-editor/helix#4156))
- Allow use of the count in the repeat operator (`.`) ([#4450](helix-editor/helix#4450))
- Show the current theme name on `:theme` with no arguments ([#3740](helix-editor/helix#3740))
- Fix rendering in very large terminals ([#4318](helix-editor/helix#4318))
- Sort LSP preselected items to the top of the completion menu ([#4480](helix-editor/helix#4480))
- Trim braces and quotes from paths in goto-file ([#4370](helix-editor/helix#4370))
- Prevent automatic signature help outside of insert mode ([#4456](helix-editor/helix#4456))
- Fix freezes with external programs that process stdin and stdout concurrently ([#4180](helix-editor/helix#4180))
- Make `scroll` aware of tabs and wide characters ([#4519](helix-editor/helix#4519))
- Correctly handle escaping in `command_mode` completion ([#4316](helix-editor/helix#4316), [#4587](helix-editor/helix#4587), [#4632](helix-editor/helix#4632))
- Fix `delete_char_backward` for paired characters ([#4558](helix-editor/helix#4558))
- Fix crash from two windows editing the same document ([#4570](helix-editor/helix#4570))
- Fix pasting from the blackhole register ([#4497](helix-editor/helix#4497))
- Support LSP insertReplace completion items ([1312682](helix-editor/helix@1312682))
- Dynamically resize the line number gutter width ([#3469](helix-editor/helix#3469))
- Fix crash for unknown completion item kinds ([#4658](helix-editor/helix#4658))
- Re-enable `format_selections` for single selection ranges ([d4f5cab](helix-editor/helix@d4f5cab))
- Limit the number of in-progress tree-sitter query matches ([#4707](helix-editor/helix#4707), [#4830](helix-editor/helix#4830))
- Use the special `#` register with `increment`/`decrement` to change by range number ([#4418](helix-editor/helix#4418))
- Add a statusline element to show number of selected chars ([#4682](helix-editor/helix#4682))
- Add a statusline element showing global LSP diagnostic warning and error counts ([#4569](helix-editor/helix#4569))
- Add a scrollbar to popups ([#4449](helix-editor/helix#4449))
- Prefer shorter matches in fuzzy matcher scoring ([#4698](helix-editor/helix#4698))
- Use key-sequence format for command palette keybinds ([#4712](helix-editor/helix#4712))
- Remove prefix filtering from autocompletion menu ([#4578](helix-editor/helix#4578))
- Focus on the parent buffer when closing a split ([#4766](helix-editor/helix#4766))
- Handle language server termination ([#4797](helix-editor/helix#4797), [#4852](helix-editor/helix#4852))
- Allow `r`/`t`/`f` to work on tab characters ([#4817](helix-editor/helix#4817))
- Show a preview for scratch buffers in the buffer picker ([#3454](helix-editor/helix#3454))
- Set a limit of entries in the jumplist ([#4750](helix-editor/helix#4750))
- Re-use shell outputs when inserting or appending shell output ([#3465](helix-editor/helix#3465))
- Check LSP server provider capabilities ([#3554](helix-editor/helix#3554))
- Improve tree-sitter parsing performance on files with many language layers ([#4716](helix-editor/helix#4716))
- Move indentation to the next line when using `<ret>` on a line with only whitespace ([#4854](helix-editor/helix#4854))
- Remove selections for closed views from all documents ([#4888](helix-editor/helix#4888))
- Improve performance of the `:reload` command ([#4457](helix-editor/helix#4457))
- Properly handle media keys ([#4887](helix-editor/helix#4887))
- Support LSP diagnostic data field ([#4935](helix-editor/helix#4935))
- Handle C-i keycode as tab ([#4961](helix-editor/helix#4961))
- Fix view alignment for jumplist picker jumps ([#3743](helix-editor/helix#3743))
- Use OSC52 for tmux clipboard provider ([#5027](helix-editor/helix#5027))

Themes:

- Add `varua` ([#3610](helix-editor/helix#3610), [#4964](helix-editor/helix#4964))
- Update `boo_berry` ([#3653](helix-editor/helix#3653))
- Add `rasmus` ([#3728](helix-editor/helix#3728))
- Add `papercolor_dark` ([#3742](helix-editor/helix#3742))
- Update `monokai_pro_spectrum` ([#3814](helix-editor/helix#3814))
- Update `nord` ([#3792](helix-editor/helix#3792))
- Update `fleetish` ([#3844](helix-editor/helix#3844), [#4487](helix-editor/helix#4487), [#4813](helix-editor/helix#4813))
- Update `flatwhite` ([#3843](helix-editor/helix#3843))
- Add `darcula` ([#3739](helix-editor/helix#3739))
- Update `papercolor` ([#3938](helix-editor/helix#3938), [#4317](helix-editor/helix#4317))
- Add bufferline colors to multiple themes ([#3881](helix-editor/helix#3881))
- Add `gruvbox_dark_hard` ([#3948](helix-editor/helix#3948))
- Add `onedarker` ([#3980](helix-editor/helix#3980), [#4060](helix-editor/helix#4060))
- Add `dark_high_contrast` ([#3312](helix-editor/helix#3312))
- Update `bogster` ([#4121](helix-editor/helix#4121), [#4264](helix-editor/helix#4264))
- Update `sonokai` ([#4089](helix-editor/helix#4089))
- Update `ayu_*` themes ([#4140](helix-editor/helix#4140), [#4109](helix-editor/helix#4109), [#4662](helix-editor/helix#4662), [#4764](helix-editor/helix#4764))
- Update `everforest` ([#3998](helix-editor/helix#3998))
- Update `monokai_pro_octagon` ([#4247](helix-editor/helix#4247))
- Add `heisenberg` ([#4209](helix-editor/helix#4209))
- Add `bogster_light` ([#4265](helix-editor/helix#4265))
- Update `pop-dark` ([#4323](helix-editor/helix#4323))
- Update `rose_pine` ([#4221](helix-editor/helix#4221))
- Add `kanagawa` ([#4300](helix-editor/helix#4300))
- Add `hex_steel`, `hex_toxic` and `hex_lavendar` ([#4367](helix-editor/helix#4367), [#4990](helix-editor/helix#4990))
- Update `tokyonight` and `tokyonight_storm` ([#4415](helix-editor/helix#4415))
- Update `gruvbox` ([#4626](helix-editor/helix#4626))
- Update `dark_plus` ([#4661](helix-editor/helix#4661), [#4678](helix-editor/helix#4678))
- Add `zenburn` ([#4613](helix-editor/helix#4613), [#4977](helix-editor/helix#4977))
- Update `monokai_pro` ([#4789](helix-editor/helix#4789))
- Add `mellow` ([#4770](helix-editor/helix#4770))
- Add `nightfox` ([#4769](helix-editor/helix#4769), [#4966](helix-editor/helix#4966))
- Update `doom_acario_dark` ([#4979](helix-editor/helix#4979))
- Update `autumn` ([#4996](helix-editor/helix#4996))
- Update `acme` ([#4999](helix-editor/helix#4999))
- Update `nord_light` ([#4999](helix-editor/helix#4999))
- Update `serika_*` ([#5015](helix-editor/helix#5015))

LSP configurations:

- Switch to `openscad-lsp` for OpenScad ([#3750](helix-editor/helix#3750))
- Support Jsonnet ([#3748](helix-editor/helix#3748))
- Support Markdown ([#3499](helix-editor/helix#3499))
- Support Bass ([#3771](helix-editor/helix#3771))
- Set roots configuration for Elixir and HEEx ([#3917](helix-editor/helix#3917), [#3959](helix-editor/helix#3959))
- Support Purescript ([#4242](helix-editor/helix#4242))
- Set roots configuration for Julia ([#4361](helix-editor/helix#4361))
- Support D ([#4372](helix-editor/helix#4372))
- Increase default language server timeout for Julia ([#4575](helix-editor/helix#4575))
- Use ElixirLS for HEEx ([#4679](helix-editor/helix#4679))
- Support Bicep ([#4403](helix-editor/helix#4403))
- Switch to `nil` for Nix ([433ccef](helix-editor/helix@433ccef))
- Support QML ([#4842](helix-editor/helix#4842))
- Enable auto-format for CSS ([#4987](helix-editor/helix#4987))
- Support CommonLisp ([4176769](helix-editor/helix@4176769))

New languages:

- SML ([#3692](helix-editor/helix#3692))
- Jsonnet ([#3714](helix-editor/helix#3714))
- Godot resource ([#3759](helix-editor/helix#3759))
- Astro ([#3829](helix-editor/helix#3829))
- SSH config ([#2455](helix-editor/helix#2455), [#4538](helix-editor/helix#4538))
- Bass ([#3771](helix-editor/helix#3771))
- WAT (WebAssembly text format) ([#4040](helix-editor/helix#4040), [#4542](helix-editor/helix#4542))
- Purescript ([#4242](helix-editor/helix#4242))
- D ([#4372](helix-editor/helix#4372), [#4562](helix-editor/helix#4562))
- VHS ([#4486](helix-editor/helix#4486))
- KDL ([#4481](helix-editor/helix#4481))
- XML ([#4518](helix-editor/helix#4518))
- WIT ([#4525](helix-editor/helix#4525))
- ENV ([#4536](helix-editor/helix#4536))
- INI ([#4538](helix-editor/helix#4538))
- Bicep ([#4403](helix-editor/helix#4403), [#4751](helix-editor/helix#4751))
- QML ([#4842](helix-editor/helix#4842))
- CommonLisp ([4176769](helix-editor/helix@4176769))

Updated languages and queries:

- Zig ([#3621](helix-editor/helix#3621), [#4745](helix-editor/helix#4745))
- Rust ([#3647](helix-editor/helix#3647), [#3729](helix-editor/helix#3729), [#3927](helix-editor/helix#3927), [#4073](helix-editor/helix#4073), [#4510](helix-editor/helix#4510), [#4659](helix-editor/helix#4659), [#4717](helix-editor/helix#4717))
- Solidity ([20ed8c2](helix-editor/helix@20ed8c2))
- Fish ([#3704](helix-editor/helix#3704))
- Elixir ([#3645](helix-editor/helix#3645), [#4333](helix-editor/helix#4333), [#4821](helix-editor/helix#4821))
- Diff ([#3708](helix-editor/helix#3708))
- Nix ([665e27f](helix-editor/helix@665e27f), [1fe3273](helix-editor/helix@1fe3273))
- Markdown ([#3749](helix-editor/helix#3749), [#4078](helix-editor/helix#4078), [#4483](helix-editor/helix#4483), [#4478](helix-editor/helix#4478))
- GDScript ([#3760](helix-editor/helix#3760))
- JSX and TSX ([#3853](helix-editor/helix#3853), [#3973](helix-editor/helix#3973))
- Ruby ([#3976](helix-editor/helix#3976), [#4601](helix-editor/helix#4601))
- R ([#4031](helix-editor/helix#4031))
- WGSL ([#3996](helix-editor/helix#3996), [#4079](helix-editor/helix#4079))
- C# ([#4118](helix-editor/helix#4118), [#4281](helix-editor/helix#4281), [#4213](helix-editor/helix#4213))
- Twig ([#4176](helix-editor/helix#4176))
- Lua ([#3552](helix-editor/helix#3552))
- C/C++ ([#4079](helix-editor/helix#4079), [#4278](helix-editor/helix#4278), [#4282](helix-editor/helix#4282))
- Cairo ([17488f1](helix-editor/helix@17488f1), [431f9c1](helix-editor/helix@431f9c1), [09a6df1](helix-editor/helix@09a6df1))
- Rescript ([#4356](helix-editor/helix#4356))
- Zig ([#4409](helix-editor/helix#4409))
- Scala ([#4353](helix-editor/helix#4353), [#4697](helix-editor/helix#4697), [#4701](helix-editor/helix#4701))
- LaTeX ([#4528](helix-editor/helix#4528), [#4922](helix-editor/helix#4922))
- SQL ([#4529](helix-editor/helix#4529))
- Python ([#4560](helix-editor/helix#4560))
- Bash/Zsh ([#4582](helix-editor/helix#4582))
- Nu ([#4583](helix-editor/helix#4583))
- Julia ([#4588](helix-editor/helix#4588))
- Typescript ([#4703](helix-editor/helix#4703))
- Meson ([#4572](helix-editor/helix#4572))
- Haskell ([#4800](helix-editor/helix#4800))
- CMake ([#4809](helix-editor/helix#4809))
- HTML ([#4829](helix-editor/helix#4829), [#4881](helix-editor/helix#4881))
- Java ([#4886](helix-editor/helix#4886))
- Go ([#4906](helix-editor/helix#4906), [#4969](helix-editor/helix#4969), [#5010](helix-editor/helix#5010))
- CSS ([#4882](helix-editor/helix#4882))
- Racket ([#4915](helix-editor/helix#4915))
- SCSS ([#5003](helix-editor/helix#5003))

Packaging:

- Filter relevant source files in the Nix flake ([#3657](helix-editor/helix#3657))
- Build a binary for `aarch64-linux` in the release CI ([038a91d](helix-editor/helix@038a91d))
- Build an AppImage for `aarch64-linux` in the release CI ([b738031](helix-editor/helix@b738031))
- Enable CI builds for `riscv64-linux` ([#3685](helix-editor/helix#3685))
- Support preview releases in CI ([0090a2d](helix-editor/helix@0090a2d))
- Strip binaries built in CI ([#3780](helix-editor/helix#3780))
- Fix the development shell for the Nix Flake on `aarch64-darwin` ([#3810](helix-editor/helix#3810))
- Raise the MSRV and create an MSRV policy ([#3896](helix-editor/helix#3896), [#3913](helix-editor/helix#3913), [#3961](helix-editor/helix#3961))
- Fix Fish completions for `--config` and `--log` flags ([#3912](helix-editor/helix#3912))
- Use builtin filenames option in Bash completion ([#4648](helix-editor/helix#4648))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
A-gui Area: Helix gui improvements A-theme Area: Theme and appearence related S-waiting-on-review Status: Awaiting review from a maintainer.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Colored and styled underlines for errors/warnings
9 participants