Skip to content

Commit 27909d2

Browse files
committed
completions: Add colors based on the LSP item kind
1 parent 96ff64a commit 27909d2

File tree

2 files changed

+51
-39
lines changed

2 files changed

+51
-39
lines changed

helix-term/src/ui/completion.rs

Lines changed: 44 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use crate::compositor::{Component, Context, Event, EventResult};
2-
use helix_view::{apply_transaction, editor::CompleteAction, ViewId};
2+
use helix_view::{apply_transaction, editor::CompleteAction, theme::Modifier, Theme, ViewId};
33
use tui::buffer::Buffer as Surface;
44
use tui::text::Spans;
55

@@ -37,41 +37,51 @@ impl menu::Item for CompletionItem {
3737
self.label.as_str().into()
3838
}
3939

40-
fn row(&self, _data: &Self::Data) -> menu::Row {
40+
fn row(&self, _data: &Self::Data, theme: Option<&Theme>) -> menu::Row {
41+
let (lsp_type_label, style) = match self.kind {
42+
Some(lsp::CompletionItemKind::TEXT) => ("text", Some("ui.text")),
43+
Some(lsp::CompletionItemKind::METHOD) => ("method", Some("function.method")),
44+
Some(lsp::CompletionItemKind::FUNCTION) => ("function", Some("function")),
45+
Some(lsp::CompletionItemKind::CONSTRUCTOR) => ("constructor", Some("constructor")),
46+
Some(lsp::CompletionItemKind::FIELD) => ("field", Some("variable.other.member")),
47+
Some(lsp::CompletionItemKind::VARIABLE) => ("variable", Some("variable")),
48+
Some(lsp::CompletionItemKind::CLASS) => ("class", Some("type")),
49+
Some(lsp::CompletionItemKind::INTERFACE) => ("interface", Some("type")),
50+
Some(lsp::CompletionItemKind::MODULE) => ("module", Some("module")),
51+
Some(lsp::CompletionItemKind::PROPERTY) => ("property", Some("attributes")),
52+
Some(lsp::CompletionItemKind::UNIT) => ("unit", Some("constant")),
53+
Some(lsp::CompletionItemKind::VALUE) => ("value", Some("string")),
54+
Some(lsp::CompletionItemKind::ENUM) => ("enum", Some("type")),
55+
Some(lsp::CompletionItemKind::KEYWORD) => ("keyword", Some("keyword")),
56+
Some(lsp::CompletionItemKind::SNIPPET) => ("snippet", None),
57+
Some(lsp::CompletionItemKind::COLOR) => ("color", None),
58+
Some(lsp::CompletionItemKind::FILE) => ("file", None),
59+
Some(lsp::CompletionItemKind::REFERENCE) => ("reference", None),
60+
Some(lsp::CompletionItemKind::FOLDER) => ("folder", None),
61+
Some(lsp::CompletionItemKind::ENUM_MEMBER) => {
62+
("enum_member", Some("type.enum.variant"))
63+
}
64+
Some(lsp::CompletionItemKind::CONSTANT) => ("constant", Some("constant")),
65+
Some(lsp::CompletionItemKind::STRUCT) => ("struct", Some("type")),
66+
Some(lsp::CompletionItemKind::EVENT) => ("event", None),
67+
Some(lsp::CompletionItemKind::OPERATOR) => ("operator", Some("operator")),
68+
Some(lsp::CompletionItemKind::TYPE_PARAMETER) => {
69+
("type_param", Some("function.parameter"))
70+
}
71+
Some(kind) => unimplemented!("{:?}", kind),
72+
None => ("", None),
73+
};
74+
let mut lsp_type_style = theme
75+
.zip(style)
76+
.map(|(theme, style)| theme.get(style))
77+
.unwrap_or_default()
78+
.remove_modifier(Modifier::all())
79+
.add_modifier(Modifier::ITALIC);
80+
lsp_type_style.bg = None;
81+
4182
menu::Row::new(vec![
4283
menu::Cell::from(self.label.as_str()),
43-
menu::Cell::from(match self.kind {
44-
Some(lsp::CompletionItemKind::TEXT) => "text",
45-
Some(lsp::CompletionItemKind::METHOD) => "method",
46-
Some(lsp::CompletionItemKind::FUNCTION) => "function",
47-
Some(lsp::CompletionItemKind::CONSTRUCTOR) => "constructor",
48-
Some(lsp::CompletionItemKind::FIELD) => "field",
49-
Some(lsp::CompletionItemKind::VARIABLE) => "variable",
50-
Some(lsp::CompletionItemKind::CLASS) => "class",
51-
Some(lsp::CompletionItemKind::INTERFACE) => "interface",
52-
Some(lsp::CompletionItemKind::MODULE) => "module",
53-
Some(lsp::CompletionItemKind::PROPERTY) => "property",
54-
Some(lsp::CompletionItemKind::UNIT) => "unit",
55-
Some(lsp::CompletionItemKind::VALUE) => "value",
56-
Some(lsp::CompletionItemKind::ENUM) => "enum",
57-
Some(lsp::CompletionItemKind::KEYWORD) => "keyword",
58-
Some(lsp::CompletionItemKind::SNIPPET) => "snippet",
59-
Some(lsp::CompletionItemKind::COLOR) => "color",
60-
Some(lsp::CompletionItemKind::FILE) => "file",
61-
Some(lsp::CompletionItemKind::REFERENCE) => "reference",
62-
Some(lsp::CompletionItemKind::FOLDER) => "folder",
63-
Some(lsp::CompletionItemKind::ENUM_MEMBER) => "enum_member",
64-
Some(lsp::CompletionItemKind::CONSTANT) => "constant",
65-
Some(lsp::CompletionItemKind::STRUCT) => "struct",
66-
Some(lsp::CompletionItemKind::EVENT) => "event",
67-
Some(lsp::CompletionItemKind::OPERATOR) => "operator",
68-
Some(lsp::CompletionItemKind::TYPE_PARAMETER) => "type_param",
69-
Some(kind) => {
70-
log::error!("Received unknown completion item kind: {:?}", kind);
71-
""
72-
}
73-
None => "",
74-
}),
84+
menu::Cell::from(lsp_type_label).style(lsp_type_style),
7585
// self.detail.as_deref().unwrap_or("")
7686
// self.label_details
7787
// .as_ref()

helix-term/src/ui/menu.rs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ pub use tui::widgets::{Cell, Row};
1111
use fuzzy_matcher::skim::SkimMatcherV2 as Matcher;
1212
use fuzzy_matcher::FuzzyMatcher;
1313

14-
use helix_view::{graphics::Rect, Editor};
14+
use helix_view::{graphics::Rect, Editor, Theme};
1515
use tui::layout::Constraint;
1616

1717
pub trait Item {
@@ -30,7 +30,7 @@ pub trait Item {
3030
label.into()
3131
}
3232

33-
fn row(&self, data: &Self::Data) -> Row {
33+
fn row(&self, data: &Self::Data, _theme: Option<&Theme>) -> Row {
3434
Row::new(vec![Cell::from(self.label(data))])
3535
}
3636
}
@@ -144,10 +144,10 @@ impl<T: Item> Menu<T> {
144144
let n = self
145145
.options
146146
.first()
147-
.map(|option| option.row(&self.editor_data).cells.len())
147+
.map(|option| option.row(&self.editor_data, None).cells.len())
148148
.unwrap_or_default();
149149
let max_lens = self.options.iter().fold(vec![0; n], |mut acc, option| {
150-
let row = option.row(&self.editor_data);
150+
let row = option.row(&self.editor_data, None);
151151
// maintain max for each column
152152
for (acc, cell) in acc.iter_mut().zip(row.cells.iter()) {
153153
let width = cell.content.width();
@@ -331,7 +331,9 @@ impl<T: Item + 'static> Component for Menu<T> {
331331
(a + b - 1) / b
332332
}
333333

334-
let rows = options.iter().map(|option| option.row(&self.editor_data));
334+
let rows = options
335+
.iter()
336+
.map(|option| option.row(&self.editor_data, Some(theme)));
335337
let table = Table::new(rows)
336338
.style(style)
337339
.highlight_style(selected)

0 commit comments

Comments
 (0)