Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'helix-term/src/ui/prompt.rs')
| -rw-r--r-- | helix-term/src/ui/prompt.rs | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/helix-term/src/ui/prompt.rs b/helix-term/src/ui/prompt.rs index 8c7a7baf..f44020c5 100644 --- a/helix-term/src/ui/prompt.rs +++ b/helix-term/src/ui/prompt.rs @@ -8,6 +8,7 @@ use helix_view::keyboard::KeyCode; use std::sync::Arc; use std::{borrow::Cow, ops::RangeFrom}; use tui::buffer::Buffer as Surface; +use tui::text::Span; use tui::widgets::{Block, Widget}; use helix_core::{ @@ -19,7 +20,8 @@ use helix_view::{ }; type PromptCharHandler = Box<dyn Fn(&mut Prompt, char, &Context)>; -pub type Completion = (RangeFrom<usize>, Cow<'static, str>); + +pub type Completion = (RangeFrom<usize>, Span<'static>); type CompletionFn = Box<dyn FnMut(&Editor, &str) -> Vec<Completion>>; type CallbackFn = Box<dyn FnMut(&mut Context, &str, PromptEvent)>; pub type DocFn = Box<dyn Fn(&str) -> Option<Cow<str>>>; @@ -374,7 +376,7 @@ impl Prompt { let (range, item) = &self.completion[index]; - self.line.replace_range(range.clone(), item); + self.line.replace_range(range.clone(), &item.content); self.move_end(); } @@ -399,7 +401,7 @@ impl Prompt { let max_len = self .completion .iter() - .map(|(_, completion)| completion.len() as u16) + .map(|(_, completion)| completion.content.len() as u16) .max() .unwrap_or(BASE_WIDTH) .max(BASE_WIDTH); @@ -438,18 +440,22 @@ impl Prompt { for (i, (_range, completion)) in self.completion.iter().enumerate().skip(offset).take(items) { - let color = if Some(i) == self.selection { - selected_color // TODO: just invert bg + let is_selected = Some(i) == self.selection; + + let completion_item_style = if is_selected { + selected_color } else { - completion_color + completion_color.patch(completion.style) }; + surface.set_stringn( area.x + col * (1 + col_width), area.y + row, - completion, + &completion.content, col_width.saturating_sub(1) as usize, - color, + completion_item_style, ); + row += 1; if row > area.height - 1 { row = 0; |