Nushell
Get Nu!
Getting Started
  • The Nushell Book
  • Command Reference
  • Cookbook
  • Language Reference Guide
  • Contributing Guide
Blog
  • English
  • 中文
  • Deutsch
  • Français
  • Español
  • 日本語
  • Português do Brasil
  • Русский язык
  • 한국어
GitHub
Get Nu!
Getting Started
  • The Nushell Book
  • Command Reference
  • Cookbook
  • Language Reference Guide
  • Contributing Guide
Blog
  • English
  • 中文
  • Deutsch
  • Français
  • Español
  • 日本語
  • Português do Brasil
  • Русский язык
  • 한국어
GitHub

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
    • Additions
      • Add explore regex command
      • Add name and description to the plugin list command
      • Other additions
    • Other changes
    • Bug fixes
      • Better errors for dynamic http commands
      • Allow streaming to commands with union-typed pipeline input
      • Fix(split column): switch to 0-index like other commands
      • Don't error on optional cellpaths
      • Other fixes
  • Notes for plugin developers
  • Hall of fame
  • Full changelog

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. explore-regex

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 http commands 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 replace now accepts a closure that computes the replacement value for each match (#16854)

Other changes [toc]

  • add a --dry flag to mktemp: 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` directly

Allow 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-with and not-ends-with not appearing in help 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_editor from config nu. (#16877)

  • Fixed an issue where plugins built without the nu-protocol/sqlite feature would fail to load if $env.config.history.file_format was set to "sqlite". (#16890)

  • Fixed the output type of version check to be record instead of string. (#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 which command now filters files found in $PATH to 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! 🙏

authorchangelink
@BahexUse development version of reedline#16878
@blindFSIgnore hover_on_external_command for the CI workflow#16880
@blindFSFixes the inconsistent parsing of inf/INF, NaN/nan#16415
@ysthakurBump Reedline to latest main#16913
@fdncredUpdate reedline to latest commit b574286#16918
@fdncredAdd ut mit license#16921
@ysthakurSet HOME for test_config_path tests#16914
@WindSoilderUpdate nu_plugin_formats README#16939
@KaiSforzaAllow setting the NU_COMMIT_HASH as an env variable#16947
@fdncredUpdate uutils crates to 0.3.0#16950
@pguerin3Update README.md to add windmill as a supported by utility#16953
@fdncredBump rust-toolchain to 1.89#16958
@fdncredUpdate reedline and crossterm#16975
@KaiSforzaAdd nix flake to scripts/nix/#16848
@sholderbachFix README mention of Nu support in 3rd party product#16984
@fdncredAdd winresource metadata to cargo.toml#16985
@sgvictorinoFix comment typo in highlight_syntax#16998
@Tyarel8Highlighting invalid syntax#17008
@fdncredUpdate uutils to 0.4.0#17009
@cptpiepmatzUse rustc as external instead of sleep for highlight test#17022
@fdncredUpdate to latest reedline#17023
@mrdgoFix typo#17035
@KaiSforzaDon't add an empty column if there is only 1 column#17013

Full changelog [toc]

authortitlelink
@AnandajithSfix: Add error handling for rounding non finite numbers#16934
@BahexUse development version of reedline#16878
@BahexEscaping braces in pattern format#16899
@BahexMore granular type widening and stricter type checking#16912
@Dorumin--dry on mktemp#17039
@ItsHarperAdd --optional flag to std-rfc/iter only#16886
@Jan9103fix(into_sqlite): pass a span along#17036
@KaiSforzaAdd nix flake to scripts/nix/#16848
@KaiSforzaAllow setting the NU_COMMIT_HASH as an env variable#16947
@KaiSforzanu-table: Don't add an empty column if there is only 1 column#17013
@KaiSforzaAdd all LabeledError structure parts to error make#17037
@Tyarel8fix: add NotStartsWith and NotEndsWith operators to help#16873
@Tyarel8fix(version check): output type is record not string#16893
@Tyarel8feat(std/help): add code highlighting in descriptions#16931
@Tyarel8feat(group-by): add example on how to delete the original columns#16933
@Tyarel8fix(std/help): highlighting invalid syntax#17008
@Tyarel8feat(update): don't error on optional cellpaths#17055
@Tyarel8fix(split column): switch to 0-index like other commands#17064
@WindSoilderPlugin: support custom completions in command flags#16859
@WindSoildermake pipefail works with let#16879
@WindSoilderupdate nu_plugin_formats README#16939
@WindSoilderPlugin: add one parameter call: DynamicCompletionCall to get_dynamic_completion, and allow to return span.#17017
@WindSoilderAdd --strict flag to first and last command, to raise error on empty list.#17066
@app/dependabotbuild(deps): bump crate-ci/typos from 1.37.1 to 1.38.1#16864
@app/dependabotbuild(deps): bump peter-evans/find-comment from 3 to 4#16865
@app/dependabotbuild(deps): bump peter-evans/create-or-update-comment from 4 to 5#16866
@app/dependabotbuild(deps): bump actions/upload-artifact from 4 to 5#16942
@app/dependabotbuild(deps): bump hustcer/milestone-action from 2 to 3#16943
@app/dependabotbuild(deps): bump crate-ci/typos from 1.38.1 to 1.39.0#16978
@app/dependabotbuild(deps): bump crate-ci/typos from 1.39.0 to 1.39.2#17043
@atahabakistr expand: two dots outside of curly braces should not be considered as range operator#16924
@ayax79Re-introduce nu_expand_path for polars open/save#16900
@ayax79Upgrade to polars 0.52#16979
@ayax79Handling of ByteStream out and eval description changes#16989
@ayax79MCP: Evaluate tool description improvements#17007
@blackhat-hemsworthadjusted polars / slice command to return lazy output on lazy input#17067
@blindFSfix(parser): repeated parsing of module blocks#16403
@blindFSrefactor(parser): parse_value, move reserved keyword values check#16415
@blindFSfix(completion): trim unmatched prefix/suffix quotes in the matcher#16869
@blindFSfix: flattening aliased external call#16876
@blindFSfix: wrong arg order of buffer_editor for config nu#16877
@blindFStest(lsp): ignore hover_on_external_command for the CI workflow#16880
@blindFSfix(completion): an edge case of aliased external head command#16882
@blindFSfix: highlighting for aliased external calls#16957
@blindFSfix(completion): a regression on flags without a long name#16967
@blindFSfix(completion): path/directory/glob typed flag values get empty completion results#17006
@blindFSfix(parser, completion): wrong span of export def/extern with attributes & snippet completion for attributable commands#17025
@blindFSfeat(completion): include already parsed module names in dotnu completion#17026
@blindFSfix(completion): flag values with spaces & wrong position arg for custom completion without placeholder#17044
@blindFSfeat(completion): allow overriding half of the span in custom/external completer#17049
@cableheadfix(mcp): merge parsed blocks to prevent closure panic#16884
@cableheadfeat(mcp): respect --login flag#16885
@cableheadfeat: add unix socket support to HTTP builtins#16907
@cableheadfeat: add -U short flag for --unix-socket to HTTP builtins#16954
@cableheadfeat: add closure parameter to metadata set#16976
@cableheadfix(http): add tilde expansion for --unix-socket paths#16977
@cptpiepmatzBump to dev version 0.108.1#16871
@cptpiepmatzMake "sqlite" history file format known but invalid when compiled without sqlite#16890
@cptpiepmatzRaise error if http method is defined dynamically#16892
@cptpiepmatzUse native cert store on Android for rustls#17019
@cptpiepmatzUse rustc as external instead of sleep for highlight test#17022
@cptpiepmatzImprove DNS-related errors#17030
@fdncredadd explore regex command#16910
@fdncredupdate reedline to latest commit b574286#16918
@fdncredadd ut mit license#16921
@fdncredupdate uutils crates to 0.3.0#16950
@fdncredbump rust-toolchain to 1.89#16958
@fdncredadd name and description to the plugin list command#16965
@fdncredupdate reedline and crossterm#16975
@fdncredadd winresource metadata to cargo.toml#16985
@fdncredupdate uutils to 0.4.0#17009
@fdncredupdate to latest reedline#17023
@fdncredadd the rfind ability to the find command#17045
@fdncredfirst and last return nothing on empty results#17054
@hustcerFix memory leaks in REPL#16348
@mrdgofix typo#17035
@nomeImplement "str replace" with closure defined relacements#16854
@pguerin3Update README.md to add windmill as a supported by utility#16953
@praveenbhamidipatifix: less LICENSE fetch url#17002
@sgvictorinofix comment typo in highlight_syntax#16998
@sgvictorinoallow streaming to commands with union-typed pipeline input#17048
@sholderbachBump sysinfo to latest 0.37.2#16983
@sholderbachFix README mention of Nu support in 3rd party product#16984
@smaximovFix ansi strip ignoring the first provided cell path#16906
@taearlsImprove error message when plugin add fails because config directory doesn't exist (Issue #10754)#16999
@xolra0dwhich without application param now lists only executables#16895
@ysthakurSet match_indices for fuzzy-matched suggestions#15887
@ysthakurAllow setting span in custom/extern completers#15888
@ysthakurBump Reedline to latest main#16913
@ysthakurtest: Set HOME for test_config_path tests#16914
Edit this page on GitHub
Contributors: Piepmatz, Jan Klass