|
1 | 1 | (DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10)
|
2 | 2 |
|
3 |
| -(FILECREATED "17-Feb-2025 12:25:36" {WMEDLEY}<library>tedit>TEDIT-FIND.;136 36884 |
| 3 | +(FILECREATED " 6-Mar-2025 20:18:04" {WMEDLEY}<library>TEDIT>TEDIT-FIND.;138 38227 |
4 | 4 |
|
5 | 5 | :EDIT-BY rmk
|
6 | 6 |
|
7 |
| - :CHANGES-TO (FNS \TEDIT.BASICFIND) |
| 7 | + :CHANGES-TO (FNS TEDIT.SUBSTITUTE) |
8 | 8 |
|
9 |
| - :PREVIOUS-DATE "15-Feb-2025 18:08:55" {WMEDLEY}<library>tedit>TEDIT-FIND.;135) |
| 9 | + :PREVIOUS-DATE "17-Feb-2025 12:25:36" {WMEDLEY}<library>TEDIT>TEDIT-FIND.;136) |
10 | 10 |
|
11 | 11 |
|
12 | 12 | (PRETTYCOMPRINT TEDIT-FINDCOMS)
|
|
94 | 94 | (CAR (\TEDIT.BASICFIND.BACKWARD TSTREAM TARGET START END))))])])
|
95 | 95 |
|
96 | 96 | (TEDIT.SUBSTITUTE
|
97 |
| - [LAMBDA (TSTREAM PATTERN REPLACEMENT CONFIRM?) (* ; "Edited 8-Dec-2024 15:47 by rmk") |
| 97 | + [LAMBDA (TSTREAM PATTERN REPLACEMENT CONFIRM?) (* ; "Edited 6-Mar-2025 20:17 by rmk") |
| 98 | + (* ; "Edited 8-Dec-2024 15:47 by rmk") |
98 | 99 | (* ; "Edited 26-Nov-2024 23:49 by rmk")
|
99 | 100 | (* ; "Edited 15-Aug-2024 09:20 by rmk")
|
100 | 101 | (* ; "Edited 14-Jul-2024 00:24 by rmk")
|
|
123 | 124 |
|
124 | 125 | (* ;; "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.")
|
125 | 126 |
|
126 |
| - [CL:UNLESS (SETQ SEARCHSTRING (OR PATTERN (TEDIT.GETINPUT TEXTOBJ "Search string:" |
127 |
| - (GETTEXTPROP TEXTOBJ |
128 |
| - ' |
129 |
| - TEDIT.LAST.SUBSTITUTE.STRING |
130 |
| - ] |
| 127 | + (CL:UNLESS SEARCHSTRING |
| 128 | + [SETQ SEARCHSTRING (OR PATTERN (TEDIT.GETINPUT TEXTOBJ "Search string:" |
| 129 | + (GETTEXTPROP TEXTOBJ |
| 130 | + 'TEDIT.LAST.SUBSTITUTE.STRING]) |
131 | 131 | (CL:UNLESS [OR REPLACEMENT (SETQ REPLACEMENT (TEDIT.GETINPUT TEXTOBJ
|
132 | 132 | "Replace string:"
|
133 | 133 | (GETTEXTPROP TEXTOBJ
|
|
137 | 137 | ]
|
138 | 138 | (TEDIT.PROMPTPRINT TEXTOBJ "[Aborted]")
|
139 | 139 | (RETURN))
|
140 |
| - [RESETSAVE (\TEDIT.MARKACTIVE TEXTOBJ) |
| 140 | + [RESETSAVE (\TEDIT.MARKACTIVE TEXTOBJ "Substitute") |
141 | 141 | '(PROGN (\TEDIT.MARKINACTIVE OLDVALUE]
|
142 | 142 | (if (type? SELPIECES REPLACEMENT)
|
143 | 143 | elseif (OR (STRINGP REPLACEMENT)
|
144 | 144 | (LITATOM REPLACEMENT))
|
145 |
| - then (SETQ REPLACEMENT (\TEDIT.SELPIECES.FROM.STRING REPLACEMENT TEXTOBJ))) |
| 145 | + then (SETQ REPLACEMENT (\TEDIT.SELPIECES.FROM.STRING REPLACEMENT TEXTOBJ)) |
| 146 | + else (RETURN NIL)) |
146 | 147 |
|
147 | 148 | (* ;; "Could be NIL or empty string, meaning just delete all occurrences.")
|
148 | 149 |
|
149 |
| - (SETQ REPLACE-LEN (fetch (SELPIECES SPLEN) of REPLACEMENT)) |
| 150 | + (SETQ REPLACE-LEN (GETSPC REPLACEMENT SPLEN)) |
150 | 151 | (SETQ ACTIONSTRING (CL:IF (ZEROP REPLACE-LEN)
|
151 | 152 | "delet"
|
152 | 153 | "substitut"))
|
|
163 | 164 | (TEDIT.PROMPTPRINT TEXTOBJ (CONCAT (L-CASE ACTIONSTRING T)
|
164 | 165 | "ing...")
|
165 | 166 | T)
|
166 |
| - (SETQ SEL (fetch (TEXTOBJ SEL) of TEXTOBJ)) |
| 167 | + (SETQ SEL (FGETTOBJ TEXTOBJ SEL)) |
167 | 168 | (\TEDIT.SHOWSEL SEL NIL TEXTOBJ)
|
168 | 169 | (\TEDIT.RESET.EXTEND.PENDING.DELETE TEXTOBJ)
|
169 | 170 | (* ; "Turn off any blue pending delete")
|
|
174 | 175 | [SETQ ENDCHAR# (CL:IF (ZEROP (GETSEL SEL DCH))
|
175 | 176 | (GETTOBJ TEXTOBJ TEXTLEN)
|
176 | 177 | (IPLUS STARTCHAR# (SUB1 (GETSEL SEL DCH))))]
|
| 178 | + |
| 179 | + (* ;; |
| 180 | + "NOTE: SEARCHSTRING may contain wild cards, so the hits may be of different lengths.") |
| 181 | + |
177 | 182 | [if CONFIRMFLG
|
178 | 183 | then
|
179 | 184 | (* ;; "In this case the selection moves along, ending up at the last hit.")
|
180 | 185 |
|
181 |
| - [bind PENDING.SEL CHOICE while (SETQ RANGE (TEDIT.FIND TEXTOBJ |
182 |
| - SEARCHSTRING STARTCHAR# |
183 |
| - ENDCHAR# T)) |
| 186 | + (bind (LASTSEL _ (\TEDIT.COPYSEL SEL)) |
| 187 | + while (SETQ RANGE (TEDIT.FIND TEXTOBJ SEARCHSTRING STARTCHAR# ENDCHAR# |
| 188 | + T)) |
184 | 189 | do (* ;
|
185 | 190 | "Show each substitution site and ask for permission")
|
186 |
| - (SETQ PENDING.SEL (TEDIT.SETSEL TEXTOBJ (CAR RANGE) |
187 |
| - (ADD1 (IDIFFERENCE (CADR RANGE) |
188 |
| - (CAR RANGE))) |
189 |
| - 'RIGHT T)) |
190 |
| - (\TEDIT.SHOWSEL PENDING.SEL T TEXTOBJ) |
191 |
| - (TEDIT.NORMALIZECARET TEXTOBJ PENDING.SEL) |
192 |
| - (SELECTQ (U-CASE (NTHCHAR (TEDIT.GETINPUT TEXTOBJ |
| 191 | + (\TEDIT.UPDATE.SEL SEL (CAR RANGE) |
| 192 | + NIL |
| 193 | + 'RIGHT |
| 194 | + 'PENDINGDEL |
| 195 | + (ADD1 (CADR RANGE))) |
| 196 | + (\TEDIT.FIXSEL SEL TEXTOBJ) |
| 197 | + (\TEDIT.SHOWSEL SEL T TEXTOBJ) |
| 198 | + (TEDIT.NORMALIZECARET TEXTOBJ SEL) |
| 199 | + [SELECTQ (U-CASE (NTHCHAR (TEDIT.GETINPUT TEXTOBJ |
193 | 200 | "OK to replace? ['q' quits]" "Yes")
|
194 | 201 | 1))
|
195 |
| - (Q (RETURN)) |
| 202 | + (Q (GO $$OUT)) |
196 | 203 | (Y (* ; "Do this one")
|
197 | 204 | (\TEDIT.REPLACE.SELPIECES (\TEDIT.SELPIECES.COPY REPLACEMENT
|
198 | 205 | 'COPY TEXTOBJ)
|
199 |
| - TEXTOBJ PENDING.SEL) |
| 206 | + TEXTOBJ SEL) |
| 207 | + (\TEDIT.COPYSEL SEL LASTSEL) |
| 208 | + (* ; "This may be where we end up") |
200 | 209 | (add NREPLACEMENTS 1)
|
201 |
| - (SETQ STARTCHAR# (GETSEL PENDING.SEL CHLIM)) |
| 210 | + (SETQ STARTCHAR# (GETSEL SEL CHLIM)) |
202 | 211 | (* ; "Next start, compensate for end")
|
203 | 212 | [add ENDCHAR# (IDIFFERENCE REPLACE-LEN
|
204 | 213 | (ADD1 (IDIFFERENCE (CADR RANGE)
|
|
207 | 216 | (* ;;
|
208 | 217 | "Turn off rejected selection, search for next starting one charcter later. ENDCHAR# is still OK.")
|
209 | 218 |
|
210 |
| - (\TEDIT.SHOWSEL PENDING.SEL NIL TEXTOBJ) |
| 219 | + (\TEDIT.SHOWSEL SEL NIL TEXTOBJ) |
211 | 220 | (SETQ STARTCHAR# (ADD1 (CAR RANGE]
|
| 221 | + finally (\TEDIT.COPYSEL LASTSEL SEL)) |
212 | 222 | else
|
213 | 223 | (* ;; "No confirmation required. Do the substitutions without showing intermediate work, collect all of the replacement events")
|
214 | 224 |
|
215 | 225 | (bind FIRSTHIT HITLAST HITLEN HITDIFF (TOTALDIFF _ 0)
|
216 |
| - (SAVESEL _ (\TEDIT.COPYSEL SEL)) |
217 | 226 | EVENTS while (SETQ RANGE (TEDIT.FIND TEXTOBJ SEARCHSTRING STARTCHAR#
|
218 | 227 | ENDCHAR# T))
|
219 | 228 | do (CL:UNLESS FIRSTHIT (* ; "For final line updating.")
|
|
238 | 247 | (add TOTALDIFF HITDIFF)
|
239 | 248 | finally (CL:UNLESS (EQ NREPLACEMENTS 0)
|
240 | 249 |
|
241 |
| - (* ;; |
242 |
| - "At least one replacement, update the lines that have changed.") |
243 |
| - |
244 |
| - (\TEDIT.UPDATE.LINES TEXTOBJ 'INSERTION FIRSTHIT |
245 |
| - (IDIFFERENCE (GETSEL SEL CHLIM) |
246 |
| - FIRSTHIT)) |
| 250 | + (* ;; "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.") |
| 251 | + |
| 252 | + (if (IGREATERP TOTALDIFF 0) |
| 253 | + then (\TEDIT.UPDATE.LINES TEXTOBJ 'INSERTION FIRSTHIT |
| 254 | + (IDIFFERENCE (IPLUS (FGETSEL SEL CHLIM) |
| 255 | + TOTALDIFF) |
| 256 | + FIRSTHIT)) |
| 257 | + elseif (ILESSP TOTALDIFF 0) |
| 258 | + then (\TEDIT.UPDATE.LINES TEXTOBJ 'DELETION FIRSTHIT |
| 259 | + (IDIFFERENCE (IDIFFERENCE (FGETSEL SEL CHLIM) |
| 260 | + TOTALDIFF) |
| 261 | + FIRSTHIT)) |
| 262 | + else (\TEDIT.UPDATE.LINES TEXTOBJ 'CHANGED FIRSTHIT |
| 263 | + (IDIFFERENCE (FGETSEL SEL CHLIM) |
| 264 | + FIRSTHIT))) |
247 | 265 |
|
248 | 266 | (* ;; "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?")
|
249 | 267 |
|
250 | 268 | (\TEDIT.SHOWSEL SEL NIL TEXTOBJ)
|
251 | 269 | (\TEDIT.UPDATE.SEL SEL FIRSTHIT (IDIFFERENCE HITLAST FIRSTHIT
|
252 | 270 | )
|
253 | 271 | 'RIGHT)
|
| 272 | + (\TEDIT.FIXSEL SEL TEXTOBJ) |
254 | 273 | (\TEDIT.HISTORYADD.COMPOSITE TEXTOBJ EVENTS))]
|
255 | 274 |
|
256 | 275 | (* ;; "Save the search & replacement strings to offer for next time:")
|
|
563 | 582 | (DREVERSE $$VAL))])
|
564 | 583 | )
|
565 | 584 | (DECLARE%: DONTCOPY
|
566 |
| - (FILEMAP (NIL (784 22132 (TEDIT.FIND 794 . 2793) (TEDIT.FIND.BACKWARD 2795 . 5117) (TEDIT.SUBSTITUTE |
567 |
| -5119 . 17479) (TEDIT.NEXT 17481 . 22130)) (22165 36861 (\TEDIT.WCFIND 22175 . 25694) (\TEDIT.BASICFIND |
568 |
| - 25696 . 28055) (\TEDIT.WCFIND.BACKWARD 28057 . 31521) (\TEDIT.BASICFIND.BACKWARD 31523 . 33780) ( |
569 |
| -\TEDIT.PARSE.SEARCHSTRING 33782 . 36859))))) |
| 585 | + (FILEMAP (NIL (784 23475 (TEDIT.FIND 794 . 2793) (TEDIT.FIND.BACKWARD 2795 . 5117) (TEDIT.SUBSTITUTE |
| 586 | +5119 . 18822) (TEDIT.NEXT 18824 . 23473)) (23508 38204 (\TEDIT.WCFIND 23518 . 27037) (\TEDIT.BASICFIND |
| 587 | + 27039 . 29398) (\TEDIT.WCFIND.BACKWARD 29400 . 32864) (\TEDIT.BASICFIND.BACKWARD 32866 . 35123) ( |
| 588 | +\TEDIT.PARSE.SEARCHSTRING 35125 . 38202))))) |
570 | 589 | STOP
|
0 commit comments