@@ -78,8 +78,11 @@ impl Loader {
79#[derive(Clone, Debug)]
79#[derive(Clone, Debug)]
80pub struct Theme {
80pub struct Theme {
81− scopes: Vec<String>,
81+ // UI styles are stored in a HashMap
82 styles: HashMap<String, Style>,
82 styles: HashMap<String, Style>,
83+ // tree-sitter highlight styles are stored in a Vec to optimize lookups
85+ highlights: Vec<Style>,
85impl<'de> Deserialize<'de> for Theme {
88impl<'de> Deserialize<'de> for Theme {
@@ -88,6 +91,8 @@ impl<'de> Deserialize<'de> for Theme {
88 D: Deserializer<'de>,
91 D: Deserializer<'de>,
90 let mut styles = HashMap::new();
93 let mut styles = HashMap::new();
94+ let mut scopes = Vec::new();
95+ let mut highlights = Vec::new();
92 if let Ok(mut colors) = HashMap::<String, Value>::deserialize(deserializer) {
97 if let Ok(mut colors) = HashMap::<String, Value>::deserialize(deserializer) {
93 // TODO: alert user of parsing failures in editor
98 // TODO: alert user of parsing failures in editor
@@ -102,21 +107,35 @@ impl<'de> Deserialize<'de> for Theme {
102 .unwrap_or_default();
107 .unwrap_or_default();
104 styles.reserve(colors.len());
109 styles.reserve(colors.len());
110+ scopes.reserve(colors.len());
111+ highlights.reserve(colors.len());
105 for (name, style_value) in colors {
113 for (name, style_value) in colors {
106 let mut style = Style::default();
114 let mut style = Style::default();
107 if let Err(err) = palette.parse_style(&mut style, style_value) {
115 if let Err(err) = palette.parse_style(&mut style, style_value) {
108 warn!("{}", err);
116 warn!("{}", err);
119+ // these are used both as UI and as highlights
110− styles.insert(name, style);
120+ styles.insert(name.clone(), style);
122+ highlights.push(style);
114− let scopes = styles.keys().map(ToString::to_string).collect();
115− Ok(Self { scopes, styles })
126+ Ok(Self {
119impl Theme {
134impl Theme {
135+ pub fn highlight(&self, index: usize) -> Style {
136+ self.highlights[index]
120 pub fn get(&self, scope: &str) -> Style {
139 pub fn get(&self, scope: &str) -> Style {
121 self.try_get(scope)
140 self.try_get(scope)
122 .unwrap_or_else(|| Style::default().fg(Color::Rgb(0, 0, 255)))
141 .unwrap_or_else(|| Style::default().fg(Color::Rgb(0, 0, 255)))