Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'helix-term/src/ui/completion.rs')
-rw-r--r--helix-term/src/ui/completion.rs105
1 files changed, 62 insertions, 43 deletions
diff --git a/helix-term/src/ui/completion.rs b/helix-term/src/ui/completion.rs
index ad317e39..adacfad3 100644
--- a/helix-term/src/ui/completion.rs
+++ b/helix-term/src/ui/completion.rs
@@ -9,10 +9,13 @@ use helix_view::{
document::SavePoint,
editor::CompleteAction,
handlers::lsp::SignatureHelpInvoked,
- theme::{Modifier, Style},
+ theme::{Color, Modifier, Style},
ViewId,
};
-use tui::{buffer::Buffer as Surface, text::Span};
+use tui::{
+ buffer::Buffer as Surface,
+ text::{Span, Spans},
+};
use std::{borrow::Cow, sync::Arc};
@@ -64,53 +67,69 @@ impl menu::Item for CompletionItem {
let kind = match self {
CompletionItem::Lsp(LspCompletionItem { item, .. }) => match item.kind {
- Some(lsp::CompletionItemKind::TEXT) => "text",
- Some(lsp::CompletionItemKind::METHOD) => "method",
- Some(lsp::CompletionItemKind::FUNCTION) => "function",
- Some(lsp::CompletionItemKind::CONSTRUCTOR) => "constructor",
- Some(lsp::CompletionItemKind::FIELD) => "field",
- Some(lsp::CompletionItemKind::VARIABLE) => "variable",
- Some(lsp::CompletionItemKind::CLASS) => "class",
- Some(lsp::CompletionItemKind::INTERFACE) => "interface",
- Some(lsp::CompletionItemKind::MODULE) => "module",
- Some(lsp::CompletionItemKind::PROPERTY) => "property",
- Some(lsp::CompletionItemKind::UNIT) => "unit",
- Some(lsp::CompletionItemKind::VALUE) => "value",
- Some(lsp::CompletionItemKind::ENUM) => "enum",
- Some(lsp::CompletionItemKind::KEYWORD) => "keyword",
- Some(lsp::CompletionItemKind::SNIPPET) => "snippet",
- Some(lsp::CompletionItemKind::COLOR) => "color",
- Some(lsp::CompletionItemKind::FILE) => "file",
- Some(lsp::CompletionItemKind::REFERENCE) => "reference",
- Some(lsp::CompletionItemKind::FOLDER) => "folder",
- Some(lsp::CompletionItemKind::ENUM_MEMBER) => "enum_member",
- Some(lsp::CompletionItemKind::CONSTANT) => "constant",
- Some(lsp::CompletionItemKind::STRUCT) => "struct",
- Some(lsp::CompletionItemKind::EVENT) => "event",
- Some(lsp::CompletionItemKind::OPERATOR) => "operator",
- Some(lsp::CompletionItemKind::TYPE_PARAMETER) => "type_param",
+ Some(lsp::CompletionItemKind::TEXT) => "text".into(),
+ Some(lsp::CompletionItemKind::METHOD) => "method".into(),
+ Some(lsp::CompletionItemKind::FUNCTION) => "function".into(),
+ Some(lsp::CompletionItemKind::CONSTRUCTOR) => "constructor".into(),
+ Some(lsp::CompletionItemKind::FIELD) => "field".into(),
+ Some(lsp::CompletionItemKind::VARIABLE) => "variable".into(),
+ Some(lsp::CompletionItemKind::CLASS) => "class".into(),
+ Some(lsp::CompletionItemKind::INTERFACE) => "interface".into(),
+ Some(lsp::CompletionItemKind::MODULE) => "module".into(),
+ Some(lsp::CompletionItemKind::PROPERTY) => "property".into(),
+ Some(lsp::CompletionItemKind::UNIT) => "unit".into(),
+ Some(lsp::CompletionItemKind::VALUE) => "value".into(),
+ Some(lsp::CompletionItemKind::ENUM) => "enum".into(),
+ Some(lsp::CompletionItemKind::KEYWORD) => "keyword".into(),
+ Some(lsp::CompletionItemKind::SNIPPET) => "snippet".into(),
+ Some(lsp::CompletionItemKind::COLOR) => item
+ .documentation
+ .as_ref()
+ .and_then(|docs| {
+ let text = match docs {
+ lsp::Documentation::String(text) => text,
+ lsp::Documentation::MarkupContent(lsp::MarkupContent {
+ value, ..
+ }) => value,
+ };
+ Color::from_hex(text)
+ })
+ .map_or("color".into(), |color| {
+ Spans::from(vec![
+ Span::raw("color "),
+ Span::styled("■", Style::default().fg(color)),
+ ])
+ }),
+ Some(lsp::CompletionItemKind::FILE) => "file".into(),
+ Some(lsp::CompletionItemKind::REFERENCE) => "reference".into(),
+ Some(lsp::CompletionItemKind::FOLDER) => "folder".into(),
+ Some(lsp::CompletionItemKind::ENUM_MEMBER) => "enum_member".into(),
+ Some(lsp::CompletionItemKind::CONSTANT) => "constant".into(),
+ Some(lsp::CompletionItemKind::STRUCT) => "struct".into(),
+ Some(lsp::CompletionItemKind::EVENT) => "event".into(),
+ Some(lsp::CompletionItemKind::OPERATOR) => "operator".into(),
+ Some(lsp::CompletionItemKind::TYPE_PARAMETER) => "type_param".into(),
Some(kind) => {
log::error!("Received unknown completion item kind: {:?}", kind);
- ""
+ "".into()
}
- None => "",
+ None => "".into(),
},
- CompletionItem::Other(core::CompletionItem { kind, .. }) => kind,
+ CompletionItem::Other(core::CompletionItem { kind, .. }) => kind.as_ref().into(),
};
- menu::Row::new([
- menu::Cell::from(Span::styled(
- label,
- if deprecated {
- Style::default().add_modifier(Modifier::CROSSED_OUT)
- } else if kind == "folder" {
- *dir_style
- } else {
- Style::default()
- },
- )),
- menu::Cell::from(kind),
- ])
+ let label = Span::styled(
+ label,
+ if deprecated {
+ Style::default().add_modifier(Modifier::CROSSED_OUT)
+ } else if kind.0[0].content == "folder" {
+ *dir_style
+ } else {
+ Style::default()
+ },
+ );
+
+ menu::Row::new([menu::Cell::from(label), menu::Cell::from(kind)])
}
}