Nushell 0.109.0
Today, we're releasing version 0.109.0 of Nu. This release adds the option to use regex in the explore command and a bunch of bug fixes and other small tweaks.
Where to get it
Nu 0.109.0 is available as pre-built binaries or from crates.io. 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 you can install and use with Nushell.
Table of contents
Changes [toc]
Additions [toc]
Add explore regex command [toc]
The new explore regex command is meant to provide a TUI for exploring regular expressions and visualizing the results in real time. You can pipe text into the command and that text becomes the "test string" that the regular expressions run on. You can also start it up without piping anything into it and manually type the "test string" and then the regex. You can use the tab key to switch between panes. The arrow keys work to navigate as we as the page up and page down keys, home, and end. 
Add name and description to the plugin list command [toc]
The plugin list command now adds an inline table containing the plugin commands names and descriptions.
> plugin list | select commands | table --expand --width 80
╭───┬──────────────────────────────────────────────────────────────────────────╮
│ # │ commands │
├───┼──────────────────────────────────────────────────────────────────────────┤
│ 0 │ ╭───┬────────────┬───────────────────────────────────────╮ │
│ │ │ # │ name │ description │ │
│ │ ├───┼────────────┼───────────────────────────────────────┤ │
│ │ │ 0 │ from eml │ Parse text as .eml and create record. │ │
│ │ │ 1 │ from ics │ Parse text as .ics and create table. │ │
│ │ │ 2 │ from ini │ Parse text as .ini and create table. │ │
│ │ │ 3 │ from plist │ Convert plist to Nushell values │ │
│ │ │ 4 │ from vcf │ Parse text as .vcf and create table. │ │
│ │ │ 5 │ to plist │ Convert Nu values into plist │ │
│ │ ╰───┴────────────┴───────────────────────────────────────╯ │
│ 1 │ ╭───┬────────────────────┬─────────────────────────────────────────────╮ │
│ │ │ # │ name │ description │ │
│ │ ├───┼────────────────────┼─────────────────────────────────────────────┤ │
│ │ │ 0 │ query │ Show all the query commands │ │
│ │ │ 1 │ query json │ execute json query on json file (open --raw │ │
│ │ │ │ │ <file> | query json 'query string') │ │
│ │ │ 2 │ query web │ execute selector query on html/web │ │
│ │ │ 3 │ query webpage-info │ uses the webpage crate to extract info from │ │
│ │ │ │ │ html: title, description, language, links, │ │
│ │ │ │ │ RSS feeds, Opengraph, Schema.org, and more │ │
│ │ │ 4 │ query xml │ Execute XPath 1.0 query on XML input │ │
│ │ ╰───┴────────────────────┴─────────────────────────────────────────────╯ │
╰───┴──────────────────────────────────────────────────────────────────────────╯Other additions [toc]
All
httpcommands now support connecting via Unix domain sockets using the--unix-socket(or-U) flag, enabling communication with local services like Docker daemon, systemd, and other IPC services. (#16907)str replacenow accepts a closure that computes the replacement value for each match (#16854)
Other changes [toc]
- add a
--dryflag tomktemp: Don't create a file and just return the path that would have been created. (#17039)
Bug fixes [toc]
Better errors for dynamic http commands [toc]
Defining an HTTP command dynamically using a string for the method used to cause an unclear, uncategorized error. It now produces a clear and specific error message instead.
> let method = "get"; http $method example.com
Error: nu::shell::error
× Invalid command construction
╭─[entry #5:1:26]
1 │ let method = "get"; http $method example.com
· ───┬───
· ╰── Using "get" dynamically is bad command construction
╰────
help: Prefer to use `http get` directlyAllow streaming to commands with union-typed pipeline input [toc]
Commands whose input signatures are declared with oneof now accept streams instead of erroring:
> def f []: [oneof<list> -> nothing] {}
> [] | each {} | f
Error: nu::shell::only_supports_this_input_type
× Input type not supported.
╭─[entry #2:1:6]
1 │ [] | each {} | f
· ──┬─ ┬
· │ ╰── only oneof<list<any>> input data is supported
· ╰── input type: list<any>
╰────
Switch split column to 0-index like other commands [toc]
Like detect columns or parse, split column now also uses 0-index for the default column names.
> 'a b c' | detect columns --no-headers
╭───┬─────────┬─────────┬─────────╮
│ # │ column0 │ column1 │ column2 │
├───┼─────────┼─────────┼─────────┤
│ 0 │ a │ b │ c │
╰───┴─────────┴─────────┴─────────╯
> 'a b c' | split column ' '
╭───┬─────────┬─────────┬─────────╮
│ # │ column1 │ column2 │ column3 │
├───┼─────────┼─────────┼─────────┤
│ 0 │ a │ b │ c │
╰───┴─────────┴─────────┴─────────╯Don't error on optional cellpaths [toc]
Now, when you specify an optional cellpath in update, it won't error if it is not present.
> {a: 1} | update b? 2
╭───┬───╮
│ a │ 1 │
╰───┴───╯Other fixes [toc]
Fixed the new operators
not-starts-withandnot-ends-withnot appearing inhelp operators(#16873)Fixed a bug in completion matcher where
foo "b<tab>doesn't match"bar baz". (#16869)Fixed a bug in flattening aliased external calls. (#16876)
Fixed a bug of wrong argument order when calling
$env.config.buffer_editorfromconfig nu. (#16877)Fixed an issue where plugins built without the
nu-protocol/sqlitefeature would fail to load if$env.config.history.file_formatwas set to"sqlite". (#16890)Fixed the output type of
version checkto berecordinstead ofstring. (#16893)Fixed a bug in aliased external command completion where
alias ea = ^$env.EDITOR /tmp/test.s; e<tab>gets empty result. (#16882)Fixes a regression that causes absolute paths to be required when opening files with the polars plugin. (#16900)
The
whichcommand now filters files found in$PATHto include only executables. (#16895)Fixed a regression of custom-completion for short flags without a long name. (#16967)
Fixed the "polars slice" command so that it will return a lazyframe output when given a lazyframe as input. Fixes #17065 (#17067)
Notes for plugin developers [toc]
Due to #16890, plugins no longer need to be built with the nu-protocol/sqlite feature.
Hall of fame [toc]
Thanks to all the contributors below for helping us solve issues, improve documentation, refactor code, and more! 🙏
| author | change | link |
|---|---|---|
| @Bahex | Use development version of reedline | #16878 |
| @blindFS | Ignore hover_on_external_command for the CI workflow | #16880 |
| @blindFS | Fixes the inconsistent parsing of inf/INF, NaN/nan | #16415 |
| @ysthakur | Bump Reedline to latest main | #16913 |
| @fdncred | Update reedline to latest commit b574286 | #16918 |
| @fdncred | Add ut mit license | #16921 |
| @ysthakur | Set HOME for test_config_path tests | #16914 |
| @WindSoilder | Update nu_plugin_formats README | #16939 |
| @KaiSforza | Allow setting the NU_COMMIT_HASH as an env variable | #16947 |
| @fdncred | Update uutils crates to 0.3.0 | #16950 |
| @pguerin3 | Update README.md to add windmill as a supported by utility | #16953 |
| @fdncred | Bump rust-toolchain to 1.89 | #16958 |
| @fdncred | Update reedline and crossterm | #16975 |
| @KaiSforza | Add nix flake to scripts/nix/ | #16848 |
| @sholderbach | Fix README mention of Nu support in 3rd party product | #16984 |
| @fdncred | Add winresource metadata to cargo.toml | #16985 |
| @sgvictorino | Fix comment typo in highlight_syntax | #16998 |
| @Tyarel8 | Highlighting invalid syntax | #17008 |
| @fdncred | Update uutils to 0.4.0 | #17009 |
| @cptpiepmatz | Use rustc as external instead of sleep for highlight test | #17022 |
| @fdncred | Update to latest reedline | #17023 |
| @mrdgo | Fix typo | #17035 |
| @KaiSforza | Don't add an empty column if there is only 1 column | #17013 |
Full changelog [toc]
| author | title | link |
|---|---|---|
| @AnandajithS | fix: Add error handling for rounding non finite numbers | #16934 |
| @Bahex | Use development version of reedline | #16878 |
| @Bahex | Escaping braces in pattern format | #16899 |
| @Bahex | More granular type widening and stricter type checking | #16912 |
| @Dorumin | --dry on mktemp | #17039 |
| @ItsHarper | Add --optional flag to std-rfc/iter only | #16886 |
| @Jan9103 | fix(into_sqlite): pass a span along | #17036 |
| @KaiSforza | Add nix flake to scripts/nix/ | #16848 |
| @KaiSforza | Allow setting the NU_COMMIT_HASH as an env variable | #16947 |
| @KaiSforza | nu-table: Don't add an empty column if there is only 1 column | #17013 |
| @KaiSforza | Add all LabeledError structure parts to error make | #17037 |
| @Tyarel8 | fix: add NotStartsWith and NotEndsWith operators to help | #16873 |
| @Tyarel8 | fix(version check): output type is record not string | #16893 |
| @Tyarel8 | feat(std/help): add code highlighting in descriptions | #16931 |
| @Tyarel8 | feat(group-by): add example on how to delete the original columns | #16933 |
| @Tyarel8 | fix(std/help): highlighting invalid syntax | #17008 |
| @Tyarel8 | feat(update): don't error on optional cellpaths | #17055 |
| @Tyarel8 | fix(split column): switch to 0-index like other commands | #17064 |
| @WindSoilder | Plugin: support custom completions in command flags | #16859 |
| @WindSoilder | make pipefail works with let | #16879 |
| @WindSoilder | update nu_plugin_formats README | #16939 |
| @WindSoilder | Plugin: add one parameter call: DynamicCompletionCall to get_dynamic_completion, and allow to return span. | #17017 |
| @WindSoilder | Add --strict flag to first and last command, to raise error on empty list. | #17066 |
| @app/dependabot | build(deps): bump crate-ci/typos from 1.37.1 to 1.38.1 | #16864 |
| @app/dependabot | build(deps): bump peter-evans/find-comment from 3 to 4 | #16865 |
| @app/dependabot | build(deps): bump peter-evans/create-or-update-comment from 4 to 5 | #16866 |
| @app/dependabot | build(deps): bump actions/upload-artifact from 4 to 5 | #16942 |
| @app/dependabot | build(deps): bump hustcer/milestone-action from 2 to 3 | #16943 |
| @app/dependabot | build(deps): bump crate-ci/typos from 1.38.1 to 1.39.0 | #16978 |
| @app/dependabot | build(deps): bump crate-ci/typos from 1.39.0 to 1.39.2 | #17043 |
| @atahabaki | str expand: two dots outside of curly braces should not be considered as range operator | #16924 |
| @ayax79 | Re-introduce nu_expand_path for polars open/save | #16900 |
| @ayax79 | Upgrade to polars 0.52 | #16979 |
| @ayax79 | Handling of ByteStream out and eval description changes | #16989 |
| @ayax79 | MCP: Evaluate tool description improvements | #17007 |
| @blackhat-hemsworth | adjusted polars / slice command to return lazy output on lazy input | #17067 |
| @blindFS | fix(parser): repeated parsing of module blocks | #16403 |
| @blindFS | refactor(parser): parse_value, move reserved keyword values check | #16415 |
| @blindFS | fix(completion): trim unmatched prefix/suffix quotes in the matcher | #16869 |
| @blindFS | fix: flattening aliased external call | #16876 |
| @blindFS | fix: wrong arg order of buffer_editor for config nu | #16877 |
| @blindFS | test(lsp): ignore hover_on_external_command for the CI workflow | #16880 |
| @blindFS | fix(completion): an edge case of aliased external head command | #16882 |
| @blindFS | fix: highlighting for aliased external calls | #16957 |
| @blindFS | fix(completion): a regression on flags without a long name | #16967 |
| @blindFS | fix(completion): path/directory/glob typed flag values get empty completion results | #17006 |
| @blindFS | fix(parser, completion): wrong span of export def/extern with attributes & snippet completion for attributable commands | #17025 |
| @blindFS | feat(completion): include already parsed module names in dotnu completion | #17026 |
| @blindFS | fix(completion): flag values with spaces & wrong position arg for custom completion without placeholder | #17044 |
| @blindFS | feat(completion): allow overriding half of the span in custom/external completer | #17049 |
| @cablehead | fix(mcp): merge parsed blocks to prevent closure panic | #16884 |
| @cablehead | feat(mcp): respect --login flag | #16885 |
| @cablehead | feat: add unix socket support to HTTP builtins | #16907 |
| @cablehead | feat: add -U short flag for --unix-socket to HTTP builtins | #16954 |
| @cablehead | feat: add closure parameter to metadata set | #16976 |
| @cablehead | fix(http): add tilde expansion for --unix-socket paths | #16977 |
| @cptpiepmatz | Bump to dev version 0.108.1 | #16871 |
| @cptpiepmatz | Make "sqlite" history file format known but invalid when compiled without sqlite | #16890 |
| @cptpiepmatz | Raise error if http method is defined dynamically | #16892 |
| @cptpiepmatz | Use native cert store on Android for rustls | #17019 |
| @cptpiepmatz | Use rustc as external instead of sleep for highlight test | #17022 |
| @cptpiepmatz | Improve DNS-related errors | #17030 |
| @fdncred | add explore regex command | #16910 |
| @fdncred | update reedline to latest commit b574286 | #16918 |
| @fdncred | add ut mit license | #16921 |
| @fdncred | update uutils crates to 0.3.0 | #16950 |
| @fdncred | bump rust-toolchain to 1.89 | #16958 |
| @fdncred | add name and description to the plugin list command | #16965 |
| @fdncred | update reedline and crossterm | #16975 |
| @fdncred | add winresource metadata to cargo.toml | #16985 |
| @fdncred | update uutils to 0.4.0 | #17009 |
| @fdncred | update to latest reedline | #17023 |
| @fdncred | add the rfind ability to the find command | #17045 |
| @fdncred | first and last return nothing on empty results | #17054 |
| @hustcer | Fix memory leaks in REPL | #16348 |
| @mrdgo | fix typo | #17035 |
| @nome | Implement "str replace" with closure defined relacements | #16854 |
| @pguerin3 | Update README.md to add windmill as a supported by utility | #16953 |
| @praveenbhamidipati | fix: less LICENSE fetch url | #17002 |
| @sgvictorino | fix comment typo in highlight_syntax | #16998 |
| @sgvictorino | allow streaming to commands with union-typed pipeline input | #17048 |
| @sholderbach | Bump sysinfo to latest 0.37.2 | #16983 |
| @sholderbach | Fix README mention of Nu support in 3rd party product | #16984 |
| @smaximov | Fix ansi strip ignoring the first provided cell path | #16906 |
| @taearls | Improve error message when plugin add fails because config directory doesn't exist (Issue #10754) | #16999 |
| @xolra0d | which without application param now lists only executables | #16895 |
| @ysthakur | Set match_indices for fuzzy-matched suggestions | #15887 |
| @ysthakur | Allow setting span in custom/extern completers | #15888 |
| @ysthakur | Bump Reedline to latest main | #16913 |
| @ysthakur | test: Set HOME for test_config_path tests | #16914 |