nushell/crates
Devyn Cairns bdc32345bd
Move most of the peculiar argument handling for external calls into the parser (#13089)
# Description

We've had a lot of different issues and PRs related to arg handling with
externals since the rewrite of `run-external` in #12921:

- #12950
- #12955
- #13000
- #13001
- #13021
- #13027
- #13028
- #13073

Many of these are caused by the argument handling of external calls and
`run-external` being very special and involving the parser handing
quoted strings over to `run-external` so that it knows whether to expand
tildes and globs and so on. This is really unusual and also makes it
harder to use `run-external`, and also harder to understand it (and
probably is part of the reason why it was rewritten in the first place).

This PR moves a lot more of that work over to the parser, so that by the
time `run-external` gets it, it's dealing with much more normal Nushell
values. In particular:

- Unquoted strings are handled as globs with no expand
- The unescaped-but-quoted handling of strings was removed, and the
parser constructs normal looking strings instead, removing internal
quotes so that `run-external` doesn't have to do it
- Bare word interpolation is now supported and expansion is done in this
case
- Expressions typed as `Glob` containing `Expr::StringInterpolation` now
produce `Value::Glob` instead, with the quoted status from the expr
passed through so we know if it was a bare word
- Bare word interpolation for values typed as `glob` now possible, but
not implemented
- Because expansion is now triggered by `Value::Glob(_, false)` instead
of looking at the expr, externals now support glob types

# User-Facing Changes

- Bare word interpolation works for external command options, and
otherwise embedded in other strings:
  ```nushell
  ^echo --foo=(2 + 2) # prints --foo=4
  ^echo -foo=$"(2 + 2)" # prints -foo=4
  ^echo foo="(2 + 2)" # prints (no interpolation!) foo=(2 + 2)
  ^echo foo,(2 + 2),bar # prints foo,4,bar
  ```

- Bare word interpolation expands for external command head/args:
  ```nushell
  let name = "exa"
  ~/.cargo/bin/($name) # this works, and expands the tilde
  ^$"~/.cargo/bin/($name)" # this doesn't expand the tilde
  ^echo ~/($name)/* # this glob is expanded
  ^echo $"~/($name)/*" # this isn't expanded
  ```

- Ndots are now supported for the head of an external command
(`^.../foo` works)

- Glob values are now supported for head/args of an external command,
and expanded appropriately:
  ```nushell
  ^("~/.cargo/bin/exa" | into glob) # the tilde is expanded
  ^echo ("*.txt" | into glob) # this glob is expanded
  ```

- `run-external` now works more like any other command, without
expecting a special call convention
  for its args:
  ```nushell
  run-external echo "'foo'"
  # before PR: 'foo'
  # after PR:  foo
  run-external echo "*.txt"
  # before PR: (glob is expanded)
  # after PR:  *.txt
  ```

# Tests + Formatting
Lots of tests added and cleaned up. Some tests that weren't active on
Windows changed to use `nu --testbin cococo` so that they can work.
Added a test for Linux only to make sure tilde expansion of commands
works, because changing `HOME` there causes `~` to reliably change.

- 🟢 `toolkit fmt`
- 🟢 `toolkit clippy`
- 🟢 `toolkit test`
- 🟢 `toolkit test stdlib`

# After Submitting
- [ ] release notes: make sure to mention the new syntaxes that are
supported
2024-06-19 21:00:03 -07:00
..
nu-cli Move most of the peculiar argument handling for external calls into the parser (#13089) 2024-06-19 21:00:03 -07:00
nu-cmd-base Improves commands that support range input (#13113) 2024-06-18 07:19:13 -05:00
nu-cmd-extra Make which-support feature non-optional (#13125) 2024-06-12 20:04:12 -05:00
nu-cmd-lang update try command's help (#13173) 2024-06-18 13:48:06 -05:00
nu-cmd-plugin bump version to 0.94.3 (#13055) 2024-06-05 06:52:40 +08:00
nu-color-config Move most of the peculiar argument handling for external calls into the parser (#13089) 2024-06-19 21:00:03 -07:00
nu-command Move most of the peculiar argument handling for external calls into the parser (#13089) 2024-06-19 21:00:03 -07:00
nu-derive-value Add derive macros for FromValue and IntoValue to ease the use of Values in Rust code (#13031) 2024-06-17 16:05:11 -07:00
nu-engine Table help rendering (#13182) 2024-06-19 20:12:25 -05:00
nu-explore Improve performance of explore - 1 (#13116) 2024-06-12 18:35:04 -07:00
nu-glob bump version to 0.94.3 (#13055) 2024-06-05 06:52:40 +08:00
nu-json bump version to 0.94.3 (#13055) 2024-06-05 06:52:40 +08:00
nu-lsp bump version to 0.94.3 (#13055) 2024-06-05 06:52:40 +08:00
nu-parser Move most of the peculiar argument handling for external calls into the parser (#13089) 2024-06-19 21:00:03 -07:00
nu-path add $nu.data-dir for completions and $nu.cache-dir for other uses (#13122) 2024-06-11 15:10:31 -04:00
nu-plugin bump version to 0.94.3 (#13055) 2024-06-05 06:52:40 +08:00
nu-plugin-core bump version to 0.94.3 (#13055) 2024-06-05 06:52:40 +08:00
nu-plugin-engine bump version to 0.94.3 (#13055) 2024-06-05 06:52:40 +08:00
nu-plugin-protocol bump version to 0.94.3 (#13055) 2024-06-05 06:52:40 +08:00
nu-plugin-test-support bump version to 0.94.3 (#13055) 2024-06-05 06:52:40 +08:00
nu-pretty-hex bump version to 0.94.3 (#13055) 2024-06-05 06:52:40 +08:00
nu-protocol Move most of the peculiar argument handling for external calls into the parser (#13089) 2024-06-19 21:00:03 -07:00
nu-std Return an empty list when no std help --find results are found (#13160) 2024-06-15 12:27:55 -05:00
nu-system bump version to 0.94.3 (#13055) 2024-06-05 06:52:40 +08:00
nu-table Improve performance of explore - 1 (#13116) 2024-06-12 18:35:04 -07:00
nu-term-grid bump version to 0.94.3 (#13055) 2024-06-05 06:52:40 +08:00
nu-test-support Move most of the peculiar argument handling for external calls into the parser (#13089) 2024-06-19 21:00:03 -07:00
nu-utils add $nu.data-dir for completions and $nu.cache-dir for other uses (#13122) 2024-06-11 15:10:31 -04:00
nu_plugin_custom_values Add derive macros for FromValue and IntoValue to ease the use of Values in Rust code (#13031) 2024-06-17 16:05:11 -07:00
nu_plugin_example bump version to 0.94.3 (#13055) 2024-06-05 06:52:40 +08:00
nu_plugin_formats bump version to 0.94.3 (#13055) 2024-06-05 06:52:40 +08:00
nu_plugin_gstat Bump git2 from 0.18.3 to 0.19.0 (#13179) 2024-06-19 01:09:25 +00:00
nu_plugin_inc bump version to 0.94.3 (#13055) 2024-06-05 06:52:40 +08:00
nu_plugin_nu_example bump version to 0.94.3 (#13055) 2024-06-05 06:52:40 +08:00
nu_plugin_polars Allow the addition of an index column to be optional (#13097) 2024-06-10 10:45:25 +08:00
nu_plugin_python bump version to 0.94.3 (#13055) 2024-06-05 06:52:40 +08:00
nu_plugin_query Make query xml return nodes in document order (#13047) 2024-06-05 09:47:36 +08:00
nu_plugin_stress_internals bump version to 0.94.3 (#13055) 2024-06-05 06:52:40 +08:00
nuon Move most of the peculiar argument handling for external calls into the parser (#13089) 2024-06-19 21:00:03 -07:00
README.md Remove old nushell/merge engine-q 2022-02-07 14:54:06 -05:00

Nushell core libraries and plugins

These sub-crates form both the foundation for Nu and a set of plugins which extend Nu with additional functionality.

Foundational libraries are split into two kinds of crates:

  • Core crates - those crates that work together to build the Nushell language engine
  • Support crates - a set of crates that support the engine with additional features like JSON support, ANSI support, and more.

Plugins are likewise also split into two types:

  • Core plugins - plugins that provide part of the default experience of Nu, including access to the system properties, processes, and web-connectivity features.
  • Extra plugins - these plugins run a wide range of different capabilities like working with different file types, charting, viewing binary data, and more.