feat: add configurable Space leader bindings
This commit is contained in:
+51
@@ -341,6 +341,9 @@ fn draw(frame: &mut Frame, editor: &Editor, top: &mut usize, left: &mut usize) {
|
||||
.map(|c| if c.is_control() { '�' } else { c })
|
||||
.collect();
|
||||
let mut status = format!(" {}", editor.mode());
|
||||
if let Some(sequence) = editor.leader_pending() {
|
||||
write!(status, " leader: {sequence}").unwrap();
|
||||
}
|
||||
if editor.buffer_count() > 1 {
|
||||
write!(
|
||||
status,
|
||||
@@ -545,6 +548,54 @@ mod tests {
|
||||
.join("\n")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn pending_leader_is_visible_before_long_paths_and_unknown_keys_do_not_edit() {
|
||||
let directory = Directory::new();
|
||||
let path = directory.file(&"long-path-".repeat(12), "keep");
|
||||
let mut editor = Editor::open(Some(path), vec![]).unwrap();
|
||||
let mut terminal = Terminal::new(ratatui::backend::TestBackend::new(40, 6)).unwrap();
|
||||
let (mut top, mut left) = (0, 0);
|
||||
editor.handle(Input::Char(' '));
|
||||
editor.handle(Input::Char('b'));
|
||||
terminal
|
||||
.draw(|frame| draw(frame, &editor, &mut top, &mut left))
|
||||
.unwrap();
|
||||
assert!(screen_text(&terminal).contains("leader: Space b"));
|
||||
editor.handle(Input::Char('x'));
|
||||
terminal
|
||||
.draw(|frame| draw(frame, &editor, &mut top, &mut left))
|
||||
.unwrap();
|
||||
assert!(!screen_text(&terminal).contains("leader:"));
|
||||
assert_eq!(editor.lines(), &["keep"]);
|
||||
assert_eq!(editor.cursor(), crate::editor::Cursor::default());
|
||||
assert_eq!(editor.mode(), Mode::Normal);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn palette_advertises_effective_leader_sequences_after_remapping() {
|
||||
let mut editor = Editor::open(None, vec![]).unwrap();
|
||||
editor.set_leader(",").unwrap();
|
||||
editor.handle(Input::Ctrl('p'));
|
||||
for ch in "bnext".chars() {
|
||||
editor.handle(Input::Char(ch));
|
||||
}
|
||||
let mut terminal = Terminal::new(ratatui::backend::TestBackend::new(100, 10)).unwrap();
|
||||
let (mut top, mut left) = (0, 0);
|
||||
terminal
|
||||
.draw(|frame| draw(frame, &editor, &mut top, &mut left))
|
||||
.unwrap();
|
||||
assert!(screen_text(&terminal).contains(", b n"));
|
||||
assert!(!screen_text(&terminal).contains("Space b n"));
|
||||
editor
|
||||
.bind("normal", ",", Some("core.command".into()))
|
||||
.unwrap();
|
||||
terminal
|
||||
.draw(|frame| draw(frame, &editor, &mut top, &mut left))
|
||||
.unwrap();
|
||||
assert!(screen_text(&terminal).contains("unbound"));
|
||||
assert!(!screen_text(&terminal).contains(", b n"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn buffer_switches_restore_independent_vertical_and_horizontal_viewports() {
|
||||
let directory = Directory::new();
|
||||
|
||||
Reference in New Issue
Block a user