Make the commit editor's font size independently configurable (#56077)

- Add a separate `git_commit_buffer_font_size` setting, defaulting to
`12px` (the previous default before it was changed to use the buffer
font size)
- Add in-memory buffer font size overrides for zooming the commit modal
and in-panel editor

Self-Review Checklist:

- [x] I've reviewed my own diff for quality, security, and reliability
- [x] Unsafe blocks (if any) have justifying comments
- [x] The content is consistent with the [UI/UX
checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist)
- [ ] Tests cover the new/changed behavior
- [x] Performance impact has been considered and is acceptable

Release Notes:

- Added a `git_commit_buffer_font_size` setting and made the in-panel
and modal commit message editors zoomable.
This commit is contained in:
Cole Miller 2026-05-21 18:16:01 -04:00 committed by GitHub
parent f78f6da255
commit da66f95237
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 159 additions and 61 deletions

View file

@ -71,6 +71,8 @@
"agent_ui_font_size": null,
// The default font size for user messages in the agent panel.
"agent_buffer_font_size": 12,
// The default font size for the commit editor in the git panel and commit modal.
"git_commit_buffer_font_size": 12,
// How much to fade out unused code.
"unnecessary_code_fade": 0.3,
// Active pane styling settings.

View file

@ -1,6 +1,6 @@
use crate::branch_picker::{self, BranchList};
use crate::git_panel::{
GitPanel, commit_message_editor, commit_title_exceeds_limit, panel_editor_style,
GitPanel, commit_message_editor, commit_title_exceeds_limit, git_commit_editor_style,
};
use crate::git_panel_settings::GitPanelSettings;
use git::repository::CommitOptions;
@ -10,6 +10,7 @@ use settings::Settings;
use ui::{
ContextMenu, KeybindingHint, PopoverMenu, PopoverMenuHandle, SplitButton, Tooltip, prelude::*,
};
use zed_actions::{DecreaseBufferFontSize, IncreaseBufferFontSize, ResetBufferFontSize};
use editor::{Editor, EditorElement};
use gpui::*;
@ -228,8 +229,9 @@ impl CommitModal {
}
}
fn commit_editor_element(&self, window: &mut Window, cx: &mut Context<Self>) -> EditorElement {
let editor_style = panel_editor_style(true, window, cx);
fn commit_editor_element(&self, _window: &mut Window, cx: &mut Context<Self>) -> EditorElement {
let settings = theme_settings::ThemeSettings::get_global(cx);
let editor_style = git_commit_editor_style(settings.git_commit_buffer_font_size(cx), cx);
EditorElement::new(&self.commit_editor, editor_style)
}
@ -533,6 +535,39 @@ impl CommitModal {
self.branch_list_handle.toggle(window, cx);
}
}
fn increase_font_size(
&mut self,
action: &IncreaseBufferFontSize,
window: &mut Window,
cx: &mut Context<Self>,
) {
self.git_panel.update(cx, |git_panel, cx| {
git_panel.increase_font_size(action, window, cx);
});
}
fn decrease_font_size(
&mut self,
action: &DecreaseBufferFontSize,
window: &mut Window,
cx: &mut Context<Self>,
) {
self.git_panel.update(cx, |git_panel, cx| {
git_panel.decrease_font_size(action, window, cx);
});
}
fn reset_font_size(
&mut self,
action: &ResetBufferFontSize,
window: &mut Window,
cx: &mut Context<Self>,
) {
self.git_panel.update(cx, |git_panel, cx| {
git_panel.reset_font_size(action, window, cx);
});
}
}
impl Render for CommitModal {
@ -561,6 +596,9 @@ impl Render for CommitModal {
.on_action(cx.listener(Self::dismiss))
.on_action(cx.listener(Self::on_commit))
.on_action(cx.listener(Self::on_amend))
.on_action(cx.listener(Self::increase_font_size))
.on_action(cx.listener(Self::decrease_font_size))
.on_action(cx.listener(Self::reset_font_size))
.when(!DisableAiSettings::get_global(cx).disable_ai, |this| {
this.on_action(cx.listener(|this, _: &GenerateCommitMessage, _, cx| {
this.git_panel.update(cx, |panel, cx| {

View file

@ -65,7 +65,7 @@ use project::{
use prompt_store::{BuiltInPrompt, PromptId, PromptStore, RULES_FILE_NAMES};
use proto::RpcError;
use serde::{Deserialize, Serialize};
use settings::{Settings, SettingsStore, StatusStyle};
use settings::{Settings, SettingsStore, StatusStyle, update_settings_file};
use smallvec::SmallVec;
use std::future::Future;
use std::ops::Range;
@ -87,6 +87,7 @@ use workspace::{
dock::{DockPosition, Panel, PanelEvent},
notifications::{DetachAndPromptErr, ErrorMessagePrompt, NotificationId, NotifyResultExt},
};
use zed_actions::{DecreaseBufferFontSize, IncreaseBufferFontSize, ResetBufferFontSize};
actions!(
git_panel,
@ -3456,6 +3457,54 @@ impl GitPanel {
}
}
pub(crate) fn increase_font_size(
&mut self,
action: &IncreaseBufferFontSize,
_: &mut Window,
cx: &mut Context<Self>,
) {
self.handle_font_size_action(action.persist, px(1.0), cx);
}
pub(crate) fn decrease_font_size(
&mut self,
action: &DecreaseBufferFontSize,
_: &mut Window,
cx: &mut Context<Self>,
) {
self.handle_font_size_action(action.persist, px(-1.0), cx);
}
fn handle_font_size_action(&mut self, persist: bool, delta: Pixels, cx: &mut Context<Self>) {
if persist {
update_settings_file(self.fs.clone(), cx, move |settings, cx| {
let git_commit_buffer_font_size =
ThemeSettings::get_global(cx).git_commit_buffer_font_size(cx) + delta;
let _ = settings.theme.git_commit_buffer_font_size.insert(
f32::from(theme_settings::clamp_font_size(git_commit_buffer_font_size)).into(),
);
});
} else {
theme_settings::adjust_git_commit_buffer_font_size(cx, |size| size + delta);
}
}
pub(crate) fn reset_font_size(
&mut self,
action: &ResetBufferFontSize,
_: &mut Window,
cx: &mut Context<Self>,
) {
if action.persist {
update_settings_file(self.fs.clone(), cx, move |settings, _| {
settings.theme.git_commit_buffer_font_size = None;
});
} else {
theme_settings::reset_git_commit_buffer_font_size(cx);
}
}
fn toggle_directory(&mut self, key: &TreeKey, window: &mut Window, cx: &mut Context<Self>) {
if let Some(state) = self.view_mode.tree_state_mut() {
let expanded = state.expanded_dirs.entry(key.clone()).or_insert(true);
@ -4555,7 +4604,9 @@ impl GitPanel {
cx: &mut Context<Self>,
) -> Option<impl IntoElement> {
let active_repository = self.active_repository.clone()?;
let panel_editor_style = panel_editor_style(true, window, cx);
let settings = ThemeSettings::get_global(cx);
let panel_editor_style =
git_commit_editor_style(settings.git_commit_buffer_font_size(cx), cx);
let enable_coauthors = self.render_co_authors(cx);
let editor_focus_handle = self.commit_editor.focus_handle(cx);
let branch = active_repository.read(cx).branch.clone();
@ -6626,6 +6677,9 @@ impl Render for GitPanel {
})
.on_action(cx.listener(Self::toggle_sort_by_path))
.on_action(cx.listener(Self::toggle_tree_view))
.on_action(cx.listener(Self::increase_font_size))
.on_action(cx.listener(Self::decrease_font_size))
.on_action(cx.listener(Self::reset_font_size))
.on_action(cx.listener(Self::activate_changes_tab))
.on_action(cx.listener(Self::activate_history_tab))
.size_full()
@ -6790,42 +6844,20 @@ pub fn panel_editor_container(_window: &mut Window, cx: &mut App) -> Div {
.bg(cx.theme().colors().editor_background)
}
pub(crate) fn panel_editor_style(monospace: bool, window: &Window, cx: &App) -> EditorStyle {
pub(crate) fn git_commit_editor_style(font_size: gpui::Pixels, cx: &App) -> EditorStyle {
let settings = ThemeSettings::get_global(cx);
let (font_family, font_fallbacks, font_features, font_size, font_weight, line_height) =
if monospace {
let font_size = settings.buffer_font_size(cx);
(
settings.buffer_font.family.clone(),
settings.buffer_font.fallbacks.clone(),
settings.buffer_font.features.clone(),
AbsoluteLength::from(font_size),
settings.buffer_font.weight,
font_size * settings.buffer_line_height.value(),
)
} else {
(
settings.ui_font.family.clone(),
settings.ui_font.fallbacks.clone(),
settings.ui_font.features.clone(),
AbsoluteLength::from(TextSize::Small.rems(cx)),
settings.ui_font.weight,
window.line_height(),
)
};
EditorStyle {
background: cx.theme().colors().editor_background,
local_player: cx.theme().players().local(),
text: TextStyle {
color: cx.theme().colors().text,
font_family,
font_fallbacks,
font_features,
font_size,
font_weight,
line_height: line_height.into(),
font_family: settings.buffer_font.family.clone(),
font_fallbacks: settings.buffer_font.fallbacks.clone(),
font_features: settings.buffer_font.features.clone(),
font_size: AbsoluteLength::from(font_size),
font_weight: settings.buffer_font.weight,
line_height: (font_size * settings.buffer_line_height.value()).into(),
..Default::default()
},
syntax: cx.theme().syntax().clone(),
@ -9150,25 +9182,4 @@ mod tests {
));
});
}
#[gpui::test]
async fn test_panel_editor_style_uses_buffer_font_size(cx: &mut TestAppContext) {
init_test(cx);
cx.update(|cx| {
SettingsStore::update_global(cx, |store, cx| {
store.update_user_settings(cx, |settings| {
settings.theme.buffer_font_size = Some(20.0.into());
});
});
});
cx.add_window(|window, cx| {
let style = panel_editor_style(true, window, cx);
assert_eq!(style.text.font_size.to_pixels(window.rem_size()), px(20.0));
Editor::single_line(window, cx)
});
}
}

View file

@ -977,6 +977,7 @@ impl VsCodeSettings {
buffer_font_features: None,
agent_ui_font_size: None,
agent_buffer_font_size: None,
git_commit_buffer_font_size: None,
markdown_preview_font_family: None,
markdown_preview_code_font_family: None,
markdown_preview_theme: None,

View file

@ -149,6 +149,7 @@ pub struct ThemeSettingsContent {
pub agent_ui_font_size: Option<FontSize>,
/// The font size for user messages in the agent panel.
pub agent_buffer_font_size: Option<FontSize>,
pub git_commit_buffer_font_size: Option<FontSize>,
/// The name of a font to use for rendering in the markdown preview.
/// Falls back to the UI font if unset.
pub markdown_preview_font_family: Option<FontFamilyName>,

View file

@ -56,6 +56,7 @@ pub struct ThemeSettings {
agent_ui_font_size: Option<Pixels>,
/// The agent buffer font size. Determines the size of user messages in the agent panel.
agent_buffer_font_size: Option<Pixels>,
git_commit_buffer_font_size: Option<Pixels>,
/// The font family to use for rendering in the markdown preview.
/// Falls back to the UI font family if unset.
markdown_preview_font_family: Option<SharedString>,
@ -118,6 +119,11 @@ pub struct AgentBufferFontSize(Pixels);
impl Global for AgentBufferFontSize {}
#[derive(Default)]
pub struct GitCommitBufferFontSize(Pixels);
impl Global for GitCommitBufferFontSize {}
/// Represents the selection of a theme, which can be either static or dynamic.
#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq, Eq)]
#[serde(untagged)]
@ -410,6 +416,14 @@ impl ThemeSettings {
.unwrap_or_else(|| self.buffer_font_size(cx))
}
pub fn git_commit_buffer_font_size(&self, cx: &App) -> Pixels {
cx.try_global::<GitCommitBufferFontSize>()
.map(|size| size.0)
.or(self.git_commit_buffer_font_size)
.map(clamp_font_size)
.unwrap_or_else(|| self.buffer_font_size(cx))
}
/// Returns the font family to use in the markdown preview,
/// falling back to the UI font family when unset.
pub fn markdown_preview_font_family(&self) -> &SharedString {
@ -458,6 +472,10 @@ impl ThemeSettings {
self.agent_buffer_font_size
}
pub fn git_commit_buffer_font_size_settings(&self) -> Option<Pixels> {
self.git_commit_buffer_font_size
}
/// Returns the buffer's line height.
pub fn line_height(&self) -> f32 {
f32::max(self.buffer_line_height.value(), MIN_LINE_HEIGHT)
@ -609,6 +627,22 @@ pub fn reset_agent_buffer_font_size(cx: &mut App) {
}
}
pub fn adjust_git_commit_buffer_font_size(cx: &mut App, f: impl FnOnce(Pixels) -> Pixels) {
let git_commit_buffer_font_size = ThemeSettings::get_global(cx).git_commit_buffer_font_size(cx);
let adjusted_size = cx
.try_global::<GitCommitBufferFontSize>()
.map_or(git_commit_buffer_font_size, |adjusted_size| adjusted_size.0);
cx.set_global(GitCommitBufferFontSize(clamp_font_size(f(adjusted_size))));
cx.refresh_windows();
}
pub fn reset_git_commit_buffer_font_size(cx: &mut App) {
if cx.has_global::<GitCommitBufferFontSize>() {
cx.remove_global::<GitCommitBufferFontSize>();
cx.refresh_windows();
}
}
/// Ensures font size is within the valid range.
pub fn clamp_font_size(size: Pixels) -> Pixels {
size.clamp(MIN_FONT_SIZE, MAX_FONT_SIZE)
@ -658,6 +692,7 @@ impl settings::Settings for ThemeSettings {
buffer_line_height: content.buffer_line_height.unwrap().into(),
agent_ui_font_size: content.agent_ui_font_size.map(|s| s.into_gpui()),
agent_buffer_font_size: content.agent_buffer_font_size.map(|s| s.into_gpui()),
git_commit_buffer_font_size: content.git_commit_buffer_font_size.map(|s| s.into_gpui()),
markdown_preview_font_family: content
.markdown_preview_font_family
.as_ref()

View file

@ -28,12 +28,14 @@ pub use crate::schema::{
};
use crate::settings::adjust_buffer_font_size;
pub use crate::settings::{
AgentBufferFontSize, AgentUiFontSize, BufferLineHeight, FontFamilyName, IconThemeName,
IconThemeSelection, ThemeAppearanceMode, ThemeName, ThemeSelection, ThemeSettings,
adjust_agent_buffer_font_size, adjust_agent_ui_font_size, adjust_ui_font_size,
adjusted_font_size, appearance_to_mode, clamp_font_size, default_theme,
observe_buffer_font_size_adjustment, reset_agent_buffer_font_size, reset_agent_ui_font_size,
reset_buffer_font_size, reset_ui_font_size, set_icon_theme, set_mode, set_theme, setup_ui_font,
AgentBufferFontSize, AgentUiFontSize, BufferLineHeight, FontFamilyName,
GitCommitBufferFontSize, IconThemeName, IconThemeSelection, ThemeAppearanceMode, ThemeName,
ThemeSelection, ThemeSettings, adjust_agent_buffer_font_size, adjust_agent_ui_font_size,
adjust_git_commit_buffer_font_size, adjust_ui_font_size, adjusted_font_size,
appearance_to_mode, clamp_font_size, default_theme, observe_buffer_font_size_adjustment,
reset_agent_buffer_font_size, reset_agent_ui_font_size, reset_buffer_font_size,
reset_git_commit_buffer_font_size, reset_ui_font_size, set_icon_theme, set_mode, set_theme,
setup_ui_font,
};
pub use theme::UiDensity;
@ -87,6 +89,8 @@ pub fn init(themes_to_load: LoadThemes, cx: &mut App) {
let mut prev_ui_font_size_settings = settings.ui_font_size_settings();
let mut prev_agent_ui_font_size_settings = settings.agent_ui_font_size_settings();
let mut prev_agent_buffer_font_size_settings = settings.agent_buffer_font_size_settings();
let mut prev_git_commit_buffer_font_size_settings =
settings.git_commit_buffer_font_size_settings();
let mut prev_theme_name = settings.theme.name(SystemAppearance::global(cx).0);
let mut prev_icon_theme_name = settings.icon_theme.name(SystemAppearance::global(cx).0);
let mut prev_theme_overrides = (
@ -101,6 +105,7 @@ pub fn init(themes_to_load: LoadThemes, cx: &mut App) {
let ui_font_size_settings = settings.ui_font_size_settings();
let agent_ui_font_size_settings = settings.agent_ui_font_size_settings();
let agent_buffer_font_size_settings = settings.agent_buffer_font_size_settings();
let git_commit_buffer_font_size_settings = settings.git_commit_buffer_font_size_settings();
let theme_name = settings.theme.name(SystemAppearance::global(cx).0);
let icon_theme_name = settings.icon_theme.name(SystemAppearance::global(cx).0);
let theme_overrides = (
@ -128,6 +133,11 @@ pub fn init(themes_to_load: LoadThemes, cx: &mut App) {
reset_agent_buffer_font_size(cx);
}
if git_commit_buffer_font_size_settings != prev_git_commit_buffer_font_size_settings {
prev_git_commit_buffer_font_size_settings = git_commit_buffer_font_size_settings;
reset_git_commit_buffer_font_size(cx);
}
if theme_name != prev_theme_name || theme_overrides != prev_theme_overrides {
prev_theme_name = theme_name;
prev_theme_overrides = theme_overrides;