Fix recursive macro crash and empty macro lockout (#2902)

This commit is contained in:
PabloMansanet 2022-06-28 21:30:27 +09:00 committed by GitHub
parent ac1d8fa505
commit 030de46e6b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -4655,8 +4655,6 @@ fn replay_macro(cx: &mut Context) {
return;
}
cx.editor.macro_replaying.push(reg);
let keys: Vec<KeyEvent> = if let Some([keys_str]) = cx.editor.registers.read(reg) {
match helix_view::input::parse_macro(keys_str) {
Ok(keys) => keys,
@ -4670,6 +4668,10 @@ fn replay_macro(cx: &mut Context) {
return;
};
// Once the macro has been fully validated, it's marked as being under replay
// to ensure we don't fall into infinite recursion.
cx.editor.macro_replaying.push(reg);
let count = cx.count();
cx.callback = Some(Box::new(move |compositor, cx| {
for _ in 0..count {
@ -4677,7 +4679,9 @@ fn replay_macro(cx: &mut Context) {
compositor.handle_event(crossterm::event::Event::Key(key.into()), cx);
}
}
// The macro under replay is cleared at the end of the callback, not in the
// macro replay context, or it will not correctly protect the user from
// replaying recursively.
cx.editor.macro_replaying.pop();
}));
cx.editor.macro_replaying.pop();
}