Bare word improvements (#8066)

# Description

This does two fixes for bare words:

* It changes completions for paths to wrap a path with backticks if it
starts with a number. This helps bare words that start with numbers be
separate from unit values
* It allows bare words wrapped with backticks to be the name of a
command. Backtick values in command positions are no longer treated as
strings

# User-Facing Changes

_(List of all changes that impact the user experience here. This helps
us keep track of breaking changes.)_

# Tests + Formatting

Don't forget to add tests that cover your changes.

Make sure you've run and fixed any issues with these commands:

- `cargo fmt --all -- --check` to check standard code formatting (`cargo
fmt --all` applies these changes)
- `cargo clippy --workspace -- -D warnings -D clippy::unwrap_used -A
clippy::needless_collect` to check that you're using the standard code
style
- `cargo test --workspace` to check that all tests pass

# After Submitting

If your PR had any user-facing changes, update [the
documentation](https://github.com/nushell/nushell.github.io) after the
PR is merged, if necessary. This will help us keep the docs up to date.
This commit is contained in:
JT 2023-02-16 15:30:56 +13:00 committed by GitHub
parent cba3e100a0
commit ade7bde813
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 26 additions and 17 deletions

View File

@ -141,6 +141,16 @@ pub fn file_path_completion(
|| path.contains('#') || path.contains('#')
|| path.contains('(') || path.contains('(')
|| path.contains(')') || path.contains(')')
|| path.starts_with('0')
|| path.starts_with('1')
|| path.starts_with('2')
|| path.starts_with('3')
|| path.starts_with('4')
|| path.starts_with('5')
|| path.starts_with('6')
|| path.starts_with('7')
|| path.starts_with('8')
|| path.starts_with('9')
{ {
path = format!("`{path}`"); path = format!("`{path}`");
} }

View File

@ -80,7 +80,7 @@ fn ignore_program_errors_works_for_external_with_semicolon() {
let actual = nu!( let actual = nu!(
cwd: ".", pipeline( cwd: ".", pipeline(
r#" r#"
do -p { nu -c 'exit 1' }; `text` do -p { nu -c 'exit 1' }; "text"
"# "#
)); ));

View File

@ -141,7 +141,7 @@ fn save_string_and_stream_as_raw() {
nu!( nu!(
cwd: dirs.root(), cwd: dirs.root(),
r#" r#"
`<!DOCTYPE html><html><body><a href='http://example.org/'>Example</a></body></html>` | save save_test_7/temp.html "<!DOCTYPE html><html><body><a href='http://example.org/'>Example</a></body></html>" | save save_test_7/temp.html
"#, "#,
); );
let actual = file_contents(expected_file); let actual = file_contents(expected_file);

View File

@ -76,15 +76,7 @@ pub fn is_math_expression_like(
let b = bytes[0]; let b = bytes[0];
if b == b'(' if b == b'(' || b == b'{' || b == b'[' || b == b'$' || b == b'"' || b == b'\'' || b == b'-' {
|| b == b'{'
|| b == b'['
|| b == b'$'
|| b == b'"'
|| b == b'\''
|| b == b'`'
|| b == b'-'
{
return true; return true;
} }

View File

@ -494,7 +494,7 @@ fn remove_overlay_discard_alias() {
fn remove_overlay_discard_env() { fn remove_overlay_discard_env() {
let inp = &[ let inp = &[
r#"overlay use samples/spam.nu"#, r#"overlay use samples/spam.nu"#,
r#"let-env BAGR = `bagr`"#, r#"let-env BAGR = 'bagr'"#,
r#"overlay hide spam"#, r#"overlay hide spam"#,
r#"$env.BAGR"#, r#"$env.BAGR"#,
]; ];
@ -526,7 +526,7 @@ fn remove_overlay_keep_decl() {
fn remove_overlay_keep_alias() { fn remove_overlay_keep_alias() {
let inp = &[ let inp = &[
r#"overlay use samples/spam.nu"#, r#"overlay use samples/spam.nu"#,
r#"alias bagr = `bagr`"#, r#"alias bagr = 'bagr'"#,
r#"overlay hide --keep-custom spam"#, r#"overlay hide --keep-custom spam"#,
r#"bagr"#, r#"bagr"#,
]; ];
@ -542,7 +542,7 @@ fn remove_overlay_keep_alias() {
fn remove_overlay_dont_keep_env() { fn remove_overlay_dont_keep_env() {
let inp = &[ let inp = &[
r#"overlay use samples/spam.nu"#, r#"overlay use samples/spam.nu"#,
r#"let-env BAGR = `bagr`"#, r#"let-env BAGR = 'bagr'"#,
r#"overlay hide --keep-custom spam"#, r#"overlay hide --keep-custom spam"#,
r#"$env.BAGR"#, r#"$env.BAGR"#,
]; ];
@ -596,7 +596,7 @@ fn remove_overlay_dont_keep_overwritten_alias() {
fn remove_overlay_dont_keep_overwritten_env() { fn remove_overlay_dont_keep_overwritten_env() {
let inp = &[ let inp = &[
r#"overlay use samples/spam.nu"#, r#"overlay use samples/spam.nu"#,
r#"let-env BAZ = `bagr`"#, r#"let-env BAZ = 'bagr'"#,
r#"overlay hide --keep-custom spam"#, r#"overlay hide --keep-custom spam"#,
r#"$env.BAZ"#, r#"$env.BAZ"#,
]; ];
@ -630,7 +630,7 @@ fn remove_overlay_keep_decl_in_latest_overlay() {
fn remove_overlay_keep_alias_in_latest_overlay() { fn remove_overlay_keep_alias_in_latest_overlay() {
let inp = &[ let inp = &[
r#"overlay use samples/spam.nu"#, r#"overlay use samples/spam.nu"#,
r#"alias bagr = `bagr`"#, r#"alias bagr = 'bagr'"#,
r#"module eggs { }"#, r#"module eggs { }"#,
r#"overlay use eggs"#, r#"overlay use eggs"#,
r#"overlay hide --keep-custom spam"#, r#"overlay hide --keep-custom spam"#,
@ -648,7 +648,7 @@ fn remove_overlay_keep_alias_in_latest_overlay() {
fn remove_overlay_dont_keep_env_in_latest_overlay() { fn remove_overlay_dont_keep_env_in_latest_overlay() {
let inp = &[ let inp = &[
r#"overlay use samples/spam.nu"#, r#"overlay use samples/spam.nu"#,
r#"let-env BAGR = `bagr`"#, r#"let-env BAGR = 'bagr'"#,
r#"module eggs { }"#, r#"module eggs { }"#,
r#"overlay use eggs"#, r#"overlay use eggs"#,
r#"overlay hide --keep-custom spam"#, r#"overlay hide --keep-custom spam"#,

View File

@ -1258,6 +1258,13 @@ mod parse {
assert!(actual.err.contains("extra positional argument"),); assert!(actual.err.contains("extra positional argument"),);
} }
#[test]
fn ensure_backticks_are_bareword_command() {
let actual = nu!(cwd: ".", "`8abc123`");
assert!(actual.err.contains("was not found"),);
}
} }
mod tilde_expansion { mod tilde_expansion {