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.rs22
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;