on master help sign in
Change how macros separate keypresses

* Keypresses are no longer separated by spaces * Single-character keypresses are serialized as-is * Multi-character keypresses are delimited by `<>`

commit2d4bc0aec743c6d62344da6fda2c0c84e75a82be authorOmnikar <omnikar5@gmail.com> dateSun 12 Dec 2021, 10:36 (5 years ago) parentee3eb40
1 file changed+41−5
helix-term/src/commands.rs+41−5
helix-term/src/commands.rs+41−5
@@ -6015,9 +6015,15 @@ fn record_macro(cx: &mut Context) {
60156015 keys.pop();
60166016 let s = keys
60176017 .into_iter()
6018− .map(|key| key.to_string())
6019− .collect::<Vec<_>>()
6020− .join(" ");
6018+ .map(|key| {
6019+ let s = key.to_string();
6020+ if s.chars().count() == 1 {
6021+ s
6022+ } else {
6023+ format!("<{}>", s)
6024+ }
6025+ })
6026+ .collect::<String>();
60216027 cx.editor.registers.get_mut(reg).write(vec![s]);
60226028 cx.editor
60236029 .set_status(format!("Recorded to register [{}]", reg));
@@ -6032,8 +6038,38 @@ fn record_macro(cx: &mut Context) {
60326038fn replay_macro(cx: &mut Context) {
60336039 let reg = cx.register.unwrap_or('@');
60346040 // TODO: macro keys should be parsed one by one and not space delimited (see kak)
6035− let keys: Vec<KeyEvent> = if let Some([keys]) = cx.editor.registers.read(reg) {
6036− match keys.split_whitespace().map(str::parse).collect() {
6041+ let keys: Vec<KeyEvent> = if let Some([keys_str]) = cx.editor.registers.read(reg) {
6042+ let mut keys_res: anyhow::Result<_> = Ok(Vec::new());
6043+ let mut i = 0;
6044+ while let Ok(keys) = &mut keys_res {
6045+ if i >= keys_str.len() {
6046+ break;
6047+ }
6048+ if !keys_str.is_char_boundary(i) {
6049+ i += 1;
6050+ continue;
6051+ }
6052+
6053+ let s = &keys_str[i..];
6054+ let mut end_i = 1;
6055+ while !s.is_char_boundary(end_i) {
6056+ end_i += 1;
6057+ }
6058+ let c = &s[..end_i];
6059+ if c != "<" {
6060+ keys.push(c);
6061+ i += end_i;
6062+ } else {
6063+ match s.find('>').context("'>' expected") {
6064+ Ok(end_i) => {
6065+ keys.push(&s[1..end_i]);
6066+ i += end_i + 1;
6067+ }
6068+ Err(err) => keys_res = Err(err),
6069+ }
6070+ }
6071+ }
6072+ match keys_res.and_then(|keys| keys.into_iter().map(str::parse).collect()) {
60376073 Ok(keys) => keys,
60386074 Err(err) => {
60396075 cx.editor.set_error(format!("Invalid macro: {}", err));