Allow overriding editor settings on a per-language basis

This commit is contained in:
Antonio Scandurra 2021-11-29 09:35:38 +01:00
parent e0998dbfda
commit 93de2bcfed
9 changed files with 88 additions and 30 deletions

View file

@ -1,17 +1,33 @@
use anyhow::Result;
use gpui::font_cache::{FamilyId, FontCache};
use postage::watch;
use std::sync::Arc;
use theme::{Theme, ThemeRegistry, DEFAULT_THEME_NAME};
use language::Language;
use std::{collections::HashMap, sync::Arc};
use theme::Theme;
#[derive(Clone)]
pub struct Settings {
pub buffer_font_family: FamilyId,
pub buffer_font_size: f32,
pub tab_size: usize,
pub soft_wrap: SoftWrap,
pub preferred_line_length: u32,
pub overrides: HashMap<String, Override>,
pub theme: Arc<Theme>,
}
#[derive(Clone, Default)]
pub struct Override {
pub soft_wrap: Option<SoftWrap>,
pub preferred_line_length: Option<u32>,
}
#[derive(Copy, Clone)]
pub enum SoftWrap {
None,
EditorWidth,
PreferredLineLength,
}
impl Settings {
pub fn new(
buffer_font_family: &str,
@ -22,6 +38,9 @@ impl Settings {
buffer_font_family: font_cache.load_family(&[buffer_font_family])?,
buffer_font_size: 16.,
tab_size: 4,
soft_wrap: SoftWrap::None,
preferred_line_length: 80,
overrides: Default::default(),
theme,
})
}
@ -30,22 +49,23 @@ impl Settings {
self.tab_size = tab_size;
self
}
}
pub fn channel(
buffer_font_family: &str,
font_cache: &FontCache,
themes: &ThemeRegistry,
) -> Result<(watch::Sender<Settings>, watch::Receiver<Settings>)> {
let theme = match themes.get(DEFAULT_THEME_NAME) {
Ok(theme) => theme,
Err(err) => {
panic!("failed to deserialize default theme: {:?}", err)
}
};
Ok(watch::channel_with(Settings::new(
buffer_font_family,
font_cache,
theme,
)?))
pub fn with_overrides(mut self, language_name: impl Into<String>, overrides: Override) -> Self {
self.overrides.insert(language_name.into(), overrides);
self
}
pub fn soft_wrap(&self, language: Option<&Arc<Language>>) -> SoftWrap {
language
.and_then(|language| self.overrides.get(language.name()))
.and_then(|settings| settings.soft_wrap)
.unwrap_or(self.soft_wrap)
}
pub fn preferred_line_length(&self, language: Option<&Arc<Language>>) -> u32 {
language
.and_then(|language| self.overrides.get(language.name()))
.and_then(|settings| settings.preferred_line_length)
.unwrap_or(self.preferred_line_length)
}
}