Skip to content

Commit

Permalink
commands: Make no arg ':theme' show name
Browse files Browse the repository at this point in the history
Most commands that accept an argument show their current value if no
argument is specified. The `:theme` command previously displayed an
error message in the status bar if not provided with an argument:

```
Theme name not provided
```

It now shows the current theme name in the status bar if no argument is
specified.

Signed-off-by: James O. D. Hunt <[email protected]>
  • Loading branch information
jamesodhunt committed Sep 9, 2022
1 parent 16ce036 commit b4e71d0
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 17 deletions.
2 changes: 1 addition & 1 deletion book/src/generated/typable-cmd.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
| `:quit-all!`, `:qa!` | Force close all views ignoring unsaved changes. |
| `:cquit`, `:cq` | Quit with exit code (default 1). Accepts an optional integer exit code (:cq 2). |
| `:cquit!`, `:cq!` | Force quit with exit code (default 1) ignoring unsaved changes. Accepts an optional integer exit code (:cq! 2). |
| `:theme` | Change the editor theme. |
| `:theme` | Change the editor theme (show current theme if no name specified). |
| `:clipboard-yank` | Yank main selection into system clipboard. |
| `:clipboard-yank-join` | Yank joined selections into system clipboard. A separator can be provided as first argument. Default value is newline. |
| `:primary-clipboard-yank` | Yank main selection into system primary clipboard. |
Expand Down
25 changes: 15 additions & 10 deletions helix-term/src/commands/typed.rs
Original file line number Diff line number Diff line change
Expand Up @@ -725,16 +725,21 @@ fn theme(
};
}
PromptEvent::Validate => {
let theme_name = args.first().with_context(|| "Theme name not provided")?;
let theme = cx
.editor
.theme_loader
.load(theme_name)
.with_context(|| "Theme does not exist")?;
if !(true_color || theme.is_16_color()) {
bail!("Unsupported theme: theme requires true color support");
if let Some(theme_name) = args.first() {
let theme = cx
.editor
.theme_loader
.load(theme_name)
.with_context(|| "Theme does not exist")?;
if !(true_color || theme.is_16_color()) {
bail!("Unsupported theme: theme requires true color support");
}
cx.editor.set_theme(theme);
} else {
let name = cx.editor.theme.name().to_string();

cx.editor.set_status(name);
}
cx.editor.set_theme(theme);
}
};

Expand Down Expand Up @@ -1720,7 +1725,7 @@ pub const TYPABLE_COMMAND_LIST: &[TypableCommand] = &[
TypableCommand {
name: "theme",
aliases: &[],
doc: "Change the editor theme.",
doc: "Change the editor theme (show current theme if no name specified).",
fun: theme,
completer: Some(completers::theme),
},
Expand Down
28 changes: 22 additions & 6 deletions helix-view/src/theme.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,14 @@ use toml::Value;

pub use crate::graphics::{Color, Modifier, Style};

pub static DEFAULT_THEME: Lazy<Theme> = Lazy::new(|| {
toml::from_slice(include_bytes!("../../theme.toml")).expect("Failed to parse default theme")
pub static DEFAULT_THEME: Lazy<Theme> = Lazy::new(|| Theme {
name: "theme".into(),
..toml::from_slice(include_bytes!("../../theme.toml")).expect("Failed to parse default theme")
});
pub static BASE16_DEFAULT_THEME: Lazy<Theme> = Lazy::new(|| {
toml::from_slice(include_bytes!("../../base16_theme.toml"))

pub static BASE16_DEFAULT_THEME: Lazy<Theme> = Lazy::new(|| Theme {
name: "base16_theme".into(),
..toml::from_slice(include_bytes!("../../base16_theme.toml"))
.expect("Failed to parse base 16 default theme")
});

Expand Down Expand Up @@ -52,7 +55,13 @@ impl Loader {
};

let data = std::fs::read(&path)?;
toml::from_slice(data.as_slice()).context("Failed to deserialize theme")

let theme = Theme {
name: name.into(),
..toml::from_slice(data.as_slice()).context("Failed to deserialize theme")?
};

Ok(theme)
}

pub fn read_names(path: &Path) -> Vec<String> {
Expand Down Expand Up @@ -96,8 +105,10 @@ impl Loader {
}
}

#[derive(Clone, Debug)]
#[derive(Clone, Debug, Default)]
pub struct Theme {
name: String,

// UI styles are stored in a HashMap
styles: HashMap<String, Style>,
// tree-sitter highlight styles are stored in a Vec to optimize lookups
Expand Down Expand Up @@ -147,6 +158,7 @@ impl<'de> Deserialize<'de> for Theme {
scopes,
styles,
highlights,
..Default::default()
})
}
}
Expand All @@ -157,6 +169,10 @@ impl Theme {
self.highlights[index]
}

pub fn name(&self) -> &str {
&self.name
}

pub fn get(&self, scope: &str) -> Style {
self.try_get(scope).unwrap_or_default()
}
Expand Down

0 comments on commit b4e71d0

Please sign in to comment.