diff --git a/crates/nu-cli/src/menus/help_completions.rs b/crates/nu-cli/src/menus/help_completions.rs index 91642ff980..97883e79a3 100644 --- a/crates/nu-cli/src/menus/help_completions.rs +++ b/crates/nu-cli/src/menus/help_completions.rs @@ -104,8 +104,8 @@ impl NuHelpCompleter { description: Some(long_desc), extra: Some(extra), span: reedline::Span { - start: pos, - end: pos + line.len(), + start: pos - line.len(), + end: pos, }, append_whitespace: false, } @@ -119,3 +119,42 @@ impl Completer for NuHelpCompleter { self.completion_helper(line, pos) } } + +#[cfg(test)] +mod test { + use super::*; + use rstest::rstest; + + #[rstest] + #[case("who", 5, 8, &["whoami"])] + #[case("hash", 1, 5, &["hash", "hash md5", "hash sha256"])] + #[case("into f", 0, 6, &["into float", "into filesize"])] + #[case("into nonexistent", 0, 16, &[])] + fn test_help_completer( + #[case] line: &str, + #[case] start: usize, + #[case] end: usize, + #[case] expected: &[&str], + ) { + let engine_state = + nu_command::add_shell_command_context(nu_cmd_lang::create_default_context()); + let mut completer = NuHelpCompleter::new(engine_state.into()); + let suggestions = completer.complete(line, end); + + assert_eq!( + expected.len(), + suggestions.len(), + "expected {:?}, got {:?}", + expected, + suggestions + .iter() + .map(|s| s.value.clone()) + .collect::>() + ); + + for (exp, actual) in expected.iter().zip(suggestions) { + assert_eq!(exp, &actual.value); + assert_eq!(reedline::Span::new(start, end), actual.span); + } + } +} diff --git a/crates/nu-cli/src/menus/menu_completions.rs b/crates/nu-cli/src/menus/menu_completions.rs index b18c6540b7..6414436bc5 100644 --- a/crates/nu-cli/src/menus/menu_completions.rs +++ b/crates/nu-cli/src/menus/menu_completions.rs @@ -101,9 +101,13 @@ fn convert_to_suggestions( } } _ => reedline::Span { - start: if only_buffer_difference { pos } else { 0 }, + start: if only_buffer_difference { + pos - line.len() + } else { + 0 + }, end: if only_buffer_difference { - pos + line.len() + pos } else { line.len() }, @@ -111,9 +115,13 @@ fn convert_to_suggestions( } } _ => reedline::Span { - start: if only_buffer_difference { pos } else { 0 }, + start: if only_buffer_difference { + pos - line.len() + } else { + 0 + }, end: if only_buffer_difference { - pos + line.len() + pos } else { line.len() }, @@ -152,8 +160,16 @@ fn convert_to_suggestions( description: None, extra: None, span: reedline::Span { - start: 0, - end: line.len(), + start: if only_buffer_difference { + pos - line.len() + } else { + 0 + }, + end: if only_buffer_difference { + pos + } else { + line.len() + }, }, append_whitespace: false, }],