From 6bf26ebadd9ac7b0d4c6132ddb102f62c4d3939d Mon Sep 17 00:00:00 2001 From: rmkaplan Date: Thu, 6 Mar 2025 20:23:39 -0800 Subject: [PATCH] TEDIT-FIND: Display after substitute should not be garbled --- library/tedit/TEDIT-FIND | 93 ++++++++++++++++++++-------------- library/tedit/TEDIT-FIND.LCOM | Bin 7873 -> 8039 bytes 2 files changed, 56 insertions(+), 37 deletions(-) diff --git a/library/tedit/TEDIT-FIND b/library/tedit/TEDIT-FIND index aa4d5ab1..12414eb6 100644 --- a/library/tedit/TEDIT-FIND +++ b/library/tedit/TEDIT-FIND @@ -1,12 +1,12 @@ (DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) -(FILECREATED "17-Feb-2025 12:25:36" {WMEDLEY}tedit>TEDIT-FIND.;136 36884 +(FILECREATED " 6-Mar-2025 20:18:04" {WMEDLEY}TEDIT>TEDIT-FIND.;138 38227 :EDIT-BY rmk - :CHANGES-TO (FNS \TEDIT.BASICFIND) + :CHANGES-TO (FNS TEDIT.SUBSTITUTE) - :PREVIOUS-DATE "15-Feb-2025 18:08:55" {WMEDLEY}tedit>TEDIT-FIND.;135) + :PREVIOUS-DATE "17-Feb-2025 12:25:36" {WMEDLEY}TEDIT>TEDIT-FIND.;136) (PRETTYCOMPRINT TEDIT-FINDCOMS) @@ -94,7 +94,8 @@ (CAR (\TEDIT.BASICFIND.BACKWARD TSTREAM TARGET START END))))])]) (TEDIT.SUBSTITUTE - [LAMBDA (TSTREAM PATTERN REPLACEMENT CONFIRM?) (* ; "Edited 8-Dec-2024 15:47 by rmk") + [LAMBDA (TSTREAM PATTERN REPLACEMENT CONFIRM?) (* ; "Edited 6-Mar-2025 20:17 by rmk") + (* ; "Edited 8-Dec-2024 15:47 by rmk") (* ; "Edited 26-Nov-2024 23:49 by rmk") (* ; "Edited 15-Aug-2024 09:20 by rmk") (* ; "Edited 14-Jul-2024 00:24 by rmk") @@ -123,11 +124,10 @@ (* ;; "Don't call \TEDIT.GET.TARGET.STRING because it might pick the search-domain (current selection) as the search string. If the search pattern is empty, bail out.") - [CL:UNLESS (SETQ SEARCHSTRING (OR PATTERN (TEDIT.GETINPUT TEXTOBJ "Search string:" - (GETTEXTPROP TEXTOBJ - ' - TEDIT.LAST.SUBSTITUTE.STRING - ] + (CL:UNLESS SEARCHSTRING + [SETQ SEARCHSTRING (OR PATTERN (TEDIT.GETINPUT TEXTOBJ "Search string:" + (GETTEXTPROP TEXTOBJ + 'TEDIT.LAST.SUBSTITUTE.STRING]) (CL:UNLESS [OR REPLACEMENT (SETQ REPLACEMENT (TEDIT.GETINPUT TEXTOBJ "Replace string:" (GETTEXTPROP TEXTOBJ @@ -137,16 +137,17 @@ ] (TEDIT.PROMPTPRINT TEXTOBJ "[Aborted]") (RETURN)) - [RESETSAVE (\TEDIT.MARKACTIVE TEXTOBJ) + [RESETSAVE (\TEDIT.MARKACTIVE TEXTOBJ "Substitute") '(PROGN (\TEDIT.MARKINACTIVE OLDVALUE] (if (type? SELPIECES REPLACEMENT) elseif (OR (STRINGP REPLACEMENT) (LITATOM REPLACEMENT)) - then (SETQ REPLACEMENT (\TEDIT.SELPIECES.FROM.STRING REPLACEMENT TEXTOBJ))) + then (SETQ REPLACEMENT (\TEDIT.SELPIECES.FROM.STRING REPLACEMENT TEXTOBJ)) + else (RETURN NIL)) (* ;; "Could be NIL or empty string, meaning just delete all occurrences.") - (SETQ REPLACE-LEN (fetch (SELPIECES SPLEN) of REPLACEMENT)) + (SETQ REPLACE-LEN (GETSPC REPLACEMENT SPLEN)) (SETQ ACTIONSTRING (CL:IF (ZEROP REPLACE-LEN) "delet" "substitut")) @@ -163,7 +164,7 @@ (TEDIT.PROMPTPRINT TEXTOBJ (CONCAT (L-CASE ACTIONSTRING T) "ing...") T) - (SETQ SEL (fetch (TEXTOBJ SEL) of TEXTOBJ)) + (SETQ SEL (FGETTOBJ TEXTOBJ SEL)) (\TEDIT.SHOWSEL SEL NIL TEXTOBJ) (\TEDIT.RESET.EXTEND.PENDING.DELETE TEXTOBJ) (* ; "Turn off any blue pending delete") @@ -174,31 +175,39 @@ [SETQ ENDCHAR# (CL:IF (ZEROP (GETSEL SEL DCH)) (GETTOBJ TEXTOBJ TEXTLEN) (IPLUS STARTCHAR# (SUB1 (GETSEL SEL DCH))))] + + (* ;; + "NOTE: SEARCHSTRING may contain wild cards, so the hits may be of different lengths.") + [if CONFIRMFLG then (* ;; "In this case the selection moves along, ending up at the last hit.") - [bind PENDING.SEL CHOICE while (SETQ RANGE (TEDIT.FIND TEXTOBJ - SEARCHSTRING STARTCHAR# - ENDCHAR# T)) + (bind (LASTSEL _ (\TEDIT.COPYSEL SEL)) + while (SETQ RANGE (TEDIT.FIND TEXTOBJ SEARCHSTRING STARTCHAR# ENDCHAR# + T)) do (* ;  "Show each substitution site and ask for permission") - (SETQ PENDING.SEL (TEDIT.SETSEL TEXTOBJ (CAR RANGE) - (ADD1 (IDIFFERENCE (CADR RANGE) - (CAR RANGE))) - 'RIGHT T)) - (\TEDIT.SHOWSEL PENDING.SEL T TEXTOBJ) - (TEDIT.NORMALIZECARET TEXTOBJ PENDING.SEL) - (SELECTQ (U-CASE (NTHCHAR (TEDIT.GETINPUT TEXTOBJ + (\TEDIT.UPDATE.SEL SEL (CAR RANGE) + NIL + 'RIGHT + 'PENDINGDEL + (ADD1 (CADR RANGE))) + (\TEDIT.FIXSEL SEL TEXTOBJ) + (\TEDIT.SHOWSEL SEL T TEXTOBJ) + (TEDIT.NORMALIZECARET TEXTOBJ SEL) + [SELECTQ (U-CASE (NTHCHAR (TEDIT.GETINPUT TEXTOBJ "OK to replace? ['q' quits]" "Yes") 1)) - (Q (RETURN)) + (Q (GO $$OUT)) (Y (* ; "Do this one") (\TEDIT.REPLACE.SELPIECES (\TEDIT.SELPIECES.COPY REPLACEMENT 'COPY TEXTOBJ) - TEXTOBJ PENDING.SEL) + TEXTOBJ SEL) + (\TEDIT.COPYSEL SEL LASTSEL) + (* ; "This may be where we end up") (add NREPLACEMENTS 1) - (SETQ STARTCHAR# (GETSEL PENDING.SEL CHLIM)) + (SETQ STARTCHAR# (GETSEL SEL CHLIM)) (* ; "Next start, compensate for end") [add ENDCHAR# (IDIFFERENCE REPLACE-LEN (ADD1 (IDIFFERENCE (CADR RANGE) @@ -207,13 +216,13 @@ (* ;;  "Turn off rejected selection, search for next starting one charcter later. ENDCHAR# is still OK.") - (\TEDIT.SHOWSEL PENDING.SEL NIL TEXTOBJ) + (\TEDIT.SHOWSEL SEL NIL TEXTOBJ) (SETQ STARTCHAR# (ADD1 (CAR RANGE] + finally (\TEDIT.COPYSEL LASTSEL SEL)) else (* ;; "No confirmation required. Do the substitutions without showing intermediate work, collect all of the replacement events") (bind FIRSTHIT HITLAST HITLEN HITDIFF (TOTALDIFF _ 0) - (SAVESEL _ (\TEDIT.COPYSEL SEL)) EVENTS while (SETQ RANGE (TEDIT.FIND TEXTOBJ SEARCHSTRING STARTCHAR# ENDCHAR# T)) do (CL:UNLESS FIRSTHIT (* ; "For final line updating.") @@ -238,12 +247,21 @@ (add TOTALDIFF HITDIFF) finally (CL:UNLESS (EQ NREPLACEMENTS 0) - (* ;; - "At least one replacement, update the lines that have changed.") + (* ;; "At least one replacement, update the lines that have changed. We have to calculate how many of the original characters have %"changed%" by adding the TOTALDIFF to the final position of the last character of the last hit. Might be better if UPDATELINES took a lastchangechar.") - (\TEDIT.UPDATE.LINES TEXTOBJ 'INSERTION FIRSTHIT - (IDIFFERENCE (GETSEL SEL CHLIM) - FIRSTHIT)) + (if (IGREATERP TOTALDIFF 0) + then (\TEDIT.UPDATE.LINES TEXTOBJ 'INSERTION FIRSTHIT + (IDIFFERENCE (IPLUS (FGETSEL SEL CHLIM) + TOTALDIFF) + FIRSTHIT)) + elseif (ILESSP TOTALDIFF 0) + then (\TEDIT.UPDATE.LINES TEXTOBJ 'DELETION FIRSTHIT + (IDIFFERENCE (IDIFFERENCE (FGETSEL SEL CHLIM) + TOTALDIFF) + FIRSTHIT)) + else (\TEDIT.UPDATE.LINES TEXTOBJ 'CHANGED FIRSTHIT + (IDIFFERENCE (FGETSEL SEL CHLIM) + FIRSTHIT))) (* ;; "Not clear what the final selection should be, if there are multiple changes. The original selection? A selection that goes from the beginning of the first subsitution to the end of the last (as here)? Or just the selection of the last substitution?") @@ -251,6 +269,7 @@ (\TEDIT.UPDATE.SEL SEL FIRSTHIT (IDIFFERENCE HITLAST FIRSTHIT ) 'RIGHT) + (\TEDIT.FIXSEL SEL TEXTOBJ) (\TEDIT.HISTORYADD.COMPOSITE TEXTOBJ EVENTS))] (* ;; "Save the search & replacement strings to offer for next time:") @@ -563,8 +582,8 @@ (DREVERSE $$VAL))]) ) (DECLARE%: DONTCOPY - (FILEMAP (NIL (784 22132 (TEDIT.FIND 794 . 2793) (TEDIT.FIND.BACKWARD 2795 . 5117) (TEDIT.SUBSTITUTE -5119 . 17479) (TEDIT.NEXT 17481 . 22130)) (22165 36861 (\TEDIT.WCFIND 22175 . 25694) (\TEDIT.BASICFIND - 25696 . 28055) (\TEDIT.WCFIND.BACKWARD 28057 . 31521) (\TEDIT.BASICFIND.BACKWARD 31523 . 33780) ( -\TEDIT.PARSE.SEARCHSTRING 33782 . 36859))))) + (FILEMAP (NIL (784 23475 (TEDIT.FIND 794 . 2793) (TEDIT.FIND.BACKWARD 2795 . 5117) (TEDIT.SUBSTITUTE +5119 . 18822) (TEDIT.NEXT 18824 . 23473)) (23508 38204 (\TEDIT.WCFIND 23518 . 27037) (\TEDIT.BASICFIND + 27039 . 29398) (\TEDIT.WCFIND.BACKWARD 29400 . 32864) (\TEDIT.BASICFIND.BACKWARD 32866 . 35123) ( +\TEDIT.PARSE.SEARCHSTRING 35125 . 38202))))) STOP diff --git a/library/tedit/TEDIT-FIND.LCOM b/library/tedit/TEDIT-FIND.LCOM index 782de8472d2bd49880f890e019f7d932a78bc93c..9bf6dd8063272b0a6ec99c6de0de9afc3eb5b7d8 100644 GIT binary patch delta 2527 zcma)8O>h%+6erYD+R{MNTA@OHv(|oO+L-;`4GM&G(=5&AzhpOr0uuTWXxc&`2{SN` zcJ!zhnLRlk7@2XrIF6-qU>wLeo;cy5hjyHC^yEngE_$qQztR*r*u&<1zu$ZR_x}I> z`0gLaKFjxlFs{v1#+fL?0~3wWQY^~dSsE;u%7khjbH3wAH8T-8O0&`^bWn^mo-EFK z4s49!V{DXy*-CM)eD!*1xi}BSTh}Yqw_@NpM~vJ_!&J?jsX*x(P{~|64UBZ>uh$k{ z5{aWmJ4TXfT1jM;IQj$iGJF)gpVyR$v@-p{JIkfn%1q_9i}Xdjz)B1wT2}*b=|wQ3 z5Yw~D8I|OW@d-=?6fJHSMl()f0tFraFO{(NXW(2*E(*#SC1V<(11&>JH7C?$(q<%^ zNh=wf79Bcnm^LFoQq3ABYHf}OlbG?e@5MnH&8&y5>x(pG6+InKC>q9xBrpt^hKXI$ zY=#9rZkkFqV>28WYAhDcDu!YvNmet$wv>ki$zU$+_$ahIeYJI0AV1c=3;!0&_P2Yj zYijLCKJwt8)!o+D@JHmx;ebOoOZxls(f+w;KKzqyfC0iz%&+s| zdG^G!?|;sRQ;zFg_#=#1ZX0?fV&xg@^R^S#uWe(U-;(~;mIo~#ukQN7>fYO<{X;^I ze|I35n#yRUu2ws2A$b2136Wr6;fl>V9}?UhSlZ~?V+-me9Av8SC`fwl8|fI@mM2$ zc2b0~xwNsl{%Cb;jD!}vbSPcgc)YrGXtDcr?@s6+68H+$1*mVk7Z8?R5E*om?`x_8 zE3P|8UcWlhUl`d5;$nfSBaFe#!cbi!L+g*o0DcPt_0_Fg>f*DtDj8UOe!nN>wg^b* zNe3C&`0mX`GVuKFPU+^SJ9x0ZZ0~&=2t{D?KbR0wij25T>1p&hKW6>X-X92Cf43J` zWRdn3Ue6LuH}$NFb1DnY*d^jfaw2F`II?PH5@eRM$I+3~v`jbx2ocfkG)$`*#Q;H!`f{D<&i;cSu)fS&TRW<*?zKw*f#)pd#$xEV&DbNH}awJOe0c)=+kxqJhs(Cy90p(fREbntb3ik zX-*K~Lh_tq_mATx-^UNbu`=Yw6LCWU4$mxOrV^=m7C1)oAWbT!n!!T@j;8JAU*e*T z8hm)H+z@$%vQnczO@*?&KSNHTEQ`?G(if7SB$_6Q+7b z0SPa2N7lR$jV)>9!y!hxG4q(l^=cU42{aoBs6T6xlWnK)sgy*<+8=zQMG~SG9UNGZ z5PVjhOqn1ec08)gBtD`dFTjM7#*-o$5b+q*jG<&5PLQw+R3T*437m}m(x*Yd7P)bF zmTfZNWYIO?&~F+zQS{K90uGmM?liDip{`^maLX|zuvnfOh{ZQ>I};;En>neOqwy@A zZE@IehodB;A!N$<;qXDFri)diFgr!2pjL)T@%r-2T=6)ZAHFdRH*S_{)^GdwT;|ZU zbnQwc5}|;>yM)S=k?>+4$5eLMcy$S8ibg76RFqA5Z}Fls0BMF-h6~lnVSy855X7u3 zXJv(f$;Il_!u++`Ty+|%H?A!%y^)0rp*MS4cdZp z7**-y05pAgqF)NW?kUM-RH08}1@M zbc_70*{2UlPh_2bTq0dtglkV9)i*{+&rD2(Vaz^zT;I^Hkj{{(!|6&Q&PE~MCcR&x zS*5qJ1ykv7kWQLOf5_iLvqMc(tOl0q`@M%sW(Y`zx+_DCFr>IX>Gvyr4GgM(tuojs zk-?{r2;f?QMt$Rkb!B}u7u_%EO)8ouy}{4>4(Yw5kMyo>qcq7-ct4GUq%*Fb&ymhh z7lDj~C5iSJ7n`p7nua}2=Lu^&q-1-xV`0l`8b>=Yr{h);pfrNri>(ftl-bl{>n0`~ z5B4aw^jUN#HmDgT_%q#eP}O$ml}zwkOIJlzxMU2uCh_U>qatuTA56>jh%>I|^K1?y zBCds_L6tULMr}GQ!lzEfhdTD!1md~ii~U_)qL`f6#11C{D1s7PYUyrLcrCcqa^#Z2 zNr_FtI!mLFGjgKY#v;o?T%vGZ%A%GS<%m5V`u#T!NmWBK33I;Ha#W-76wVp6JQB{1 z(czr#8X$2QD0^nk)E(T5G0hpnv&vXd5H*DsOc7Nzp-l3`u^L$hc**R90f@Y?zA2*^2zN9A`itV90Btv8Ku*PgR>K7R@fJt(FjiQtVd423li4qJ$$?Iq2m}{7J_Zj3YxZEQlFC$EP>%AeBl^H+cI*7 z3w(qTOA3c6LW;)(U!Txa37Fc#)g_ppn65JTT&lp}pC&8Oe4#!0Vt6ja!vMhsd%nUH)1w_f<2B}Zdtq^?Pe)t$RB(rpV za%s7?e0>?!DsoI$=c>5R@WJoxZ}z8g3;=UppIlhP9|jj0kdfA@UYnbks>0IpBC=$W LLtf=N)V6;CT=P7V