Skip to content

Commit 17aee10

Browse files
committed
completions: Add colors based on the LSP item kind
1 parent c8082a1 commit 17aee10

File tree

2 files changed

+52
-35
lines changed

2 files changed

+52
-35
lines changed

helix-term/src/ui/completion.rs

Lines changed: 47 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
use crate::compositor::{Component, Context, EventResult};
22
use crossterm::event::{Event, KeyCode, KeyEvent};
33
use helix_view::editor::CompleteAction;
4+
use helix_view::theme::{Modifier, Style};
5+
use helix_view::Theme;
46
use tui::buffer::Buffer as Surface;
57

68
use std::borrow::Cow;
@@ -27,38 +29,53 @@ impl menu::Item for CompletionItem {
2729
self.label.as_str()
2830
}
2931

30-
fn row(&self) -> menu::Row {
32+
fn row(&self, theme: Option<&Theme>) -> menu::Row {
33+
let (lsp_type_label, style) = match self.kind {
34+
Some(lsp::CompletionItemKind::TEXT) => ("text", Some("ui.text")),
35+
Some(lsp::CompletionItemKind::METHOD) => ("method", Some("function.method")),
36+
Some(lsp::CompletionItemKind::FUNCTION) => ("function", Some("function")),
37+
Some(lsp::CompletionItemKind::CONSTRUCTOR) => ("constructor", Some("constructor")),
38+
Some(lsp::CompletionItemKind::FIELD) => ("field", Some("variable.other.member")),
39+
Some(lsp::CompletionItemKind::VARIABLE) => ("variable", Some("variable")),
40+
Some(lsp::CompletionItemKind::CLASS) => ("class", Some("type")),
41+
Some(lsp::CompletionItemKind::INTERFACE) => ("interface", Some("type")),
42+
Some(lsp::CompletionItemKind::MODULE) => ("module", Some("module")),
43+
Some(lsp::CompletionItemKind::PROPERTY) => ("property", Some("attributes")),
44+
Some(lsp::CompletionItemKind::UNIT) => ("unit", Some("constant")),
45+
Some(lsp::CompletionItemKind::VALUE) => ("value", Some("string")),
46+
Some(lsp::CompletionItemKind::ENUM) => ("enum", Some("type")),
47+
Some(lsp::CompletionItemKind::KEYWORD) => ("keyword", Some("keyword")),
48+
Some(lsp::CompletionItemKind::SNIPPET) => ("snippet", None),
49+
Some(lsp::CompletionItemKind::COLOR) => ("color", None),
50+
Some(lsp::CompletionItemKind::FILE) => ("file", None),
51+
Some(lsp::CompletionItemKind::REFERENCE) => ("reference", None),
52+
Some(lsp::CompletionItemKind::FOLDER) => ("folder", None),
53+
Some(lsp::CompletionItemKind::ENUM_MEMBER) => {
54+
("enum_member", Some("type.enum.variant"))
55+
}
56+
Some(lsp::CompletionItemKind::CONSTANT) => ("constant", Some("constant")),
57+
Some(lsp::CompletionItemKind::STRUCT) => ("struct", Some("type")),
58+
Some(lsp::CompletionItemKind::EVENT) => ("event", None),
59+
Some(lsp::CompletionItemKind::OPERATOR) => ("operator", Some("operator")),
60+
Some(lsp::CompletionItemKind::TYPE_PARAMETER) => {
61+
("type_param", Some("function.parameter"))
62+
}
63+
Some(kind) => unimplemented!("{:?}", kind),
64+
None => ("", None),
65+
};
66+
3167
menu::Row::new(vec![
3268
menu::Cell::from(self.label.as_str()),
33-
menu::Cell::from(match self.kind {
34-
Some(lsp::CompletionItemKind::TEXT) => "text",
35-
Some(lsp::CompletionItemKind::METHOD) => "method",
36-
Some(lsp::CompletionItemKind::FUNCTION) => "function",
37-
Some(lsp::CompletionItemKind::CONSTRUCTOR) => "constructor",
38-
Some(lsp::CompletionItemKind::FIELD) => "field",
39-
Some(lsp::CompletionItemKind::VARIABLE) => "variable",
40-
Some(lsp::CompletionItemKind::CLASS) => "class",
41-
Some(lsp::CompletionItemKind::INTERFACE) => "interface",
42-
Some(lsp::CompletionItemKind::MODULE) => "module",
43-
Some(lsp::CompletionItemKind::PROPERTY) => "property",
44-
Some(lsp::CompletionItemKind::UNIT) => "unit",
45-
Some(lsp::CompletionItemKind::VALUE) => "value",
46-
Some(lsp::CompletionItemKind::ENUM) => "enum",
47-
Some(lsp::CompletionItemKind::KEYWORD) => "keyword",
48-
Some(lsp::CompletionItemKind::SNIPPET) => "snippet",
49-
Some(lsp::CompletionItemKind::COLOR) => "color",
50-
Some(lsp::CompletionItemKind::FILE) => "file",
51-
Some(lsp::CompletionItemKind::REFERENCE) => "reference",
52-
Some(lsp::CompletionItemKind::FOLDER) => "folder",
53-
Some(lsp::CompletionItemKind::ENUM_MEMBER) => "enum_member",
54-
Some(lsp::CompletionItemKind::CONSTANT) => "constant",
55-
Some(lsp::CompletionItemKind::STRUCT) => "struct",
56-
Some(lsp::CompletionItemKind::EVENT) => "event",
57-
Some(lsp::CompletionItemKind::OPERATOR) => "operator",
58-
Some(lsp::CompletionItemKind::TYPE_PARAMETER) => "type_param",
59-
Some(kind) => unimplemented!("{:?}", kind),
60-
None => "",
61-
}),
69+
menu::Cell::from(lsp_type_label).style(
70+
theme
71+
.and_then(|theme| id.and_then(|id| theme.try_get(style)))
72+
.map_or(Style::default(), |mut style| {
73+
style.bg = None;
74+
style
75+
.remove_modifier(Modifier::BOLD)
76+
.add_modifier(Modifier::ITALIC)
77+
}),
78+
),
6279
// self.detail.as_deref().unwrap_or("")
6380
// self.label_details
6481
// .as_ref()

helix-term/src/ui/menu.rs

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

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

1616
pub trait Item {
@@ -23,7 +23,7 @@ pub trait Item {
2323
self.label()
2424
}
2525

26-
fn row(&self) -> Row {
26+
fn row(&self, _theme: Option<&Theme>) -> Row {
2727
Row::new(vec![Cell::from(self.label())])
2828
}
2929
}
@@ -125,10 +125,10 @@ impl<T: Item> Menu<T> {
125125
let n = self
126126
.options
127127
.first()
128-
.map(|option| option.row().cells.len())
128+
.map(|option| option.row(None).cells.len())
129129
.unwrap_or_default();
130130
let max_lens = self.options.iter().fold(vec![0; n], |mut acc, option| {
131-
let row = option.row();
131+
let row = option.row(None);
132132
// maintain max for each column
133133
for (acc, cell) in acc.iter_mut().zip(row.cells.iter()) {
134134
let width = cell.content.width();
@@ -296,7 +296,7 @@ impl<T: Item + 'static> Component for Menu<T> {
296296
let scroll_line = (win_height - scroll_height) * scroll
297297
/ std::cmp::max(1, len.saturating_sub(win_height));
298298

299-
let rows = options.iter().map(|option| option.row());
299+
let rows = options.iter().map(|option| option.row(Some(theme)));
300300
let table = Table::new(rows)
301301
.style(style)
302302
.highlight_style(selected)

0 commit comments

Comments
 (0)