From a11f583e33af4ee4a611c44534e8b425abbb3945 Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Fri, 18 Aug 2023 14:04:42 +1000 Subject: [PATCH] emacs-search: don't try to replace same string twice :A:Enter replaces but stays in same place. Repeating the command causes the replacement to be attempted again, which is bad if orig and new are different length. So detect and prevent this. Signed-off-by: NeilBrown --- DOC/TODO.md | 3 +- emacs-search.c | 8 +++++- tests.d/00-basic | 75 ++++++++++++++++++++++++------------------------ 3 files changed, 46 insertions(+), 40 deletions(-) diff --git a/DOC/TODO.md b/DOC/TODO.md index b9a7a706..3dab9911 100644 --- a/DOC/TODO.md +++ b/DOC/TODO.md @@ -33,7 +33,8 @@ the file. must ALWAYS be given. - [ ] write test view mode that treats each line in document as markup so markup can be tested more directly. -- [ ] in search-replace if you repeat :A-Enter, chars get deleted +- [X] in search-replace if you repeat :A-Enter, chars get deleted - if + replacement string is shorter. If longer, they get added. - [ ] I think I want a "Workspaces" concept, maybe tabbed set of tile collections. I would have one of mail and one for each project that I might be looking in. I have lots of documents, but few diff --git a/emacs-search.c b/emacs-search.c index 02dcb977..ab06c597 100644 --- a/emacs-search.c +++ b/emacs-search.c @@ -44,6 +44,7 @@ struct es_info { short wrapped; short backwards; short case_sensitive; + short replaced; }; static struct map *es_map, *er_map; @@ -316,6 +317,7 @@ DEF_CMD(search_again) call("search:highlight", esi->target); esi->matched = 0; + esi->replaced = 0; m = mark_dup(esi->start); str = call_ret(str, "doc:get-str", ci->home); if (str == NULL || strlen(str) == 0) @@ -503,10 +505,13 @@ DEF_CMD(do_replace) if (!new) return Enoarg; - if (esi->matched <= 0) + if (len < 0) return Efail; + if (esi->replaced) + return 1; if (!esi->target) return Efail; + esi->replaced = 1; m = mark_dup(esi->end); if (esi->backwards) { while (len > 0 && doc_next(esi->target, m) != WEOF) @@ -708,6 +713,7 @@ DEF_CMD(emacs_search) esi->s = NULL; esi->matched = 1; esi->wrapped = 0; + esi->replaced = 0; esi->backwards = ci->num & 1; p = pane_register(ci->focus, 0, &search_handle.c, esi); diff --git a/tests.d/00-basic b/tests.d/00-basic index 2a0ae1a5..5633aa19 100644 --- a/tests.d/00-basic +++ b/tests.d/00-basic @@ -438,67 +438,66 @@ Display 80,30 C89D7D07036FA2937843580743EAAD17 61,2 Key ":A:Enter" Display 80,30 DA887EB6EA75BDBF7E6343BB6E269BAD 61,2 Key ":A:Enter" -Display 80,30 AB753E7E3BA35F3C30090D55D6E990C9 61,2 Key ":Enter" -Display 80,30 8540F9299CFDD6C6F4D12B4549240268 61,2 -Display 80,30 CD12CFA6E4565E5D0FAC226E83FA2231 61,2 +Display 80,30 C384F07276544F1BD6678998345D648D 61,2 +Display 80,30 24C4E65F2513F6FFC77B0F11C5BF714B 61,2 Key ":ESC" -Display 80,30 25EC99911DB172B9F71E087BC6C57101 29,20 +Display 80,30 CD11F3189ACF483C830F2B16FF4CAB57 29,20 Key ":ESC" -Display 80,30 D86921AD0512FD3E81F2913F61BF1C94 29,20 +Display 80,30 B43C3BD308C084CDC7E3AF4847642B0A 29,20 Key ":C-S" -Display 80,30 25EC99911DB172B9F71E087BC6C57101 29,20 +Display 80,30 CD11F3189ACF483C830F2B16FF4CAB57 29,20 Key "-h" -Display 80,30 7224E6C2F6BB56A91F24FE3B7EDDB1BC 30,20 +Display 80,30 BA04BB1B4F5999462112F3D1A54946C9 30,20 Key "-a" -Display 80,30 4B3B23D020CF6C8F6F2FD0D8D72D4961 31,20 +Display 80,30 AC45C4ECAA0F743173158C23E5BCAF52 31,20 Key "-n" -Display 80,30 26B47DA693588A07ED240E55B5044A6D 32,20 +Display 80,30 AD9E028031179F77F4D6D614F5B54E4E 32,20 Key "-d" -Display 80,30 EE30F3721FD330FF78133AC7CA500B45 33,20 +Display 80,30 C1EA05C5522D14D27DC426FFAFB73A42 33,20 Key ":C-S" -Display 80,30 BCEA6FE8D514FD467B52C7D88F97AA38 50,0 +Display 80,30 0487C9F5A9131431D147ABCC5CFC97FC 50,0 Key "-h" -Display 80,30 70AE321845779E9D898AE12169B98585 51,0 -Display 80,30 8423DC8961693F4A939F537E04280682 51,0 +Display 80,30 44EFDBD0C887AD83BE48B6DF7F60E8D6 51,0 +Display 80,30 F9F18834AFDE5A9663994809A46544E9 51,0 Key "-a" -Display 80,30 C66E2EC858F118A713C25B8A01F560B5 52,0 -Display 80,30 A133EFAF095E5A283ACA2E58975EA4FD 52,0 +Display 80,30 BF5B23F2FA7B0C43C7333A56E88CAE80 52,0 +Display 80,30 2C2E160F54BC9C6821DC847F4578EEAC 52,0 Key "-n" -Display 80,30 AF99E09BE72EE72D5B3FC40955446817 53,0 -Display 80,30 D58189F40B63B4AEC99A015007789AE0 53,0 +Display 80,30 4D4840EA8AC507534A1D8ECA6B081607 53,0 +Display 80,30 CA51C0C01A7E40DF109F165E14AD2E84 53,0 Key "-d" -Display 80,30 BF5DBE9B71421CC91919BB89FC490642 54,0 -Display 80,30 12508055973F69BAD83F662D797D0859 54,0 +Display 80,30 AFA467DFBE26652F38869289222C43E3 54,0 +Display 80,30 76F1F86FD2E3D50251B77E2014C58912 54,0 Key "-l" -Display 80,30 0B66E0A4C964797D57A178972F36144B 55,0 -Display 80,30 2EBEB9E8A42DB26C89F7652ABC951A4C 55,0 +Display 80,30 12538496A651D35E62BCD2CF5BFB0CB5 55,0 +Display 80,30 217FFAC910F7D466E821D5678FDD3224 55,0 Key "-e" -Display 80,30 6EA503801ECE06E49E93EF19F23F0351 56,0 -Display 80,30 54D24D860EA914475BD3004339DB57AB 56,0 +Display 80,30 1D32244F5F19DCEB8FA917947DF61E74 56,0 +Display 80,30 C80B5FBEF3907721BAA014AFCC26E364 56,0 Key ":C-R" -Display 80,30 71B1DA8CDBB06E72DD3919C59FD0B689 64,0 -Display 80,30 0889C6008342226C47B4A4045D079D84 64,0 +Display 80,30 D002A8BA7E31F2BCFC3204250B92C2CD 64,0 +Display 80,30 ADB08C1FDADAF0261CD3353D72A50192 64,0 Key ":C-R" -Display 80,30 F9C1300FD0FF1FAF58101BD580FBDE66 64,0 -Display 80,30 0889C6008342226C47B4A4045D079D84 64,0 +Display 80,30 949FA93EF5F18658C143102AD09049DE 64,0 +Display 80,30 ADB08C1FDADAF0261CD3353D72A50192 64,0 Key ":C-R" -Display 80,30 2D28467D65472662EB8AA49D565F2879 64,0 -Display 80,30 0889C6008342226C47B4A4045D079D84 64,0 +Display 80,30 0AF0138010531830A4A88552A9C34F09 64,0 +Display 80,30 ADB08C1FDADAF0261CD3353D72A50192 64,0 Key ":C-R" -Display 80,30 88959622F59D716DE76A59152F12D9CE 64,0 -Display 80,30 0889C6008342226C47B4A4045D079D84 64,0 +Display 80,30 7BB7E6356378CDF944FCD11769215E06 64,0 +Display 80,30 ADB08C1FDADAF0261CD3353D72A50192 64,0 Key ":C-R" -Display 80,30 48DC7DE147DA13CFB871DB9B9B138157 64,0 -Display 80,30 0889C6008342226C47B4A4045D079D84 64,0 +Display 80,30 AF259A0200510007F8076F9D3AE5A16D 64,0 +Display 80,30 ADB08C1FDADAF0261CD3353D72A50192 64,0 Key ":Enter" -Display 80,30 C56088775E2D1F43E6B1AE21960533C9 39,12 +Display 80,30 78AFB97EA34E94F5CBA3E460423ACF4E 39,12 Key ":C-X" -Display 80,30 1DDA3EB8BD545775122754FBB14890C3 39,12 +Display 80,30 010846B81B25D0115BE2E53EC7E79465 39,12 Key "-3" -Display 80,30 A63760A4D6256A2DFACB69051F36440B 1,22 +Display 80,30 47E4CB690A59F7B06365597DC37A521F 1,22 Key ":C-X" -Display 80,30 4FB72326B29B11ACCF8789CFC4F6C0AA 1,22 +Display 80,30 9189CDE9629243154556C41B51A35934 1,22 Key "-2" Display 80,30 49DECBFB2A41E29F2A4E3D11414E63CD 1,6 Key ":C-X" @@ -603,4 +602,4 @@ Key ":C-X" Display 80,30 84F4B35BF26F9D5EEBB67D572ADD0BBF 1,0 Key ":C-C" Display 80,30 25679283B88265B98ADEB89F60C76D93 1,0 -Close 1581 +Close 1577 -- 2.39.5