feat: support configurable modified-key binding sequences
This commit is contained in:
+344
-159
File diff suppressed because it is too large
Load Diff
+11
-11
@@ -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}"
|
||||
);
|
||||
|
||||
+32
-1
@@ -1432,7 +1432,7 @@ fn draw_status(frame: &mut Frame, editor: &Editor, syntax: &SyntaxCache, status_
|
||||
} else {
|
||||
format!(" {}", editor.mode())
|
||||
};
|
||||
if let Some(sequence) = editor.leader_pending() {
|
||||
if let Some(sequence) = editor.sequence_pending() {
|
||||
write!(status, " leader: {sequence}").unwrap();
|
||||
}
|
||||
if editor.g_pending() {
|
||||
@@ -5270,6 +5270,37 @@ mod tests {
|
||||
terminal.get_cursor_position().unwrap()
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn modified_sequences_navigate_diff_files_and_readonly_panes() {
|
||||
let mut editor = Editor::open(None, vec![]).unwrap();
|
||||
editor.handle(Input::Char('|'));
|
||||
install_readonly_diff(
|
||||
&mut editor,
|
||||
syntax_diff_file("history.txt", "before", "after"),
|
||||
);
|
||||
editor
|
||||
.bind("normal", "ctrl+w h", Some("core.pane.focus_left".into()))
|
||||
.unwrap();
|
||||
let mut terminal = Terminal::new(ratatui::backend::TestBackend::new(120, 30)).unwrap();
|
||||
let mut views = BufferViewports::default();
|
||||
render_native_diff(&mut terminal, &mut views, &mut editor);
|
||||
assert_eq!(editor.diff().unwrap().focus, Focus::Files);
|
||||
editor.handle(Input::Ctrl('w'));
|
||||
assert_eq!(editor.sequence_pending(), Some("Ctrl+w"));
|
||||
assert!(editor.diff().unwrap().files_visible);
|
||||
editor.handle(Input::Char('h'));
|
||||
assert_eq!(editor.diff().unwrap().focus, Focus::After);
|
||||
render_native_diff(&mut terminal, &mut views, &mut editor);
|
||||
editor.handle(Input::Ctrl('w'));
|
||||
editor.handle(Input::Char('h'));
|
||||
assert_eq!(editor.diff().unwrap().focus, Focus::Before);
|
||||
render_native_diff(&mut terminal, &mut views, &mut editor);
|
||||
editor.handle(Input::Ctrl('w'));
|
||||
editor.handle(Input::Char('h'));
|
||||
assert_eq!(editor.pane_id(), 1);
|
||||
assert_eq!(editor.sequence_pending(), None);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn wrap_toggle_preserves_caret_screen_row_in_normal_buffers() {
|
||||
let directory = Directory::new();
|
||||
|
||||
Reference in New Issue
Block a user