diff --git a/crates/nu-cli/src/completions/command_completions.rs b/crates/nu-cli/src/completions/command_completions.rs index c4dee0760..37417e3a2 100644 --- a/crates/nu-cli/src/completions/command_completions.rs +++ b/crates/nu-cli/src/completions/command_completions.rs @@ -81,6 +81,9 @@ impl CommandCompletion { match_algorithm: MatchAlgorithm, ) -> Vec { let partial = working_set.get_span_contents(span); + if partial.is_empty() { + return Vec::new(); + } let filter_predicate = |command: &[u8]| match_algorithm.matches_u8(command, partial); diff --git a/crates/nu-protocol/src/engine/engine_state.rs b/crates/nu-protocol/src/engine/engine_state.rs index d06c1e75f..d00032d5b 100644 --- a/crates/nu-protocol/src/engine/engine_state.rs +++ b/crates/nu-protocol/src/engine/engine_state.rs @@ -576,8 +576,7 @@ impl EngineState { return &contents[(span.start - start)..(span.end - start)]; } } - - panic!("internal error: span missing in file contents cache") + &[0u8; 0] } pub fn get_config(&self) -> &Config { @@ -1292,7 +1291,13 @@ impl<'a> StateWorkingSet<'a> { if permanent_end <= span.start { for (contents, start, finish) in &self.delta.file_contents { if (span.start >= *start) && (span.end <= *finish) { - return &contents[(span.start - start)..(span.end - start)]; + let begin = span.start - start; + let mut end = span.end - start; + if begin > end { + end = *finish - permanent_end; + } + + return &contents[begin..end]; } } } else {