diff --git a/helix-term/src/application.rs b/helix-term/src/application.rs index 2c0b34dc..1e719f5f 100644 --- a/helix-term/src/application.rs +++ b/helix-term/src/application.rs @@ -241,7 +241,12 @@ impl Renderer { // completion if !prompt.completion.is_empty() { // TODO: find out better way of clearing individual lines of the screen - for i in (3..7) { + let mut row = 0; + let mut col = 0; + let max_col = self.size.0 / BASE_WIDTH; + let col_height = ((prompt.completion.len() as u16 + max_col - 1) / max_col); + + for i in (3..col_height + 3) { self.surface.set_string( 0, self.size.1 - i as u16, @@ -250,14 +255,9 @@ impl Renderer { ); } self.surface.set_style( - Rect::new(0, self.size.1 - 6, self.size.0, 4), + Rect::new(0, self.size.1 - col_height - 2, self.size.0, col_height), view.theme.get("ui.statusline"), ); - let mut row = 0; - let mut col = 0; - let max_col: u16 = self.size.0 / BASE_WIDTH; - // TODO: this will crash if there are too many cols added - // TODO: set char limit for (i, command) in prompt.completion.iter().enumerate() { let color = if prompt.completion_selection_index.is_some() && i == prompt.completion_selection_index.unwrap() @@ -268,13 +268,13 @@ impl Renderer { }; self.surface.set_stringn( 1 + col * BASE_WIDTH, - self.size.1 - 6 + row as u16, + self.size.1 - col_height - 2 + row, &command, BASE_WIDTH as usize - 1, color, ); row += 1; - if row > 3 { + if row > col_height - 1 { row = 0; col += 1; } diff --git a/helix-view/src/prompt.rs b/helix-view/src/prompt.rs index 8186b476..e2a9c80d 100644 --- a/helix-view/src/prompt.rs +++ b/helix-view/src/prompt.rs @@ -68,25 +68,14 @@ impl Prompt { } pub fn change_completion_selection(&mut self) { - if !self.completion.is_empty() { - self.completion_selection_index = self - .completion_selection_index - .map(|i| { - if i == self.completion.len() - 1 { - 0 - } else { - i + 1 - } - }) - .or(Some(0)); - self.line = String::from( - self.completion - .get(self.completion_selection_index.unwrap()) - .unwrap(), - ); + if self.completion.is_empty() { + return; } + let index = + self.completion_selection_index.map(|i| i + 1).unwrap_or(0) % self.completion.len(); + self.completion_selection_index = Some(index); + self.line = self.completion[index].clone(); } - pub fn exit_selection(&mut self) { self.completion_selection_index = None; }