on master help sign in
Fix crash due to cycles when replaying macros (#2647)
b2bd87dgavynriebau
helix-term/src/commands.rs+13
@@ -4617,6 +4617,17 @@ fn record_macro(cx: &mut Context) {
4617
4617
4618fn replay_macro(cx: &mut Context) {
4618fn replay_macro(cx: &mut Context) {
4619 let reg = cx.register.unwrap_or('@');
4619 let reg = cx.register.unwrap_or('@');
4620+
4621+ if cx.editor.macro_replaying.contains(&reg) {
4622+ cx.editor.set_error(format!(
4623+ "Cannot replay from register [{}] because already replaying from same register",
4624+ reg
4625+ ));
4626+ return;
4627+ }
4628+
4629+ cx.editor.macro_replaying.push(reg);
4630+
4620 let keys: Vec<KeyEvent> = if let Some([keys_str]) = cx.editor.registers.read(reg) {
4631 let keys: Vec<KeyEvent> = if let Some([keys_str]) = cx.editor.registers.read(reg) {
4621 match helix_view::input::parse_macro(keys_str) {
4632 match helix_view::input::parse_macro(keys_str) {
4622 Ok(keys) => keys,
4633 Ok(keys) => keys,
@@ -4638,4 +4649,6 @@ fn replay_macro(cx: &mut Context) {
4638 }
4649 }
4639 }
4650 }
4640 }));
4651 }));
4652+
4653+ cx.editor.macro_replaying.pop();
4641}
4654}
helix-view/src/editor.rs+2
@@ -433,6 +433,7 @@ pub struct Editor {
433 pub selected_register: Option<char>,
433 pub selected_register: Option<char>,
434 pub registers: Registers,
434 pub registers: Registers,
435 pub macro_recording: Option<(char, Vec<KeyEvent>)>,
435 pub macro_recording: Option<(char, Vec<KeyEvent>)>,
436+ pub macro_replaying: Vec<char>,
436 pub theme: Theme,
437 pub theme: Theme,
437 pub language_servers: helix_lsp::Registry,
438 pub language_servers: helix_lsp::Registry,
438
439
@@ -503,6 +504,7 @@ impl Editor {
503 count: None,
504 count: None,
504 selected_register: None,
505 selected_register: None,
505 macro_recording: None,
506 macro_recording: None,
507+ macro_replaying: Vec::new(),
506 theme: theme_loader.default(),
508 theme: theme_loader.default(),
507 language_servers,
509 language_servers,
508 debugger: None,
510 debugger: None,