What changed in Helix from 24 to 25
4 releases numbered after 24.07 up to and including 25.07.1, stable releases only. 24.07 and 25.07.1 are the newest stable releases of 24 and 25 we track; this page follows them as new ones ship.
- 2 mention breaking changes
- 1 removes or deprecates something
63 changes across 4 releases
- Add a directory picker for exploring directories
- Allow cycling through multiple LSP hover responses with A-n and A-p
- Add support for incomplete LSP completions
- Add support for EditorConfig
- Add support for LSP document colors
- Support expansions in external formatter arguments
- Add support for the DAP startDebugging reverse request
- Add copy_between_registers command for interactive copying between registers
- Add extend_to_file_start and extend_to_file_end select-mode commands
- Add :! alias for :sh and :| alias for :pipe
- Add goto_column and extend_to_column commands
- Add --insensitive and -i flags to the :sort command
- Add rotate_selections_first and rotate_selections_last commands
- Add --no-format flag for all :write commands
- Add CodeQL language support
- Add Gren language support
- Add `editor.lsp.display-progress-messages` key to enable progress messages
- Refactor Pickers to use a table layout and allow filtering by column
- Reimplement `global_search` to allow changing the query dynamically
- Add an alternative inline display for LSP diagnostics
- Support defining keybindings as macros
- Continue line comments in `o`/`O` and on `<ret>` in insert mode
- Allow configuring and switching clipboard providers at runtime
- Add support for path completion
- Support bindings with the Super (Cmd/Win/Meta) modifier
- Support rendering and jumping between tabstops in snippet completions
- Allow theming directory completions
- Add commands to move within snake_case or camelCase words
- Add `search_selection_detect_word_boundaries` command which takes the `*` key in normal and select mode
- Add `:edit` and `:e` aliases for `:open`
- Add `:mv` alias for `:move`
- Lower the GLIBC requirements of the release artifacts published to GitHub
- Rewrite command line parsing to support flags and expansions
- Change quoting and space handling in command line parsing, which may break existing keymaps using typable commands
- Switch syntax highlighter to the tree-house crate
- Highlight locals like parameter highlights even when the definition is not in view
- Inject markdown syntax highlighting into rust doc comments
- Run external formatters from the document's directory
- Update onelight theme
- Add cursorline color to iceberg themes
- Update special, ui.text.directory and ui.virtual.wrap in dark_plus theme
- Highlight : in Rust as a delimiter
- Update Swift highlights
- Highlight JSX attributes as @attribute
- Improve markdown heading highlights
- Add comment tokens configuration for JSONC
- --version now prints a leading zero for single-digit months
- The `editor.lsp.display-messages` key now controls messages sent with the LSP `window/showMessage` notification rather than progress messages
- Trim trailing newline from pipe command outputs when the input doesn't have a trailing newline
- Return document display name instead of absolute path from the `%` special register
- Track view position on a per-view instead of per-document basis
- Improve scrolloff calculation to leave a gap in the middle
- Add statusline errors when nothing is selected with `s`, `K`, `A-K`
- Fix multiple syntax highlighter bugs
- Fix blank buffer picker preview on doc with no views
- Fix join_selections behavior on tabs
- Fix recognition for color LSP completion hex codes for some language servers
- Fix offsets to selections updated by open_below/open_above in multi-cursor scenarios
- Fix offsets to selections updated by insert_newline when trimming whitespace in multi-cursor scenarios
- Fix panic in path completion from resolving variables like ${HOME:-$HOME}
- Prevent line comment continuation when using change_selection on a line above a comment
- Fix Teal LSP name
- Remove the :rsort command in favor of the :sort --reverse flag
Original release notes, newest first
The list above is our reading of these notes; the originals from Helix are here, one fold per release.
25.07.1
This is a patch release which lowers the GLIBC requirements of the release artifacts published to GitHub (#13983)
25.07
As always, a big thank you to all of the contributors! This release saw changes from 195 contributors.
Breaking changes:
- The parsing of the command line has been rewritten and now supports flags and expansions (#12527, #13018, 9574e55, 2d4c2a1, #13192, 67f1fe2, #13466, #13467, #13840)
- Quoting and spaces are now handled differently. This can break existing keymaps which use typable commands, in particular
:sh,:set-optionor:toggle-option. - The
:rsortcommand has been removed. Use the reverse flag instead::sort --reverse
- Quoting and spaces are now handled differently. This can break existing keymaps which use typable commands, in particular
Features:
- Add a picker which explores directories (#11285, d4aed40)
- Allow cycling through multiple LSP Hover responses with
A-n/A-p(#10122, 2367b20) - Add support for incomplete LSP completions (5c1f3f8)
- Add support for EditorConfig (#13056, #13443)
- Add support for LSP document colors (#12308, d43de14, 47cdd23, ba54b6a, #13188)
- Support expansions in external formatter arguments (#13429)
- Switch out the highlighter for the
tree-housecrate (#12972, 09bc67a, a7c3a43, 3ceae88, 05ae617, 5a1dcc2, ebf96bd, #13644, b1f4717, 7410fe3, 633c5fb, 362e97e, #13828, 6fd1efd)- This fixes a number of highlighter bugs.
- Locals like parameter highlights are now highlighted even when the definition is not in view.
- Markdown is now injected into rust doc comments (
///and//!).
- Add support for the DAP
startDebuggingreverse request (#13403)
Commands:
- Add
copy_between_registersfor interactive copying between two registers (066e938) - Add
extend_to_file_{start,end}, select-mode variants ofgoto_file_{start,end}(#11767) - Add
:!alias for:shand:|for:pipe(#13263) - Add
goto_columnandextend_to_column(#13440) - Add an
--insensitive/-iflag to the:sortcommand (#13560) - Add
rotate_selections_firstandrotate_selections_last(#13615) - Add a
--no-formatflag for all:writecommands (2f56091) - Add a
--skip-visibleflag for:buffer-close-othersand:buffer-close-others!(#5393)
Usability improvements:
- Replace current file using
A-retin pickers rather than loading it in the background (#12605) - Set multiple selections when passing a file with multiple locations to
hx(#12192) - Add path completion for multiple cursors (#12550, c9dc940)
- Truncate long prompt lines with "…" (#12036, 9d6ea77, 0b9701e, d3fb8fc)
- Allow specifying languages in
:lsp-stopand:lsp-restart(#12578, 3d7e273) - Add
m(nearest matching pair) to infobox popups formdandmr(#12650) - Add a hint message in the statusline when using
:sorton a single selection (#12585) - Avoid wrapping around in
goto_{next,prev}_diag(#12704) - Support responses from multiple language servers for LSP goto-definition (and declaration, type definition and implementation) and goto-references (f7394d5, 1a821ac, d285a8a)
- Show formatter errors in
:format(47f84d0) - Show typable command docs in keybinding infobox popups when the command takes no arguments (e9c16b7)
- Add per-command titles to register selection infobox popups for
select_register,insert_registerandcopy_between_registers(e0da129) - Add container name column to the LSP symbol picker (#12930)
- Add a theme key for highlighting directories in completions and picker items (#12855, 7bebe0a)
- Add
editor.trim-final-newlinesandeditor.trim-trailing-whitespaceconfig options (aa20eb8) - Warn when the configured theme is unusable because true-color is not available (#13058)
- Allow configuring
[workspace-]diagnosticstatusline element severities (#13288, b0528bb) - Improve completion for shell commands (#12883, 532f241)
- Show the primary selection index in the
selectionsstatusline element when there are multiple selections (#12326) - Use configured language server names when possible in
--healthoutput (#13573) - Add a statusline element for indentation style (#13632)
- Set the working directory of language server commands to the workspace root (#13691)
- Avoid jumpiness in the picker preview for languages with non-default tab widths (#13761)
- Add a config option for limiting LSP inlay hint length (#13742)
- Improve heuristics used in the diff gutter (#13722)
- Allow moving a file with
:movewhen its old path does not exist (#13748) - Allow moving a file into a directory with
:move(#13922) - Show human-readable file sizes in the statusline message for file writes (#13627)
- Add diagnostic source to the diagnosics pickers (#13758)
- Show all active scopes under the cursor in
:tree-sitter-highlight-name(4a85171) - Auto-close the LSP code-actions popup (#13832)
- Add a configuration option for controlling atomic writes to disk (#13656)
Fixes:
- Fix panic from using
search_selection_detect_word_boundaries(*) at the end of the file (#12611) - Discard placeholder text for zero tabstop
${0:placeholder}(#12647) - Fix panic in
goto_file(gf) on file names with non-ASCII characters (#12673) - Only accept unmodified characters in
goto_word(gw) (f5f9f49, 0364521) - Skip recording keys pressed by macros while recording a macro (#12733)
- Deny unknown fields in
editor.smart-tabconfig (28047fe) - Fix soft-wrap word boundary detection for Unicode combining accent characters (#12483)
- Fix clearing of infobox popups in
select_registerandinsert_registercommands (e882a75) - Fix handling of
stderrof DAP child processes (d0d1693) - Cancel all pending requests when a DAP session terminates (26db541)
- Properly discard out-of-date diagnostics (313a647)
- Fix display of multiple language servers in
hx --health(#12841) - Respect
editor.default-yank-registerin:yank-joined(#12890) - Escape percent character when pasting the history register into the picker (#12886)
- Render rulers before the cursor (2d3b75a)
- Avoid inserting final newlines in empty files (67879a1)
- Gracefully handle partial failure in multi-language-server requests (#13156, 14cab4b)
- Improve LSP progress message display in the statusline (#13180)
- Fix behavior of
<esc>removing added indentation in documents with CRLF line endings (702a961) …
25.01.1
25.01.1 is a patch release focusing on fixing bugs and panics from changes in 25.01.
Usability improvements:
- Run external formatters from the document's directory (#12315)
Fixes:
- Fix blank buffer picker preview on doc with no views (917174e)
- Fix
join_selectionsbehavior on tabs (#12452) - Fix recognition for color LSP completion hex codes for some language servers (#12501)
- Fix offsets to selections updated by
open_below/open_above(o/O) in multi-cursor scenarios (#12465) - Fix offsets to selections updated by
insert_newlinewhen trimming whitespace in multi-cursor scenarios (4bd17e5) - Fix panic in path completion from resolving variables like
${HOME:-$HOME}(#12556) - Prevent line comment continuation when using
change_selection(c) on a line above a comment (#12575)
Themes:
- Update
onelight(#12399) - Add cursorline color to iceberg themes (#12404)
- Update
special,ui.text.directoryandui.virtual.wrapindark_plus(#12530)
New languages:
Updated languages and queries:
- Fix Teal LSP name (#12395)
- Highlight
:in Rust as a delimiter (#12408) - Update Swift highlights (#12409)
- Highlight JSX attributes as
@attribute(#12416) - Improve markdown heading highlights (#12417)
- Add comment tokens configuration for JSONC (b26903c)
- Highlight the never type
!as a type in Rust (#12485) - Expand builtin function highlights for ECMA languages, Rust and Haskell (#12488)
- Recognize
.clang-tidyas YAML (#12498) - Update MATLAB grammar and indent queries (#12518)
- Recognize
rockspecas Lua (#12516) - Add
///to Dart comment tokens configuration (99d33c7) - Update Solidity grammar and queries (#12457)
- Update Spade grammar and queries (#12583)
- Re-enable Hare fetching and building by default (#11507)
Packaging:
25.01
As always, a big thank you to all of the contributors! This release saw changes from 171 contributors.
Breaking changes:
- The
editor.lsp.display-messageskey now controls messages sent with the LSPwindow/showMessagenotification rather than progress messages. If you want to enable progress messages you should now enable theeditor.lsp.display-progress-messageskey instead. (#5535)
Features:
- Big refactor for
Pickers (#9647, #11209, #11216, #11211, #11343, #11406)- Use a table layout and allow filtering by column
- Reimplement
global_searchto allow changing the query dynamically
- Add an alternative "inline" display for LSP diagnostics (#6417, #11815)
- Support defining keybindings as macros (#4709)
- Continue line comments in
o/Oand on<ret>in insert mode (#10996, #12213, #12215) - Allow configuring and switching clipboard providers at runtime (#10839, b855cd0, 467fad5, 191b0f0)
- Add support for path completion (#2608)
- Support bindings with the Super (Cmd/Win/Meta) modifier (#6592)
- Support rendering and jumping between tabstops in snippet completions (#9801)
- Allow theming directory completions (#12205, #12295)
Commands:
- Add commands to move within snake_case or camelCase words (#8147)
- Add
search_selection_detect_word_boundaries(#12126)- This command takes the
*key in normal and select mode, replacingsearch_selectionwhich was moved toA-*.
- This command takes the
Usability improvements:
- Add
:editand:ealiases for:open(#11186, #11196) - Trim trailing newline from pipe command outputs when the input doesn't have a trailing newline (#11183, 4f63a46)
- Add
:mvalias for:move(#11256) - Return document display name instead of absolute path from the
%special register (#11275) - Track view position on a per-view instead of per-document basis (#10559)
- Improve scrolloff calculation to leave a gap in the middle (#11323)
- Show a popup for stderr printed by failed
:shcommands (#11239) - Add statusline errors when nothing is selected with
s,K,A-K(#11370) - Add
.svnas a workspace root marker (#11429) - Trim the end of
:shoutputs (#11161) - Show LSP
window/showMessagemessages in the statusline (#5535) - Support finding workspace directories via
.jjdirectories (#11685) - Join single-line comments with
join_selections(J) (#11742) - Show anonymous syntax tree nodes in
:tree-sitter-subtree(#11663, 38e8382) - Save an undo checkpoint before paste in insert mode (#8121)
- Only break on ASCII spaces in
:reflow(#12048) - Add a
default-yank-registerconfig option (#11430) - Show a statusline error for
:formatwhen a formatter is not available (#12183) - Change to the home directory with
:cdwith no arguments (#12042) - Change default comment token to
#for unrecognized files (#12080, #12266, bae6a58) - Trim all trailing whitespace on
insert_newline(#12177) - Change to the prior directory with
:cd -(#12194) - Allow parsing
-(with no modifiers) as a keybinding (#12191) - Improve opening statusline and error messages when opening duplicate files or directories (#12199)
- Trim trailing colons in paths passed on the argv (#9963)
- Show tree-sitter parser availability in
hx --health <lang>(#12228) - Show a preview block for colors in the LSP completion menu (#12299)
- Add infobox help for
surround_add,surround_replaceandsurround_delete(#12262)
Fixes:
- Respect document indentation settings in
format_selections(=) (#11169) - Avoid switching the current document to normal mode during an LSP
workspace/applyEditoperation (#11176) - Fix off-by-one in LSP
find_completion_range(#11266) - Prefer file-system mtime to local system time for detecting external modifications (#11142, #11352, #11358, #11361)
- Fix writing of hardlinks (#11340)
- Prevent language servers from being automatically restarted when stopped with
:lsp-stop(#11321) - Stable-sort LSP text edits (#11357)
- Fix determination of current language layer in documents with nested language injections (#11365)
- Fix a panic from
:moveing a file to a new extension which starts a language server (#11387) - Fix a panic from duplicating the diff gutter (#11092)
- Keep cursor position when exactly replacing text (#5930)
- Fix a panic from
jump_backwardon a newly opened split (#11508) - Fix a panic from language servers sending an unknown diagnostic severity (#11569)
- Fix a panic when drawing at the edge of the screen (#11737)
- Fix git repo detection on symlinks (#11732)
- Fix a panic from a language server sending an out-of-range active signature index in
textDocument/signatureHelp(#11825) - Fix a panic from using
C-kin a prompt ending in a multi-byte character (#12237) - Expand tildes in paths passed to
:read(#12271) - Respect per-language
workspace-lsp-rootsconfiguration when opening new documents (#12223) - Consistently replace line-endings in paste/replace commands (c262fe4)
- Fix formatting in error statusline messages when inspecting variables in DAP (#12354)
- Fix invisible printing of headers in
--healthoutput on light terminals (#12355) - Accept integers serialized as floats in the JSONRPC
idfield (#12376)
Themes:
- Bring
kanagawacolors better in line with neovim version (#11187, #11270) - Add
ao(#11063) - Update
dark_plus(#11415) - Add
iceberg-lightandiceberg-dark(#10674) - Update everforest themes (#11459)
- Update gruvbox themes (#11477)
- Change primary selection cursor color for
naysayer(#11617) - Style picker column names in
horizon-dark(#11649) - Style picker column names in Darcula themes (#11649)
- Update diagnostics colors in
snazzy(#11731) - Update bogster themes (#11353)
- Highlight
keyword.storageinonedark(#11802) - Add
ui.virtual.jump-labeltoserika-dark(#11911) - Add
adwaita-light(#10869) - Add seoul256 themes (#11466)
- Add yo themes (#11703)
- Add
eiffel(#11679) - Add
carbonfox(#11558) - Set tags color in monokai themes (#11917)
- Improve readability of spacebones picker selection (#12064)
- Update modus themes (#11949)
- Use bold for statusline mode indicator in
onedarker(#11958) - Update hex themes, add a new hex theme (#10849)
- Add
sunset(#12093) - Add bufferline highlighting for flexoki themes (#12146) …