Skip to content

Commit d4b9a32

Browse files
committed
fix(completion): invalid prefix for external path argument with spaces
1 parent cde8a62 commit d4b9a32

File tree

4 files changed

+35
-4
lines changed

4 files changed

+35
-4
lines changed

crates/nu-cli/src/completions/completer.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -466,6 +466,14 @@ impl NuCompleter {
466466
return suggestions;
467467
}
468468
}
469+
// external path arguments with spaces, issue #15790
470+
if suggestions.is_empty() {
471+
let (new_span, prefix) =
472+
strip_placeholder_if_any(working_set, &span, strip);
473+
let ctx = Context::new(working_set, new_span, prefix, offset);
474+
suggestions.extend(self.process_completion(&mut FileCompletion, &ctx));
475+
return suggestions;
476+
}
469477
break;
470478
}
471479
}

crates/nu-cli/tests/completions/mod.rs

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,16 @@ use std::{
99
use nu_cli::NuCompleter;
1010
use nu_engine::eval_block;
1111
use nu_parser::parse;
12-
use nu_path::expand_tilde;
12+
use nu_path::{AbsolutePathBuf, expand_tilde};
1313
use nu_protocol::{Config, PipelineData, debugger::WithoutDebug, engine::StateWorkingSet};
1414
use nu_std::load_standard_library;
15+
use nu_test_support::fs;
1516
use reedline::{Completer, Suggestion};
1617
use rstest::{fixture, rstest};
1718
use support::{
1819
completions_helpers::{
19-
new_dotnu_engine, new_external_engine, new_partial_engine, new_quote_engine,
20+
new_dotnu_engine, new_engine_helper, new_external_engine, new_partial_engine,
21+
new_quote_engine,
2022
},
2123
file, folder, match_suggestions, match_suggestions_by_string, new_engine,
2224
};
@@ -716,6 +718,19 @@ fn external_completer_fallback() {
716718
let expected = [folder("test_a"), file("test_a_symlink"), folder("test_b")];
717719
let suggestions = run_external_completion(block, input);
718720
match_suggestions_by_string(&expected, &suggestions);
721+
722+
// issue #15790
723+
let input = "foo `dir with space/`";
724+
let expected = [
725+
"`dir with space/bar baz`".into(),
726+
"`dir with space/foo`".into(),
727+
];
728+
let suggestions = run_external_completion_within_pwd(
729+
block,
730+
input,
731+
fs::fixtures().join("external_completions"),
732+
);
733+
match_suggestions_by_string(&expected, &suggestions);
719734
}
720735

721736
/// Fallback to external completions for flags of `sudo`
@@ -2103,11 +2118,15 @@ fn alias_of_another_alias() {
21032118
match_suggestions(&expected_paths, &suggestions)
21042119
}
21052120

2106-
fn run_external_completion(completer: &str, input: &str) -> Vec<Suggestion> {
2121+
fn run_external_completion_within_pwd(
2122+
completer: &str,
2123+
input: &str,
2124+
pwd: AbsolutePathBuf,
2125+
) -> Vec<Suggestion> {
21072126
let completer = format!("$env.config.completions.external.completer = {completer}");
21082127

21092128
// Create a new engine
2110-
let (_, _, mut engine_state, mut stack) = new_engine();
2129+
let (_, _, mut engine_state, mut stack) = new_engine_helper(pwd);
21112130
let (block, delta) = {
21122131
let mut working_set = StateWorkingSet::new(&engine_state);
21132132
let block = parse(&mut working_set, None, completer.as_bytes(), false);
@@ -2131,6 +2150,10 @@ fn run_external_completion(completer: &str, input: &str) -> Vec<Suggestion> {
21312150
completer.complete(input, input.len())
21322151
}
21332152

2153+
fn run_external_completion(completer: &str, input: &str) -> Vec<Suggestion> {
2154+
run_external_completion_within_pwd(completer, input, fs::fixtures().join("completions"))
2155+
}
2156+
21342157
#[test]
21352158
fn unknown_command_completion() {
21362159
let (_, _, engine, stack) = new_engine();

tests/fixtures/external_completions/dir with space/bar baz

Whitespace-only changes.

tests/fixtures/external_completions/dir with space/foo

Whitespace-only changes.

0 commit comments

Comments
 (0)