feat: add configurable diff modes and split orientation

This commit is contained in:
2026-10-12 23:43:15 +02:00
parent c35abe0f03
commit d1855dbdb7
14 changed files with 847 additions and 169 deletions
+73
View File
@@ -225,6 +225,7 @@ impl EditorSession {
));
}
editor.set_diff_context_options(config.diff_context_lines, config.diff_expand_lines);
editor.set_diff_display_options(config.diff_view_mode, config.diff_split_orientation);
if let Err(error) =
editor.set_chrome_config(config.top_bar, config.bottom_bar, config.labels)
{
@@ -1815,6 +1816,46 @@ end
assert_eq!(session.editor().lines(), &["a!bc"]);
}
#[test]
fn diff_display_preferences_survive_reopening() {
use crate::{diff::ViewMode, panes::SplitAxis};
let fixture = Fixture::new();
fixture.file("buffer.txt", "abc");
for (mode, orientation, expected_mode, expected_axis) in [
(
"unified",
"above_below",
ViewMode::Unified,
SplitAxis::Horizontal,
),
(
"split",
"above_below",
ViewMode::Split,
SplitAxis::Horizontal,
),
] {
let mut session = fixture.open(&format!(
r#"Vamp.configure do |config|
config.diff_view_mode = "{mode}"
config.diff_split_orientation = "{orientation}"
config.bind "n", config.core.right
end"#
));
session.handle(Input::Char('n'));
assert_eq!(session.editor().cursor().column, 1);
for _ in 0..2 {
session.execute("diff");
let diff = session.editor().diff().unwrap();
assert_eq!(diff.view_mode, expected_mode);
assert_eq!(diff.split_axis, expected_axis);
session.execute("diff.close");
assert!(session.editor().diff().is_none());
assert_eq!(session.editor().lines(), &["abc"]);
}
}
}
#[test]
fn no_config_uses_space_leader_for_palette_and_write() {
let fixture = Fixture::new();
@@ -3008,6 +3049,38 @@ end
("config.leader = 7", "leader key must be a String"),
("config.leader = nil", "leader key must be a String"),
(r#"config.leader = """#, "leader key must not be empty"),
(
r#"config.diff_view_mode = "invalid""#,
"diff view mode must be split or unified",
),
(
r#"config.diff_split_orientation = "invalid""#,
"diff split orientation must be left_right or above_below",
),
(
"config.diff_view_mode = 7",
"diff view mode must be a String",
),
(
"config.diff_view_mode = nil",
"diff view mode must be a String",
),
(
r#"config.diff_view_mode = """#,
"diff view mode must not be empty",
),
(
"config.diff_split_orientation = 7",
"diff split orientation must be a String",
),
(
"config.diff_split_orientation = nil",
"diff split orientation must be a String",
),
(
r#"config.diff_split_orientation = """#,
"diff split orientation must not be empty",
),
(
"config.file_explorer_side = 7",
"file explorer side must be a String",