Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 29 additions & 0 deletions crates/settings/src/settings_content/theme.rs
Original file line number Diff line number Diff line change
Expand Up @@ -889,6 +889,35 @@ pub struct ThemeColorsContent {
/// Deprecated in favor of `version_control_conflict_marker_theirs`.
#[deprecated]
pub version_control_conflict_theirs_background: Option<String>,

/// Background color for Vim Normal mode indicator.
#[serde(rename = "vim.normal.background")]
pub vim_normal_background: Option<String>,
/// Background color for Vim Insert mode indicator.
#[serde(rename = "vim.insert.background")]
pub vim_insert_background: Option<String>,
/// Background color for Vim Replace mode indicator.
#[serde(rename = "vim.replace.background")]
pub vim_replace_background: Option<String>,
/// Background color for Vim Visual mode indicator.
#[serde(rename = "vim.visual.background")]
pub vim_visual_background: Option<String>,
/// Background color for Vim Visual Line mode indicator.
#[serde(rename = "vim.visual_line.background")]
pub vim_visual_line_background: Option<String>,
/// Background color for Vim Visual Block mode indicator.
#[serde(rename = "vim.visual_block.background")]
pub vim_visual_block_background: Option<String>,
/// Background color for Vim Helix Normal mode indicator.
#[serde(rename = "vim.helix_normal.background")]
pub vim_helix_normal_background: Option<String>,
/// Background color for Vim Helix Select mode indicator.
#[serde(rename = "vim.helix_select.background")]
pub vim_helix_select_background: Option<String>,

/// Text color for Vim mode indicator label.
#[serde(rename = "vim.mode.text")]
pub vim_mode_text: Option<String>,
}

#[skip_serializing_none]
Expand Down
18 changes: 18 additions & 0 deletions crates/theme/src/default_colors.rs
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,15 @@ impl ThemeColors {
version_control_ignored: gray().light().step_12(),
version_control_conflict_marker_ours: green().light().step_10().alpha(0.5),
version_control_conflict_marker_theirs: blue().light().step_10().alpha(0.5),
vim_normal_background: system.transparent,
vim_insert_background: system.transparent,
vim_replace_background: system.transparent,
vim_visual_background: system.transparent,
vim_visual_line_background: system.transparent,
vim_visual_block_background: system.transparent,
vim_helix_normal_background: system.transparent,
vim_helix_select_background: system.transparent,
vim_mode_text: system.transparent,
}
}

Expand Down Expand Up @@ -280,6 +289,15 @@ impl ThemeColors {
version_control_ignored: gray().dark().step_12(),
version_control_conflict_marker_ours: green().dark().step_10().alpha(0.5),
version_control_conflict_marker_theirs: blue().dark().step_10().alpha(0.5),
vim_normal_background: system.transparent,
vim_insert_background: system.transparent,
vim_replace_background: system.transparent,
vim_visual_background: system.transparent,
vim_visual_line_background: system.transparent,
vim_visual_block_background: system.transparent,
vim_helix_normal_background: system.transparent,
vim_helix_select_background: system.transparent,
vim_mode_text: system.transparent,
}
}
}
Expand Down
10 changes: 10 additions & 0 deletions crates/theme/src/fallback_themes.rs
Original file line number Diff line number Diff line change
Expand Up @@ -233,6 +233,16 @@ pub(crate) fn zed_default_dark() -> Theme {
version_control_ignored: crate::gray().light().step_12(),
version_control_conflict_marker_ours: crate::green().light().step_12().alpha(0.5),
version_control_conflict_marker_theirs: crate::blue().light().step_12().alpha(0.5),

vim_normal_background: SystemColors::default().transparent,
vim_insert_background: SystemColors::default().transparent,
vim_replace_background: SystemColors::default().transparent,
vim_visual_background: SystemColors::default().transparent,
vim_visual_line_background: SystemColors::default().transparent,
vim_visual_block_background: SystemColors::default().transparent,
vim_helix_normal_background: SystemColors::default().transparent,
vim_helix_select_background: SystemColors::default().transparent,
vim_mode_text: SystemColors::default().transparent,
},
status: StatusColors {
conflict: yellow,
Expand Down
36 changes: 36 additions & 0 deletions crates/theme/src/schema.rs
Original file line number Diff line number Diff line change
Expand Up @@ -756,6 +756,42 @@ pub fn theme_colors_refinement(
.as_ref()
.or(this.version_control_conflict_theirs_background.as_ref())
.and_then(|color| try_parse_color(color).ok()),
vim_normal_background: this
.vim_normal_background
.as_ref()
.and_then(|color| try_parse_color(color).ok()),
vim_insert_background: this
.vim_insert_background
.as_ref()
.and_then(|color| try_parse_color(color).ok()),
vim_replace_background: this
.vim_replace_background
.as_ref()
.and_then(|color| try_parse_color(color).ok()),
vim_visual_background: this
.vim_visual_background
.as_ref()
.and_then(|color| try_parse_color(color).ok()),
vim_visual_line_background: this
.vim_visual_line_background
.as_ref()
.and_then(|color| try_parse_color(color).ok()),
vim_visual_block_background: this
.vim_visual_block_background
.as_ref()
.and_then(|color| try_parse_color(color).ok()),
vim_helix_normal_background: this
.vim_helix_normal_background
.as_ref()
.and_then(|color| try_parse_color(color).ok()),
vim_helix_select_background: this
.vim_helix_select_background
.as_ref()
.and_then(|color| try_parse_color(color).ok()),
vim_mode_text: this
.vim_mode_text
.as_ref()
.and_then(|color| try_parse_color(color).ok()),
}
}

Expand Down
19 changes: 19 additions & 0 deletions crates/theme/src/styles/colors.rs
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,25 @@ pub struct ThemeColors {
/// The border color of the minimap thumb.
pub minimap_thumb_border: Hsla,

/// Background color for Vim Normal mode indicator.
pub vim_normal_background: Hsla,
/// Background color for Vim Insert mode indicator.
pub vim_insert_background: Hsla,
/// Background color for Vim Replace mode indicator.
pub vim_replace_background: Hsla,
/// Background color for Vim Visual mode indicator.
pub vim_visual_background: Hsla,
/// Background color for Vim Visual Line mode indicator.
pub vim_visual_line_background: Hsla,
/// Background color for Vim Visual Block mode indicator.
pub vim_visual_block_background: Hsla,
/// Background color for Vim Helix Normal mode indicator.
pub vim_helix_normal_background: Hsla,
/// Background color for Vim Helix Select mode indicator.
pub vim_helix_select_background: Hsla,
/// Text color for Vim mode indicator label.
pub vim_mode_text: Hsla,

// ===
// Editor
// ===
Expand Down
76 changes: 64 additions & 12 deletions crates/vim/src/mode_indicator.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use gpui::{Context, Entity, Render, Subscription, WeakEntity, Window, div};
use gpui::{Context, Element, Entity, FontWeight, Render, Subscription, WeakEntity, Window, div};
use ui::text_for_keystrokes;
use workspace::{StatusItemView, item::ItemHandle, ui::prelude::*};

Expand Down Expand Up @@ -93,27 +93,79 @@ impl Render for ModeIndicator {
};

let vim_readable = vim.read(cx);
let label = if let Some(label) = vim_readable.status_label.clone() {
label
let status_label = vim_readable.status_label.clone();
let temp_mode = vim_readable.temp_mode;
let mode = vim_readable.mode;

let theme = cx.theme();
let colors = theme.colors();
let system_transparent = gpui::hsla(0.0, 0.0, 0.0, 0.0);
let vim_mode_text = colors.vim_mode_text;
let bg_color = match mode {
crate::state::Mode::Normal => colors.vim_normal_background,
crate::state::Mode::Insert => colors.vim_insert_background,
crate::state::Mode::Replace => colors.vim_replace_background,
crate::state::Mode::Visual => colors.vim_visual_background,
crate::state::Mode::VisualLine => colors.vim_visual_line_background,
crate::state::Mode::VisualBlock => colors.vim_visual_block_background,
crate::state::Mode::HelixNormal => colors.vim_helix_normal_background,
crate::state::Mode::HelixSelect => colors.vim_helix_select_background,
};

let (label, mode): (SharedString, Option<SharedString>) = if let Some(label) = status_label
{
(label, None)
} else {
let mode = if vim_readable.temp_mode {
format!("(insert) {}", vim_readable.mode)
let mode_str = if temp_mode {
format!("(insert) {}", mode)
} else {
vim_readable.mode.to_string()
mode.to_string()
};

let current_operators_description = self.current_operators_description(vim.clone(), cx);
let pending = self
.pending_keys
.as_ref()
.unwrap_or(&current_operators_description);
format!("{} -- {} --", pending, mode).into()
let mode = if bg_color != system_transparent {
mode_str.into()
} else {
format!("-- {} --", mode_str).into()
};
(pending.into(), Some(mode))
};

Label::new(label)
.size(LabelSize::Small)
.line_height_style(LineHeightStyle::UiLabel)
.into_any_element()
h_flex()
.gap_1()
.when(!label.is_empty(), |el| {
el.child(
Label::new(label)
.line_height_style(LineHeightStyle::UiLabel)
.weight(FontWeight::MEDIUM),
)
})
.when_some(mode, |el, mode| {
el.child(
v_flex()
.when(bg_color != system_transparent, |el| el.px_2())
// match with other icons at the bottom that use default buttons
.h(ButtonSize::Default.rems())
.justify_center()
.rounded_sm()
.bg(bg_color)
.child(
Label::new(mode)
.size(LabelSize::Small)
.line_height_style(LineHeightStyle::UiLabel)
.weight(FontWeight::MEDIUM)
.when(
bg_color != system_transparent
&& vim_mode_text != system_transparent,
|el| el.color(Color::Custom(vim_mode_text)),
),
),
)
})
.into_any()
}
}

Expand Down
Loading