feat: add Visual selection and clipboard editing

This commit is contained in:
Valdemar Lorenzen
2026-10-06 12:45:08 +02:00
parent 6104b73fdb
commit f775ff3b59
8 changed files with 596 additions and 44 deletions
+49
View File
@@ -404,6 +404,55 @@ end
assert!(session.editor().should_quit());
}
#[test]
fn typed_visual_actions_copy_cut_paste_and_cancel_without_splitting_history() {
let fixture = Fixture::new();
fixture.file("buffer.txt", "one two");
let mut session = fixture.open(
r#"
Vamp.configure do |config|
config.bind "v", nil
config.bind "ctrl+v", config.core.select
config.bind "ctrl+c", config.core.copy, mode: config.modes.visual
config.bind "ctrl+x", config.core.cut, mode: config.modes.visual
config.bind "ctrl+g", config.core.normal, mode: config.modes.visual
config.bind "ctrl+f", config.core.word_end, mode: config.modes.visual
config.bind "ctrl+b", config.core.paste_before
config.bind "ctrl+p", config.core.paste_after
end
"#,
);
session.handle(Input::Char('v'));
assert_eq!(session.editor().mode(), crate::editor::Mode::Normal);
session.handle(Input::Ctrl('v'));
assert_eq!(session.editor().mode(), crate::editor::Mode::Visual);
session.handle(Input::Ctrl('f'));
assert_eq!(session.editor().selection().unwrap().end.column, 3);
session.handle(Input::Ctrl('c'));
assert_eq!(session.editor().mode(), crate::editor::Mode::Normal);
assert!(!session.editor().dirty());
session.handle(Input::Ctrl('p'));
assert_eq!(session.editor().lines(), &["oonene two"]);
session.handle(Input::Char('u'));
assert_eq!(session.editor().lines(), &["one two"]);
session.handle(Input::Ctrl('v'));
session.handle(Input::Ctrl('f'));
session.handle(Input::Ctrl('x'));
assert_eq!(session.editor().lines(), &[" two"]);
assert_eq!(session.editor().mode(), crate::editor::Mode::Normal);
session.handle(Input::Ctrl('b'));
assert_eq!(session.editor().lines(), &["one two"]);
session.handle(Input::Char('u'));
assert_eq!(session.editor().lines(), &[" two"]);
session.handle(Input::Char('u'));
assert_eq!(session.editor().lines(), &["one two"]);
assert!(!session.editor().dirty());
session.handle(Input::Ctrl('v'));
session.handle(Input::Ctrl('g'));
assert_eq!(session.editor().mode(), crate::editor::Mode::Normal);
assert_eq!(session.editor().selection(), None);
}
#[test]
fn typed_word_motions_remap_keys_and_keep_insert_typing_in_one_undo_group() {
let fixture = Fixture::new();