SyntaxEditor: Allow retrieving syntax theme, optimize updates to theme
This commit is contained in:
parent
241c4ca357
commit
ac389d9eeb
2 changed files with 25 additions and 6 deletions
|
|
@ -3,7 +3,7 @@ use alloc::{string::String, vec::Vec};
|
||||||
#[cfg(feature = "std")]
|
#[cfg(feature = "std")]
|
||||||
use std::{fs, io, path::Path};
|
use std::{fs, io, path::Path};
|
||||||
use syntect::highlighting::{
|
use syntect::highlighting::{
|
||||||
FontStyle, HighlightState, Highlighter, RangedHighlightIterator, Theme, ThemeSet,
|
FontStyle, HighlightState, Highlighter, RangedHighlightIterator, ThemeSet,
|
||||||
};
|
};
|
||||||
use syntect::parsing::{ParseState, ScopeStack, SyntaxReference, SyntaxSet};
|
use syntect::parsing::{ParseState, ScopeStack, SyntaxReference, SyntaxSet};
|
||||||
|
|
||||||
|
|
@ -12,6 +12,8 @@ use crate::{
|
||||||
Shaping, Style, Weight, Wrap,
|
Shaping, Style, Weight, Wrap,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
pub use syntect::highlighting::Theme as SyntaxTheme;
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct SyntaxSystem {
|
pub struct SyntaxSystem {
|
||||||
pub syntax_set: SyntaxSet,
|
pub syntax_set: SyntaxSet,
|
||||||
|
|
@ -35,7 +37,7 @@ pub struct SyntaxEditor<'a> {
|
||||||
editor: Editor,
|
editor: Editor,
|
||||||
syntax_system: &'a SyntaxSystem,
|
syntax_system: &'a SyntaxSystem,
|
||||||
syntax: &'a SyntaxReference,
|
syntax: &'a SyntaxReference,
|
||||||
theme: &'a Theme,
|
theme: &'a SyntaxTheme,
|
||||||
highlighter: Highlighter<'a>,
|
highlighter: Highlighter<'a>,
|
||||||
syntax_cache: Vec<(ParseState, HighlightState)>,
|
syntax_cache: Vec<(ParseState, HighlightState)>,
|
||||||
}
|
}
|
||||||
|
|
@ -65,9 +67,11 @@ impl<'a> SyntaxEditor<'a> {
|
||||||
/// Modifies the theme of the [`SyntaxEditor`], returning false if the theme is missing
|
/// Modifies the theme of the [`SyntaxEditor`], returning false if the theme is missing
|
||||||
pub fn update_theme(&mut self, theme_name: &str) -> bool {
|
pub fn update_theme(&mut self, theme_name: &str) -> bool {
|
||||||
if let Some(theme) = self.syntax_system.theme_set.themes.get(theme_name) {
|
if let Some(theme) = self.syntax_system.theme_set.themes.get(theme_name) {
|
||||||
self.theme = theme;
|
if self.theme != theme {
|
||||||
self.highlighter = Highlighter::new(theme);
|
self.theme = theme;
|
||||||
self.syntax_cache.clear();
|
self.highlighter = Highlighter::new(theme);
|
||||||
|
self.syntax_cache.clear();
|
||||||
|
}
|
||||||
|
|
||||||
true
|
true
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -130,6 +134,11 @@ impl<'a> SyntaxEditor<'a> {
|
||||||
Color::rgb(0xFF, 0xFF, 0xFF)
|
Color::rgb(0xFF, 0xFF, 0xFF)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Get the current syntect theme
|
||||||
|
pub fn theme(&self) -> &SyntaxTheme {
|
||||||
|
self.theme
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> Edit for SyntaxEditor<'a> {
|
impl<'a> Edit for SyntaxEditor<'a> {
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@ use unicode_segmentation::UnicodeSegmentation;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
Action, AttrsList, BorrowedWithFontSystem, Buffer, Color, Cursor, Edit, FontSystem,
|
Action, AttrsList, BorrowedWithFontSystem, Buffer, Color, Cursor, Edit, FontSystem,
|
||||||
SyntaxEditor,
|
SyntaxEditor, SyntaxTheme,
|
||||||
};
|
};
|
||||||
|
|
||||||
#[derive(Clone, Debug, Eq, PartialEq)]
|
#[derive(Clone, Debug, Eq, PartialEq)]
|
||||||
|
|
@ -37,6 +37,11 @@ impl<'a> ViEditor<'a> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Modifies the theme of the [`SyntaxEditor`], returning false if the theme is missing
|
||||||
|
pub fn update_theme(&mut self, theme_name: &str) -> bool {
|
||||||
|
self.editor.update_theme(theme_name)
|
||||||
|
}
|
||||||
|
|
||||||
/// Load text from a file, and also set syntax to the best option
|
/// Load text from a file, and also set syntax to the best option
|
||||||
#[cfg(feature = "std")]
|
#[cfg(feature = "std")]
|
||||||
pub fn load_text<P: AsRef<std::path::Path>>(
|
pub fn load_text<P: AsRef<std::path::Path>>(
|
||||||
|
|
@ -58,6 +63,11 @@ impl<'a> ViEditor<'a> {
|
||||||
self.editor.foreground_color()
|
self.editor.foreground_color()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Get the current syntect theme
|
||||||
|
pub fn theme(&self) -> &SyntaxTheme {
|
||||||
|
self.editor.theme()
|
||||||
|
}
|
||||||
|
|
||||||
/// Set passthrough mode (true will turn off vi features)
|
/// Set passthrough mode (true will turn off vi features)
|
||||||
pub fn set_passthrough(&mut self, passthrough: bool) {
|
pub fn set_passthrough(&mut self, passthrough: bool) {
|
||||||
if passthrough != (self.mode == ViMode::Passthrough) {
|
if passthrough != (self.mode == ViMode::Passthrough) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue