]> git.neil.brown.name Git - edlib.git/commitdiff
emacs-search: don't try to replace same string twice
authorNeilBrown <neil@brown.name>
Fri, 18 Aug 2023 04:04:42 +0000 (14:04 +1000)
committerNeilBrown <neil@brown.name>
Fri, 18 Aug 2023 04:11:18 +0000 (14:11 +1000)
: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 <neil@brown.name>
DOC/TODO.md
emacs-search.c
tests.d/00-basic

index b9a7a706c6e7dd71a9a2948e899da934374051a5..3dab99113aa48e6c0f3fff74fc4dc6593f2d6b74 100644 (file)
@@ -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
index 02dcb977e3cd4d683fba3d84844bb25d56359a27..ab06c59739206113797a6efc519dcbd75b809b6f 100644 (file)
@@ -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);
index 2a0ae1a5a1ea6d2cf8d812ded82a57e2b0be7ae5..5633aa1913e579c9eb028338a20d5a22d34bedc7 100644 (file)
@@ -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