mirror of
https://github.com/helix-editor/helix.git
synced 2024-11-22 09:26:19 +04:00
Fix recursive macro crash and empty macro lockout (#2902)
This commit is contained in:
parent
ac1d8fa505
commit
030de46e6b
@ -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();
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user