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.

63 changes across 4 releases

Added 31

25.07

  • 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

25.01.1

  • Add CodeQL language support
  • Add Gren language support

25.01

  • 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`
Changed 22

25.07.1

  • Lower the GLIBC requirements of the release artifacts published to GitHub

25.07

  • 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

25.01.1

  • 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

25.01

  • 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`
Fixed 9

25.07

  • Fix multiple syntax highlighter bugs

25.01.1

  • 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
Removed 1

25.07

  • 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)

View originalPermalink

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-option or :toggle-option.
    • The :rsort command has been removed. Use the reverse flag instead: :sort --reverse

Features:

Commands:

  • Add copy_between_registers for interactive copying between two registers (066e938)
  • Add extend_to_file_{start,end}, select-mode variants of goto_file_{start,end} (#11767)
  • Add :! alias for :sh and :| for :pipe (#13263)
  • Add goto_column and extend_to_column (#13440)
  • Add an --insensitive/-i flag to the :sort command (#13560)
  • Add rotate_selections_first and rotate_selections_last (#13615)
  • Add a --no-format flag for all :write commands (2f56091)
  • Add a --skip-visible flag for :buffer-close-others and :buffer-close-others! (#5393)

Usability improvements:

  • Replace current file using A-ret in 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-stop and :lsp-restart (#12578, 3d7e273)
  • Add m (nearest matching pair) to infobox popups for md and mr (#12650)
  • Add a hint message in the statusline when using :sort on 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_register and copy_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-newlines and editor.trim-trailing-whitespace config options (aa20eb8)
  • Warn when the configured theme is unusable because true-color is not available (#13058)
  • Allow configuring [workspace-]diagnostic statusline element severities (#13288, b0528bb)
  • Improve completion for shell commands (#12883, 532f241)
  • Show the primary selection index in the selections statusline element when there are multiple selections (#12326)
  • Use configured language server names when possible in --health output (#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 :move when 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-tab config (28047fe)
  • Fix soft-wrap word boundary detection for Unicode combining accent characters (#12483)
  • Fix clearing of infobox popups in select_register and insert_register commands (e882a75)
  • Fix handling of stderr of 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-register in :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) …

View originalPermalink

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_selections behavior 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_newline when 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.directory and ui.virtual.wrap in dark_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-tidy as YAML (#12498)
  • Update MATLAB grammar and indent queries (#12518)
  • Recognize rockspec as 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:

  • --version now prints a leading zero for single-digit months, for example 25.01 (03f35af)
  • Pin the Ubuntu GitHub Actions runners used for releases to ubuntu-22.04 (#12464)
  • Produce a Debian package (.deb file) in the release GitHub Actions workflow (#12453)

View originalPermalink

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-messages key now controls messages sent with the LSP window/showMessage notification rather than progress messages. If you want to enable progress messages you should now enable the editor.lsp.display-progress-messages key instead. (#5535)

Features:

  • Big refactor for Pickers (#9647, #11209, #11216, #11211, #11343, #11406)
    • 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 (#6417, #11815)
  • Support defining keybindings as macros (#4709)
  • Continue line comments in o/O and 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, replacing search_selection which was moved to A-*.

Usability improvements:

  • Add :edit and :e aliases for :open (#11186, #11196)
  • Trim trailing newline from pipe command outputs when the input doesn't have a trailing newline (#11183, 4f63a46)
  • Add :mv alias 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 :sh commands (#11239)
  • Add statusline errors when nothing is selected with s, K, A-K (#11370)
  • Add .svn as a workspace root marker (#11429)
  • Trim the end of :sh outputs (#11161)
  • Show LSP window/showMessage messages in the statusline (#5535)
  • Support finding workspace directories via .jj directories (#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-register config option (#11430)
  • Show a statusline error for :format when a formatter is not available (#12183)
  • Change to the home directory with :cd with 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_replace and surround_delete (#12262)

Fixes:

  • Respect document indentation settings in format_selections (=) (#11169)
  • Avoid switching the current document to normal mode during an LSP workspace/applyEdit operation (#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_backward on 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-k in a prompt ending in a multi-byte character (#12237)
  • Expand tildes in paths passed to :read (#12271)
  • Respect per-language workspace-lsp-roots configuration 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 --health output on light terminals (#12355)
  • Accept integers serialized as floats in the JSONRPC id field (#12376)

Themes:

  • Bring kanagawa colors better in line with neovim version (#11187, #11270)
  • Add ao (#11063)
  • Update dark_plus (#11415)
  • Add iceberg-light and iceberg-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.storage in onedark (#11802)
  • Add ui.virtual.jump-label to serika-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) …

View originalPermalink