feat: support configurable modified-key binding sequences

This commit is contained in:
2026-10-11 19:04:12 +02:00
parent 503342bff0
commit 2756b79f89
6 changed files with 411 additions and 184 deletions
+11 -11
View File
@@ -1592,10 +1592,10 @@ end
let mut session =
EditorSession::open(Some(buffer.clone()), vec!["text".into()], None).unwrap();
session.handle(Input::Char(' '));
assert_eq!(session.editor().leader_pending(), Some("Space"));
assert_eq!(session.editor().sequence_pending(), Some("Space"));
session.handle(Input::Char(' '));
assert!(session.editor().palette().is_some());
assert!(session.editor().leader_pending().is_none());
assert!(session.editor().sequence_pending().is_none());
session.handle(Input::Escape);
session.handle(Input::Char('i'));
session.handle(Input::Char('!'));
@@ -1636,15 +1636,15 @@ end
);
session.handle(Input::Char(','));
session.handle(Input::Char('z'));
assert_eq!(session.editor().leader_pending(), Some(", z"));
assert_eq!(session.editor().sequence_pending(), Some(", z"));
assert_eq!(session.editor().lines(), &["alpha"]);
session.handle(Input::Char('n'));
assert_eq!(session.editor().lines(), &["1:buffer.txt:alpha"]);
assert!(session.editor().leader_pending().is_none());
assert!(session.editor().sequence_pending().is_none());
session.handle(Input::Char(','));
session.handle(Input::Char('z'));
session.execute(&format!("edit {}", second.display()));
assert!(session.editor().leader_pending().is_none());
assert!(session.editor().sequence_pending().is_none());
for key in [',', 'z', 'n'] {
session.handle(Input::Char(key));
}
@@ -1713,7 +1713,7 @@ end
for key in ['3', ',', 'z', last] {
session.handle(Input::Char(key));
}
assert!(session.editor().leader_pending().is_none());
assert!(session.editor().sequence_pending().is_none());
assert_eq!(session.editor().lines(), &["abcdef"]);
session.handle(Input::Char('l'));
}
@@ -1722,7 +1722,7 @@ end
session.handle(Input::Char(key));
}
session.handle(Input::Paste("n:q!\n".into()));
assert!(session.editor().leader_pending().is_none());
assert!(session.editor().sequence_pending().is_none());
session.handle(Input::Char('l'));
assert_eq!(session.editor().cursor().column, 3);
assert_eq!(session.editor().lines(), &["abcdef"]);
@@ -1734,7 +1734,7 @@ end
session.handle(Input::Escape);
assert_eq!(session.editor().mode(), crate::editor::Mode::Visual);
assert_eq!(session.editor().selections(), selected);
assert!(session.editor().leader_pending().is_none());
assert!(session.editor().sequence_pending().is_none());
session.handle(Input::Char('h'));
assert_eq!(session.editor().cursor().column, 2);
assert_eq!(session.editor().lines(), &["abcdef"]);
@@ -1767,7 +1767,7 @@ end
session.handle(Input::Ctrl('f'));
assert_eq!(session.editor().cursor().column, 1);
session.handle(Input::Char(' '));
assert_eq!(session.editor().leader_pending(), Some("Space"));
assert_eq!(session.editor().sequence_pending(), Some("Space"));
session.handle(Input::Char('z'));
session.handle(Input::Char('n'));
assert_eq!(session.editor().lines(), &["healthy "]);
@@ -2183,7 +2183,7 @@ end
assert_eq!(session.editor().mode(), crate::editor::Mode::Normal);
session.handle(Input::Char(' '));
assert_eq!(session.editor().mode(), crate::editor::Mode::Command);
assert!(session.editor().leader_pending().is_none());
assert!(session.editor().sequence_pending().is_none());
for ch in "w界".chars() {
session.handle(Input::Char(ch));
}
@@ -2867,7 +2867,7 @@ end
assert_eq!(session.editor().lines(), &[String::new()], "{expression}");
session.handle(Input::Char(' '));
assert_eq!(
session.editor().leader_pending(),
session.editor().sequence_pending(),
Some("Space"),
"{expression}"
);