mirror of https://github.com/helix-editor/helix
new themes commands :teme-dark and :theme-light
parent
ba9c8644f7
commit
b2d004304a
|
@ -2930,7 +2930,29 @@ pub const TYPABLE_COMMAND_LIST: &[TypableCommand] = &[
|
||||||
aliases: &[],
|
aliases: &[],
|
||||||
doc: "Change the editor theme (show current theme if no name specified).",
|
doc: "Change the editor theme (show current theme if no name specified).",
|
||||||
fun: theme,
|
fun: theme,
|
||||||
completer: CommandCompleter::positional(&[completers::theme]),
|
completer: CommandCompleter::positional(&[|_editor, input| completers::theme(_editor, input, "all")]),
|
||||||
|
signature: Signature {
|
||||||
|
positionals: (0, Some(1)),
|
||||||
|
..Signature::DEFAULT
|
||||||
|
},
|
||||||
|
},
|
||||||
|
TypableCommand {
|
||||||
|
name: "theme-dark",
|
||||||
|
aliases: &[],
|
||||||
|
doc: "Change the editor theme to a dark theme (show current theme if no name specified).",
|
||||||
|
fun: theme,
|
||||||
|
completer: CommandCompleter::positional(&[|_editor, input| completers::theme(_editor, input, "dark")]),
|
||||||
|
signature: Signature {
|
||||||
|
positionals: (0, Some(1)),
|
||||||
|
..Signature::DEFAULT
|
||||||
|
},
|
||||||
|
},
|
||||||
|
TypableCommand {
|
||||||
|
name: "theme-light",
|
||||||
|
aliases: &[],
|
||||||
|
doc: "Change the editor theme to a light theme (show current theme if no name specified).",
|
||||||
|
fun: theme,
|
||||||
|
completer: CommandCompleter::positional(&[|_editor, input| completers::theme(_editor, input, "light")]),
|
||||||
signature: Signature {
|
signature: Signature {
|
||||||
positionals: (0, Some(1)),
|
positionals: (0, Some(1)),
|
||||||
..Signature::DEFAULT
|
..Signature::DEFAULT
|
||||||
|
|
|
@ -399,13 +399,33 @@ pub mod completers {
|
||||||
.collect()
|
.collect()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn theme(_editor: &Editor, input: &str) -> Vec<Completion> {
|
pub fn theme(_editor: &Editor, input: &str, themes_type : &str) -> Vec<Completion> {
|
||||||
let mut names = theme::Loader::read_names(&helix_loader::config_dir().join("themes"));
|
let themes_dirs = match themes_type {
|
||||||
|
"dark" => vec!["themes/dark"],
|
||||||
|
"light" => vec!["themes/light"],
|
||||||
|
// The first element should not have any effect
|
||||||
|
_ => vec!["themes","themes/light","themes/dark"]
|
||||||
|
};
|
||||||
|
|
||||||
|
let mut names = Vec::new();
|
||||||
for rt_dir in helix_loader::runtime_dirs() {
|
for rt_dir in helix_loader::runtime_dirs() {
|
||||||
names.extend(theme::Loader::read_names(&rt_dir.join("themes")));
|
for themes_dir in &themes_dirs {
|
||||||
}
|
names.extend(theme::Loader::read_names(&rt_dir.join(themes_dir)));
|
||||||
names.push("default".into());
|
};
|
||||||
names.push("base16_default".into());
|
};
|
||||||
|
|
||||||
|
for themes_dir in &themes_dirs {
|
||||||
|
names.extend(theme::Loader::read_names(&helix_loader::config_dir().join(themes_dir)));
|
||||||
|
};
|
||||||
|
|
||||||
|
match themes_type {
|
||||||
|
"light" => (),
|
||||||
|
"dark" => { names.push("default".into());
|
||||||
|
},
|
||||||
|
_ => { names.push("base16_default".into());
|
||||||
|
names.push("default".into());
|
||||||
|
}
|
||||||
|
};
|
||||||
names.sort();
|
names.sort();
|
||||||
names.dedup();
|
names.dedup();
|
||||||
|
|
||||||
|
|
|
@ -40,17 +40,25 @@ pub struct Loader {
|
||||||
/// Theme directories to search from highest to lowest priority
|
/// Theme directories to search from highest to lowest priority
|
||||||
theme_dirs: Vec<PathBuf>,
|
theme_dirs: Vec<PathBuf>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Loader {
|
impl Loader {
|
||||||
/// Creates a new loader that can load themes from multiple directories.
|
/// Creates a new loader that can load themes from multiple directories.
|
||||||
///
|
///
|
||||||
/// The provided directories should be ordered from highest to lowest priority.
|
/// The provided directories should be ordered from highest to lowest priority.
|
||||||
/// The directories will have their "themes" subdirectory searched.
|
/// The directories will have their "themes/dark", "themes/light" and "themes" subdirectory searched.
|
||||||
pub fn new(dirs: &[PathBuf]) -> Self {
|
pub fn new(dirs: &[PathBuf]) -> Self {
|
||||||
|
let theme_dirs: Vec<_> = dirs.iter()
|
||||||
|
.flat_map(|p| {
|
||||||
|
vec![p.join("themes/dark"), p.join("themes/light"), p.join("themes")]
|
||||||
|
})
|
||||||
|
.collect();
|
||||||
|
|
||||||
Self {
|
Self {
|
||||||
theme_dirs: dirs.iter().map(|p| p.join("themes")).collect(),
|
theme_dirs,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// Loads a theme searching directories in priority order.
|
/// Loads a theme searching directories in priority order.
|
||||||
pub fn load(&self, name: &str) -> Result<Theme> {
|
pub fn load(&self, name: &str) -> Result<Theme> {
|
||||||
let (theme, warnings) = self.load_with_warnings(name)?;
|
let (theme, warnings) = self.load_with_warnings(name)?;
|
||||||
|
|
Loading…
Reference in New Issue