feat: add Visual change with grouped replacement undo

This commit is contained in:
Valdemar Lorenzen
2026-10-06 13:18:57 +02:00
parent f775ff3b59
commit 53fcd7a1f2
7 changed files with 185 additions and 16 deletions
+41
View File
@@ -404,6 +404,47 @@ end
assert!(session.editor().should_quit());
}
#[test]
fn typed_visual_change_remaps_c_and_command_execution_commits_one_replacement() {
let fixture = Fixture::new();
fixture.file("buffer.txt", "abc DEF tail");
let mut session = fixture.open(
r#"
Vamp.configure do |config|
config.bind "c", nil, mode: config.modes.visual
config.bind "ctrl+r", config.core.change, mode: config.modes.visual
config.bind "ctrl+v", config.core.select
config.bind "ctrl+f", config.core.word_end, mode: config.modes.visual
end
"#,
);
session.handle(Input::Char('c'));
assert_eq!(session.editor().mode(), crate::editor::Mode::Normal);
assert!(!session.editor().dirty());
session.handle(Input::Ctrl('v'));
session.handle(Input::Ctrl('f'));
session.handle(Input::Char('c'));
assert_eq!(session.editor().mode(), crate::editor::Mode::Visual);
assert_eq!(session.editor().lines(), &["abc DEF tail"]);
session.handle(Input::Ctrl('r'));
assert_eq!(session.editor().mode(), crate::editor::Mode::Insert);
assert_eq!(session.editor().cursor().column, 0);
assert_eq!(session.editor().lines(), &[" DEF tail"]);
for ch in "cZ".chars() {
session.handle(Input::Char(ch));
}
session.execute("w");
assert_eq!(session.editor().mode(), crate::editor::Mode::Normal);
assert_eq!(
fs::read_to_string(fixture.0.join("buffer.txt")).unwrap(),
"cZ DEF tail"
);
session.handle(Input::Char('u'));
assert_eq!(session.editor().lines(), &["abc DEF tail"]);
session.handle(Input::Char('P'));
assert_eq!(session.editor().lines(), &["ababcc DEF tail"]);
}
#[test]
fn typed_visual_actions_copy_cut_paste_and_cancel_without_splitting_history() {
let fixture = Fixture::new();