From 9aeb7f71a362419fc05b7ee4a98ed151cdbbe46e Mon Sep 17 00:00:00 2001 From: Tim 'Piepmatz' Hesse Date: Sun, 23 Aug 2026 09:51:15 +0200 Subject: [PATCH 1/4] Release notes for `v0.115.1` Please add your new features and breaking changes to the release notes by opening PRs against the `release-notes-v0.115.1` branch. ## TODO - [ ] PRs that need to land before the release, e.g. [deprecations] or [removals] - [ ] add the full changelog - [ ] categorize each PR - [ ] write all the sections and complete all the `TODO`s [deprecations]: https://github.com/nushell/nushell/labels/deprecation [removals]: https://github.com/nushell/nushell/pulls?q=is%3Apr+is%3Aopen+label%3Aremoval-after-deprecation --- blog/2026-08-23-nushell_v0_115_1.md | 204 ++++++++++++++++++++++++++++ 1 file changed, 204 insertions(+) create mode 100644 blog/2026-08-23-nushell_v0_115_1.md diff --git a/blog/2026-08-23-nushell_v0_115_1.md b/blog/2026-08-23-nushell_v0_115_1.md new file mode 100644 index 00000000000..e6af8bc49ca --- /dev/null +++ b/blog/2026-08-23-nushell_v0_115_1.md @@ -0,0 +1,204 @@ +--- +title: Nushell 0.115.1 +author: The Nu Authors +author_site: https://www.nushell.sh/blog +author_image: https://www.nushell.sh/blog/images/nu_logo.png +excerpt: Today, we're releasing version 0.115.1 of Nu. This release adds... +--- + + + + + +# Nushell 0.115.1 + + + +Today, we're releasing version 0.115.1 of Nu. This release adds... + +# Where to get it + +Nu 0.115.1 is available as [pre-built binaries](https://github.com/nushell/nushell/releases/tag/0.115.1) or from [crates.io](https://crates.io/crates/nu). If you have Rust installed you can install it using `cargo install nu`. + +As part of this release, we also publish a set of optional [plugins](https://www.nushell.sh/book/plugins.html) you can install and use with Nushell. + +# Table of contents + + + +# Highlights and themes of this release + + + + +# Changes + +## Other changes + +### Add `background-completions` opt-out + +Added the `background-completions` experimental option (enabled by default). Disabling it makes completions block the line editor again, which lets custom completers drive interactive child processes like fzf: + +```nushell +nu --experimental-options '[background-completions=false]' +``` + + +## Bug fixes + +### Semver (and other custom) comparisons work in boolean expressions + +Comparing two semver values already returned a bool at runtime, but the parser treated that result as a `semver`. Combining it with `or` / `and`, binding it with `let`, or passing it to a `bool` parameter failed. + +Those now work: + +```nu +# missing or out of date +(which crush | is-empty) or ((crush --version | into semver) < ('1.0.0' | into semver)) + +let outdated = ('0.9.0' | into semver) < ('1.0.0' | into semver) +# $outdated is bool + +true or (('1.2.3' | into semver) in ('>=1.0.0' | into semver-range)) +``` + +The same applies to other custom values whose comparisons return a bool (for example matrix). Custom types that return another custom value from `<` / `==` (polars expressions) are unchanged. + +A raw custom value is still not a bool: `true or ('1.0.0' | into semver)` remains a type error. + +### Fix `$ans` after invalid operations on `$ans.last` + +`$ans` stays usable after a type error on `$ans.last` + +Invalid operations on `$ans.last` that embed type errors as values (for example `$ans.last | str length` on a table) no longer replace `$ans.last` or break later `$ans` display. + +This mainly showed up with `table --expand` as the `display_output` hook. + +```nu +$env.config.max_last_result_size = 1mb + +ls +# table of files + +$ans.last | str length +# Error: nu::shell::only_supports_this_input_type +# (still printed — the command is invalid) + +$ans +# record with the original ls table in `.last` — no longer reprints the type error + +$ans.last +# still the ls table +``` + +`$ans.exit_code`, `$ans.duration`, and `$ans.command` still update for the failed line. Results that mix real values and errors still replace `$ans.last`. Top-level `table --expand` on a list of errors still shows the original diagnostic. + +### Fix `update` closures on lazy SQLite tables + +`update` with a closure now works on a table taken from an opened SQLite database. `open foo.db | get my_table` is a lazy query; it already printed as a table, but `update col { ... }` reported a missing column instead of transforming each row. + +```nushell +[{ key: test, created: 1787132290545485211, expiry: 1787139010545500670, value: [7, 2, 128] }] +| into sqlite --table-name std_cache_store test.db + +open test.db | get std_cache_store | update expiry { into datetime } +# table with `expiry` as datetime +``` + +```nushell +open sample.db | get ints | update z { default 0 | $in + 1 } +# each `z` value is incremented +``` + +### Fix `$env.config.keybindings` merging for shared names + +Fixed an issue where two keybindings sharing a name on different keys silently dropped one of them (broke atuin's ctrl-r). +Nushell now warns once when keybindings share a name, matches mode spellings like `emacs` and `[emacs]` when merging, and `$env.config.keybindings = []` clears the list again. + +### Fix completions for `cd` and custom completers + +Fixed completions for empty directory-typed arguments such as `cd ` so they suggest directories instead of all paths. + +Custom completers that error, return no result, or try to run interactive input commands now gracefully fall back to file completions instead of leaving the completion list empty or racing the line editor for terminal input. + +`commandline complete` now includes a `type: null` field for completion items that do not have a more specific type. + +### Add `HelixChangeMode` keybinding support + +Keybindings can now switch helix modes with `{ send: HelixChangeMode, mode: normal }`, taking `normal`, `insert` or `select`. +An `until` list covers vi and helix in one binding, since a mode event is inapplicable in the other editor's state machine: + +```nu +$env.config.keybindings ++= [ + { + name: leave_insert_mode + modifier: control + keycode: char_g + mode: [vi_insert helix_insert] + event: { until: [ + { send: ViChangeMode, mode: normal } + { send: HelixChangeMode, mode: normal } + ] } + } +] + +### Interactive pickers in completions + +Tab completion can run an interactive picker from `$env.config.completions.external.completer` (and from custom `@comp` / `@complete` closures). Closures such as fzf or `input list` take the TTY while the line editor waits. Completers that only print a list should still return quickly. + +After `input list` (or a similar picker) returns from a completion or a custom menu, the prompt keeps raw mode. Backspace and other editing keys work again. + +Subprocesses spawned from a background completion thread stay detached from the terminal even when their stdin is a pipe, so they cannot steal the TTY from the line editor. + +### Tab waits for the external completer + +When `$env.config.completions.external.completer` is set, Tab on an external command waits for that closure before the line editor continues. That lets a picker such as fzf or `input list` take the terminal. Completers that only print a list (for example Carapace) should return quickly; a slow closure freezes the prompt until it finishes. + +File and command-name completion still run in the background. Custom menu `source` closures were already synchronous. + +To make every Tab wait, not only user completers: + +```nushell +nu --experimental-options '[background-completions=false]' +``` +Results from the external completer and from `@comp` / `@complete` are not cached, so a picker runs again on the next Tab. + + + +# Notes for plugin developers + +# Hall of fame + +Thanks to all the contributors below for helping us solve issues, improve documentation, refactor code, and more! :pray: + +| author | change | link | +| --- | --- | --- | +| [@cptpiepmatz](https://github.com/cptpiepmatz) | Fix test by removing `printf` calls | [#18883](https://github.com/nushell/nushell/pull/18883) | + +# Full changelog + +| author | title | link | +| --- | --- | --- | +| [@app/dependabot](https://github.com/app/dependabot) | build(deps): bump hustcer/setup-nu from 3.26 to 3.27 | [#18857](https://github.com/nushell/nushell/pull/18857) | +| [@ayax79](https://github.com/ayax79) | Update h2 do to RUSTSEC-2026-0258 | [#18875](https://github.com/nushell/nushell/pull/18875) | +| [@cptpiepmatz](https://github.com/cptpiepmatz) | Bump patch version after release | [#18845](https://github.com/nushell/nushell/pull/18845) | +| [@cptpiepmatz](https://github.com/cptpiepmatz) | Fix test by removing `printf` calls | [#18883](https://github.com/nushell/nushell/pull/18883) | +| [@fdncred](https://github.com/fdncred) | allow boolean comparison with semver | [#18854](https://github.com/nushell/nushell/pull/18854) | +| [@fdncred](https://github.com/fdncred) | allow `$ans` to still work after invalid operation | [#18863](https://github.com/nushell/nushell/pull/18863) | +| [@fdncred](https://github.com/fdncred) | fix `update` to work better with custom values | [#18865](https://github.com/nushell/nushell/pull/18865) | +| [@fdncred](https://github.com/fdncred) | fix(completions): keep the REPL usable when a completer runs `fzf` or `input list` | [#18881](https://github.com/nushell/nushell/pull/18881) | +| [@kronberger-droid](https://github.com/kronberger-droid) | feat(completions): add a `background-completions` opt-out | [#18764](https://github.com/nushell/nushell/pull/18764) | +| [@kronberger-droid](https://github.com/kronberger-droid) | fix(config): merge keybindings by name and key instead of name alone | [#18870](https://github.com/nushell/nushell/pull/18870) | +| [@kronberger-droid](https://github.com/kronberger-droid) | chore(reedline): bump reedline to e692224 | [#18878](https://github.com/nushell/nushell/pull/18878) | +| [@philocalyst](https://github.com/philocalyst) | Completor Fixes | [#18868](https://github.com/nushell/nushell/pull/18868) | From 62bedacef1d7a15ef36810f36af2261d378e8ea0 Mon Sep 17 00:00:00 2001 From: Tim 'Piepmatz' Hesse Date: Sun, 23 Aug 2026 09:52:56 +0200 Subject: [PATCH 2/4] fix typos --- blog/2026-08-23-nushell_v0_115_1.md | 40 ++++++++++++++--------------- 1 file changed, 19 insertions(+), 21 deletions(-) diff --git a/blog/2026-08-23-nushell_v0_115_1.md b/blog/2026-08-23-nushell_v0_115_1.md index e6af8bc49ca..e7efd9e9b2d 100644 --- a/blog/2026-08-23-nushell_v0_115_1.md +++ b/blog/2026-08-23-nushell_v0_115_1.md @@ -54,7 +54,6 @@ Added the `background-completions` experimental option (enabled by default). Dis nu --experimental-options '[background-completions=false]' ``` - ## Bug fixes ### Semver (and other custom) comparisons work in boolean expressions @@ -139,7 +138,7 @@ Custom completers that error, return no result, or try to run interactive input Keybindings can now switch helix modes with `{ send: HelixChangeMode, mode: normal }`, taking `normal`, `insert` or `select`. An `until` list covers vi and helix in one binding, since a mode event is inapplicable in the other editor's state machine: -```nu +````nu $env.config.keybindings ++= [ { name: leave_insert_mode @@ -171,10 +170,9 @@ To make every Tab wait, not only user completers: ```nushell nu --experimental-options '[background-completions=false]' -``` -Results from the external completer and from `@comp` / `@complete` are not cached, so a picker runs again on the next Tab. - +```` +Results from the external completer and from `@comp` / `@complete` are not cached, so a picker runs again on the next Tab. # Notes for plugin developers @@ -182,23 +180,23 @@ Results from the external completer and from `@comp` / `@complete` are not cache Thanks to all the contributors below for helping us solve issues, improve documentation, refactor code, and more! :pray: -| author | change | link | -| --- | --- | --- | +| author | change | link | +| ---------------------------------------------- | ----------------------------------- | ------------------------------------------------------- | | [@cptpiepmatz](https://github.com/cptpiepmatz) | Fix test by removing `printf` calls | [#18883](https://github.com/nushell/nushell/pull/18883) | # Full changelog -| author | title | link | -| --- | --- | --- | -| [@app/dependabot](https://github.com/app/dependabot) | build(deps): bump hustcer/setup-nu from 3.26 to 3.27 | [#18857](https://github.com/nushell/nushell/pull/18857) | -| [@ayax79](https://github.com/ayax79) | Update h2 do to RUSTSEC-2026-0258 | [#18875](https://github.com/nushell/nushell/pull/18875) | -| [@cptpiepmatz](https://github.com/cptpiepmatz) | Bump patch version after release | [#18845](https://github.com/nushell/nushell/pull/18845) | -| [@cptpiepmatz](https://github.com/cptpiepmatz) | Fix test by removing `printf` calls | [#18883](https://github.com/nushell/nushell/pull/18883) | -| [@fdncred](https://github.com/fdncred) | allow boolean comparison with semver | [#18854](https://github.com/nushell/nushell/pull/18854) | -| [@fdncred](https://github.com/fdncred) | allow `$ans` to still work after invalid operation | [#18863](https://github.com/nushell/nushell/pull/18863) | -| [@fdncred](https://github.com/fdncred) | fix `update` to work better with custom values | [#18865](https://github.com/nushell/nushell/pull/18865) | -| [@fdncred](https://github.com/fdncred) | fix(completions): keep the REPL usable when a completer runs `fzf` or `input list` | [#18881](https://github.com/nushell/nushell/pull/18881) | -| [@kronberger-droid](https://github.com/kronberger-droid) | feat(completions): add a `background-completions` opt-out | [#18764](https://github.com/nushell/nushell/pull/18764) | -| [@kronberger-droid](https://github.com/kronberger-droid) | fix(config): merge keybindings by name and key instead of name alone | [#18870](https://github.com/nushell/nushell/pull/18870) | -| [@kronberger-droid](https://github.com/kronberger-droid) | chore(reedline): bump reedline to e692224 | [#18878](https://github.com/nushell/nushell/pull/18878) | -| [@philocalyst](https://github.com/philocalyst) | Completor Fixes | [#18868](https://github.com/nushell/nushell/pull/18868) | +| author | title | link | +| -------------------------------------------------------- | ---------------------------------------------------------------------------------- | ------------------------------------------------------- | +| [@app/dependabot](https://github.com/app/dependabot) | build(deps): bump hustcer/setup-nu from 3.26 to 3.27 | [#18857](https://github.com/nushell/nushell/pull/18857) | +| [@ayax79](https://github.com/ayax79) | Update h2 do to RUSTSEC-2026-0258 | [#18875](https://github.com/nushell/nushell/pull/18875) | +| [@cptpiepmatz](https://github.com/cptpiepmatz) | Bump patch version after release | [#18845](https://github.com/nushell/nushell/pull/18845) | +| [@cptpiepmatz](https://github.com/cptpiepmatz) | Fix test by removing `printf` calls | [#18883](https://github.com/nushell/nushell/pull/18883) | +| [@fdncred](https://github.com/fdncred) | allow boolean comparison with semver | [#18854](https://github.com/nushell/nushell/pull/18854) | +| [@fdncred](https://github.com/fdncred) | allow `$ans` to still work after invalid operation | [#18863](https://github.com/nushell/nushell/pull/18863) | +| [@fdncred](https://github.com/fdncred) | fix `update` to work better with custom values | [#18865](https://github.com/nushell/nushell/pull/18865) | +| [@fdncred](https://github.com/fdncred) | fix(completions): keep the REPL usable when a completer runs `fzf` or `input list` | [#18881](https://github.com/nushell/nushell/pull/18881) | +| [@kronberger-droid](https://github.com/kronberger-droid) | feat(completions): add a `background-completions` opt-out | [#18764](https://github.com/nushell/nushell/pull/18764) | +| [@kronberger-droid](https://github.com/kronberger-droid) | fix(config): merge keybindings by name and key instead of name alone | [#18870](https://github.com/nushell/nushell/pull/18870) | +| [@kronberger-droid](https://github.com/kronberger-droid) | chore(reedline): bump reedline to e692224 | [#18878](https://github.com/nushell/nushell/pull/18878) | +| [@philocalyst](https://github.com/philocalyst) | Completer Fixes | [#18868](https://github.com/nushell/nushell/pull/18868) | From b6ab1f8ef9c7226fa8143c4bb8f243aea1d4b94f Mon Sep 17 00:00:00 2001 From: Tim 'Piepmatz' Hesse Date: Sun, 23 Aug 2026 10:03:14 +0200 Subject: [PATCH 3/4] reorder some changelog entries --- blog/2026-08-23-nushell_v0_115_1.md | 95 +++++++++++++++-------------- 1 file changed, 48 insertions(+), 47 deletions(-) diff --git a/blog/2026-08-23-nushell_v0_115_1.md b/blog/2026-08-23-nushell_v0_115_1.md index e7efd9e9b2d..4d49f11c98d 100644 --- a/blog/2026-08-23-nushell_v0_115_1.md +++ b/blog/2026-08-23-nushell_v0_115_1.md @@ -44,7 +44,27 @@ As part of this release, we also publish a set of optional [plugins](https://www # Changes -## Other changes +## Additions + +### Add `HelixChangeMode` keybinding support + +Keybindings can now switch helix modes with `{ send: HelixChangeMode, mode: normal }`, taking `normal`, `insert` or `select`. +An `until` list covers vi and helix in one binding, since a mode event is inapplicable in the other editor's state machine: + +```nu +$env.config.keybindings ++= [ + { + name: leave_insert_mode + modifier: control + keycode: char_g + mode: [vi_insert helix_insert] + event: { until: [ + { send: ViChangeMode, mode: normal } + { send: HelixChangeMode, mode: normal } + ] } + } +] +``` ### Add `background-completions` opt-out @@ -54,15 +74,39 @@ Added the `background-completions` experimental option (enabled by default). Dis nu --experimental-options '[background-completions=false]' ``` +## Other changes + +### Interactive pickers in completions + +Tab completion can run an interactive picker from `$env.config.completions.external.completer` (and from custom `@comp` / `@complete` closures). Closures such as fzf or `input list` take the TTY while the line editor waits. Completers that only print a list should still return quickly. + +After `input list` (or a similar picker) returns from a completion or a custom menu, the prompt keeps raw mode. Backspace and other editing keys work again. + +Subprocesses spawned from a background completion thread stay detached from the terminal even when their stdin is a pipe, so they cannot steal the TTY from the line editor. + +### Tab waits for the external completer + +When `$env.config.completions.external.completer` is set, Tab on an external command waits for that closure before the line editor continues. That lets a picker such as fzf or `input list` take the terminal. Completers that only print a list (for example Carapace) should return quickly; a slow closure freezes the prompt until it finishes. + +File and command-name completion still run in the background. Custom menu `source` closures were already synchronous. + +To make every Tab wait, not only user completers: + +```nushell +nu --experimental-options '[background-completions=false]' +``` + +Results from the external completer and from `@comp` / `@complete` are not cached, so a picker runs again on the next Tab. + ## Bug fixes -### Semver (and other custom) comparisons work in boolean expressions +### Fixed semver (and other custom) comparisons not working in boolean expressions Comparing two semver values already returned a bool at runtime, but the parser treated that result as a `semver`. Combining it with `or` / `and`, binding it with `let`, or passing it to a `bool` parameter failed. Those now work: -```nu +```nushell # missing or out of date (which crush | is-empty) or ((crush --version | into semver) < ('1.0.0' | into semver)) @@ -84,7 +128,7 @@ Invalid operations on `$ans.last` that embed type errors as values (for example This mainly showed up with `table --expand` as the `display_output` hook. -```nu +```nushell :no-line-numbers $env.config.max_last_result_size = 1mb ls @@ -133,49 +177,6 @@ Custom completers that error, return no result, or try to run interactive input `commandline complete` now includes a `type: null` field for completion items that do not have a more specific type. -### Add `HelixChangeMode` keybinding support - -Keybindings can now switch helix modes with `{ send: HelixChangeMode, mode: normal }`, taking `normal`, `insert` or `select`. -An `until` list covers vi and helix in one binding, since a mode event is inapplicable in the other editor's state machine: - -````nu -$env.config.keybindings ++= [ - { - name: leave_insert_mode - modifier: control - keycode: char_g - mode: [vi_insert helix_insert] - event: { until: [ - { send: ViChangeMode, mode: normal } - { send: HelixChangeMode, mode: normal } - ] } - } -] - -### Interactive pickers in completions - -Tab completion can run an interactive picker from `$env.config.completions.external.completer` (and from custom `@comp` / `@complete` closures). Closures such as fzf or `input list` take the TTY while the line editor waits. Completers that only print a list should still return quickly. - -After `input list` (or a similar picker) returns from a completion or a custom menu, the prompt keeps raw mode. Backspace and other editing keys work again. - -Subprocesses spawned from a background completion thread stay detached from the terminal even when their stdin is a pipe, so they cannot steal the TTY from the line editor. - -### Tab waits for the external completer - -When `$env.config.completions.external.completer` is set, Tab on an external command waits for that closure before the line editor continues. That lets a picker such as fzf or `input list` take the terminal. Completers that only print a list (for example Carapace) should return quickly; a slow closure freezes the prompt until it finishes. - -File and command-name completion still run in the background. Custom menu `source` closures were already synchronous. - -To make every Tab wait, not only user completers: - -```nushell -nu --experimental-options '[background-completions=false]' -```` - -Results from the external completer and from `@comp` / `@complete` are not cached, so a picker runs again on the next Tab. - -# Notes for plugin developers - # Hall of fame Thanks to all the contributors below for helping us solve issues, improve documentation, refactor code, and more! :pray: From d7a908f3fa6b29d81aa51847b852c4abc479d638 Mon Sep 17 00:00:00 2001 From: Tim 'Piepmatz' Hesse Date: Sun, 23 Aug 2026 10:10:43 +0200 Subject: [PATCH 4/4] add excerpt --- blog/2026-08-23-nushell_v0_115_1.md | 26 ++------------------------ 1 file changed, 2 insertions(+), 24 deletions(-) diff --git a/blog/2026-08-23-nushell_v0_115_1.md b/blog/2026-08-23-nushell_v0_115_1.md index 4d49f11c98d..6b59aa20123 100644 --- a/blog/2026-08-23-nushell_v0_115_1.md +++ b/blog/2026-08-23-nushell_v0_115_1.md @@ -3,18 +3,12 @@ title: Nushell 0.115.1 author: The Nu Authors author_site: https://www.nushell.sh/blog author_image: https://www.nushell.sh/blog/images/nu_logo.png -excerpt: Today, we're releasing version 0.115.1 of Nu. This release adds... +excerpt: Today, we're releasing version 0.115.1 of Nu. This patch release improves completions, adds Helix keybinding support, and fixes issues with semver comparisons, `$ans`, SQLite table updates, and keybinding merging. --- - - - - # Nushell 0.115.1 - - -Today, we're releasing version 0.115.1 of Nu. This release adds... +Today, we're releasing version 0.115.1 of Nu. This patch release improves completions, adds Helix keybinding support, and fixes issues with semver comparisons, `$ans`, SQLite table updates, and keybinding merging. # Where to get it @@ -26,22 +20,6 @@ As part of this release, we also publish a set of optional [plugins](https://www -# Highlights and themes of this release - - - - # Changes ## Additions