Skip to content

Commit 02411ef

Browse files
authored
rmk72: Address Tedit Find and Substitute issues reported in #2055 (#2058)
Selection highlighting should be correct if line contains a preceding diacritic. Find from expanded menu should work. Screen and selection should not be garbled after substitute. I have not yet replicated the break-on-put also reported in #2055
2 parents d4b8656 + 70f0e97 commit 02411ef

8 files changed

+147
-116
lines changed

library/tedit/TEDIT-FIND

+57-38
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10)
22

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
44

55
:EDIT-BY rmk
66

7-
:CHANGES-TO (FNS \TEDIT.BASICFIND)
7+
:CHANGES-TO (FNS TEDIT.SUBSTITUTE)
88

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)
1010

1111

1212
(PRETTYCOMPRINT TEDIT-FINDCOMS)
@@ -94,7 +94,8 @@
9494
(CAR (\TEDIT.BASICFIND.BACKWARD TSTREAM TARGET START END))))])])
9595

9696
(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")
9899
(* ; "Edited 26-Nov-2024 23:49 by rmk")
99100
(* ; "Edited 15-Aug-2024 09:20 by rmk")
100101
(* ; "Edited 14-Jul-2024 00:24 by rmk")
@@ -123,11 +124,10 @@
123124

124125
(* ;; "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.")
125126

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])
131131
(CL:UNLESS [OR REPLACEMENT (SETQ REPLACEMENT (TEDIT.GETINPUT TEXTOBJ
132132
"Replace string:"
133133
(GETTEXTPROP TEXTOBJ
@@ -137,16 +137,17 @@
137137
]
138138
(TEDIT.PROMPTPRINT TEXTOBJ "[Aborted]")
139139
(RETURN))
140-
[RESETSAVE (\TEDIT.MARKACTIVE TEXTOBJ)
140+
[RESETSAVE (\TEDIT.MARKACTIVE TEXTOBJ "Substitute")
141141
'(PROGN (\TEDIT.MARKINACTIVE OLDVALUE]
142142
(if (type? SELPIECES REPLACEMENT)
143143
elseif (OR (STRINGP REPLACEMENT)
144144
(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))
146147

147148
(* ;; "Could be NIL or empty string, meaning just delete all occurrences.")
148149

149-
(SETQ REPLACE-LEN (fetch (SELPIECES SPLEN) of REPLACEMENT))
150+
(SETQ REPLACE-LEN (GETSPC REPLACEMENT SPLEN))
150151
(SETQ ACTIONSTRING (CL:IF (ZEROP REPLACE-LEN)
151152
"delet"
152153
"substitut"))
@@ -163,7 +164,7 @@
163164
(TEDIT.PROMPTPRINT TEXTOBJ (CONCAT (L-CASE ACTIONSTRING T)
164165
"ing...")
165166
T)
166-
(SETQ SEL (fetch (TEXTOBJ SEL) of TEXTOBJ))
167+
(SETQ SEL (FGETTOBJ TEXTOBJ SEL))
167168
(\TEDIT.SHOWSEL SEL NIL TEXTOBJ)
168169
(\TEDIT.RESET.EXTEND.PENDING.DELETE TEXTOBJ)
169170
(* ; "Turn off any blue pending delete")
@@ -174,31 +175,39 @@
174175
[SETQ ENDCHAR# (CL:IF (ZEROP (GETSEL SEL DCH))
175176
(GETTOBJ TEXTOBJ TEXTLEN)
176177
(IPLUS STARTCHAR# (SUB1 (GETSEL SEL DCH))))]
178+
179+
(* ;;
180+
 "NOTE: SEARCHSTRING may contain wild cards, so the hits may be of different lengths.")
181+
177182
[if CONFIRMFLG
178183
then
179184
(* ;; "In this case the selection moves along, ending up at the last hit.")
180185

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))
184189
do (* ;
185190
 "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
193200
"OK to replace? ['q' quits]" "Yes")
194201
1))
195-
(Q (RETURN))
202+
(Q (GO $$OUT))
196203
(Y (* ; "Do this one")
197204
(\TEDIT.REPLACE.SELPIECES (\TEDIT.SELPIECES.COPY REPLACEMENT
198205
'COPY TEXTOBJ)
199-
TEXTOBJ PENDING.SEL)
206+
TEXTOBJ SEL)
207+
(\TEDIT.COPYSEL SEL LASTSEL)
208+
(* ; "This may be where we end up")
200209
(add NREPLACEMENTS 1)
201-
(SETQ STARTCHAR# (GETSEL PENDING.SEL CHLIM))
210+
(SETQ STARTCHAR# (GETSEL SEL CHLIM))
202211
(* ; "Next start, compensate for end")
203212
[add ENDCHAR# (IDIFFERENCE REPLACE-LEN
204213
(ADD1 (IDIFFERENCE (CADR RANGE)
@@ -207,13 +216,13 @@
207216
(* ;;
208217
 "Turn off rejected selection, search for next starting one charcter later. ENDCHAR# is still OK.")
209218

210-
(\TEDIT.SHOWSEL PENDING.SEL NIL TEXTOBJ)
219+
(\TEDIT.SHOWSEL SEL NIL TEXTOBJ)
211220
(SETQ STARTCHAR# (ADD1 (CAR RANGE]
221+
finally (\TEDIT.COPYSEL LASTSEL SEL))
212222
else
213223
(* ;; "No confirmation required. Do the substitutions without showing intermediate work, collect all of the replacement events")
214224

215225
(bind FIRSTHIT HITLAST HITLEN HITDIFF (TOTALDIFF _ 0)
216-
(SAVESEL _ (\TEDIT.COPYSEL SEL))
217226
EVENTS while (SETQ RANGE (TEDIT.FIND TEXTOBJ SEARCHSTRING STARTCHAR#
218227
ENDCHAR# T))
219228
do (CL:UNLESS FIRSTHIT (* ; "For final line updating.")
@@ -238,19 +247,29 @@
238247
(add TOTALDIFF HITDIFF)
239248
finally (CL:UNLESS (EQ NREPLACEMENTS 0)
240249

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)))
247265

248266
(* ;; "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?")
249267

250268
(\TEDIT.SHOWSEL SEL NIL TEXTOBJ)
251269
(\TEDIT.UPDATE.SEL SEL FIRSTHIT (IDIFFERENCE HITLAST FIRSTHIT
252270
)
253271
'RIGHT)
272+
(\TEDIT.FIXSEL SEL TEXTOBJ)
254273
(\TEDIT.HISTORYADD.COMPOSITE TEXTOBJ EVENTS))]
255274

256275
(* ;; "Save the search & replacement strings to offer for next time:")
@@ -563,8 +582,8 @@
563582
(DREVERSE $$VAL))])
564583
)
565584
(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)))))
570589
STOP

library/tedit/TEDIT-FIND.LCOM

166 Bytes
Binary file not shown.

library/tedit/TEDIT-MENU

+31-30
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10)
22

3-
(FILECREATED "19-Feb-2025 13:27:11" {WMEDLEY}<library>tedit>TEDIT-MENU.;454 160645
3+
(FILECREATED " 5-Mar-2025 20:52:33" {WMEDLEY}<library>TEDIT>TEDIT-MENU.;455 160734
44

55
:EDIT-BY rmk
66

7-
:CHANGES-TO (FNS \TEDIT.PARAMENU.FILLIN \TEDIT.PARALOOKS.TO.MARBAR)
8-
(VARS TEDIT-MENUCOMS)
7+
:CHANGES-TO (FNS \TEDIT.EXPANDEDMENU.ACTIONFN)
98

10-
:PREVIOUS-DATE " 8-Feb-2025 23:19:34" {WMEDLEY}<library>tedit>TEDIT-MENU.;453)
9+
:PREVIOUS-DATE "19-Feb-2025 13:27:11" {WMEDLEY}<library>TEDIT>TEDIT-MENU.;454)
1110

1211

1312
(PRETTYCOMPRINT TEDIT-MENUCOMS)
@@ -1326,7 +1325,8 @@
13261325
(RETURN 'DON'T])
13271326

13281327
(\TEDIT.EXPANDEDMENU.ACTIONFN
1329-
[LAMBDA (OBJ MENUSEL MENUWINDOW MENUSTREAM MAINSTREAM) (* ; "Edited 7-Jan-2025 22:36 by rmk")
1328+
[LAMBDA (OBJ MENUSEL MENUWINDOW MENUSTREAM MAINSTREAM) (* ; "Edited 5-Mar-2025 20:51 by rmk")
1329+
(* ; "Edited 7-Jan-2025 22:36 by rmk")
13301330
(* ; "Edited 26-Nov-2024 23:30 by rmk")
13311331
(* ; "Edited 22-Oct-2024 10:54 by rmk")
13321332
(* ; "Edited 20-Oct-2024 15:40 by rmk")
@@ -1373,7 +1373,8 @@
13731373
else (TEDIT.PROMPTPRINT MAINSTREAM "Include file not specified" T
13741374
)))
13751375
(FIND (SETQ STATE (MB.GET 'FINDPATTERN MENUTEXTOBJ 'STATE MENUSEL))
1376-
(if (IGEQ 1 (NCHARS STATE))
1376+
(if (IGEQ (NCHARS STATE)
1377+
1)
13771378
then (\TEDIT.KEY.FIND MAINSTREAM NIL NIL NIL NIL STATE)
13781379
else (TEDIT.PROMPTPRINT MAINSTREAM "Search pattern not specified" T)
13791380
))
@@ -2619,28 +2620,28 @@
26192620
(ADDTOVAR LAMA )
26202621
)
26212622
(DECLARE%: DONTCOPY
2622-
(FILEMAP (NIL (5083 51454 (DRAWMARGINSCALE 5093 . 8552) (MARGINBAR 8554 . 15679) (MARGINBAR.CREATE
2623-
15681 . 19100) (MB.MARGINBAR.BUTTONEVENTINFN 19102 . 26741) (MB.MARGINBAR.SELFN.TABS 26743 . 31983) (
2624-
MB.MARGINBAR.SELFN.TABS.KIND 31985 . 32920) (MARGINBAR.GETSTATEFN 32922 . 36800) (MARGINBAR.SETSTATEFN
2625-
36802 . 37012) (MARGINBAR.NEUTRALIZE 37014 . 37427) (MARGINBAR.LOOKS 37429 . 40535) (
2626-
MB.MARGINBAR.SIZEFN 40537 . 41140) (MB.MARGINBAR.DISPLAYFN 41142 . 44203) (MDESCALE 44205 . 44745) (
2627-
MSCALE 44747 . 45077) (MB.MARGINBAR.SHOWTAB 45079 . 47402) (MB.MARGINBAR.TABTRACK 47404 . 48789) (
2628-
MARGINBAR.INIT 48791 . 50184) (\TEDIT.PARALOOKS.TO.MARBAR 50186 . 51452)) (52279 58496 (
2629-
\TEDIT.MENU.START 52289 . 57920) (\TEDIT.MENU.BUTTONEVENTFN 57922 . 58494)) (58815 66737 (
2630-
\TEDIT.MENU.CREATE 58825 . 60636) (\TEDIT.MENU.PARSE 60638 . 64327) (\TEDIT.MENU.NEUTRALIZE 64329 .
2631-
66400) (\TEDITMENU.RECORD.UNFORMATTED 66402 . 66735)) (66803 86736 (\TEDIT.EXPANDEDMENU.CREATE 66813
2632-
. 72108) (\TEDIT.EXPANDEDMENU.START 72110 . 73484) (\TEDIT.EXPANDEDMENU.FN 73486 . 76741) (
2633-
\TEDIT.EXPANDEDMENU.ACTIONFN 76743 . 86177) (TEDIT.MENUSTREAM 86179 . 86734)) (86798 102289 (
2634-
\TEDIT.PARAMENU.CREATE 86808 . 92829) (\TEDIT.PARAMENU.START 92831 . 93697) (\TEDIT.APPLY.PARALOOKS
2635-
93699 . 94751) (\TEDIT.SHOW.PARALOOKS 94753 . 97536) (\TEDIT.PARAMENU.FILLIN 97538 . 102287)) (102408
2636-
128184 (\TEDIT.CHARMENU.CREATE 102418 . 105022) (\TEDIT.CHARMENU.START 105024 . 106055) (
2637-
\TEDIT.CHARMENU.SPEC 106057 . 110506) (\TEDIT.CHARMENU.PARSE 110508 . 113676) (\TEDIT.CHARMENU.FILLIN
2638-
113678 . 118023) (\TEDIT.SHOW.CHARLOOKS 118025 . 121282) (\TEDIT.APPLY.CHARLOOKS 121284 . 122445) (
2639-
\TEDIT.OFFSETTYPE.STATEFN 122447 . 124410) (\TEDIT.OTHER.STATECHANGEFN 124412 . 126057) (
2640-
\TEDIT.OTHER.SELECTFN 126059 . 128182)) (128246 154685 (\TEDIT.PAGEMENU.CREATE 128256 . 135450) (
2641-
\TEDIT.SHOW.PAGELOOKS 135452 . 137247) (\TEDIT.PAGEMENU.FILLIN 137249 . 138799) (
2642-
\TEDIT.PAGEREGION.UNPARSE 138801 . 147991) (\TEDIT.APPLY.PAGELOOKS 147993 . 149920) (
2643-
\TEDIT.CHANGE.PAGELOOKS 149922 . 153841) (\TEDIT.PAGEMENU.CHARLOOKS.STATEFN 153843 . 154683)) (154686
2644-
160489 (\TEDIT.PAGEMENU.CREATE.HEADINGS 154696 . 157508) (\TEDIT.PAGEMENU.HEADINGS.SETSTATEFN 157510
2645-
. 158935) (\TEDIT.PAGEMENU.HEADINGS.STATEFN 158937 . 160487)))))
2623+
(FILEMAP (NIL (5022 51393 (DRAWMARGINSCALE 5032 . 8491) (MARGINBAR 8493 . 15618) (MARGINBAR.CREATE
2624+
15620 . 19039) (MB.MARGINBAR.BUTTONEVENTINFN 19041 . 26680) (MB.MARGINBAR.SELFN.TABS 26682 . 31922) (
2625+
MB.MARGINBAR.SELFN.TABS.KIND 31924 . 32859) (MARGINBAR.GETSTATEFN 32861 . 36739) (MARGINBAR.SETSTATEFN
2626+
36741 . 36951) (MARGINBAR.NEUTRALIZE 36953 . 37366) (MARGINBAR.LOOKS 37368 . 40474) (
2627+
MB.MARGINBAR.SIZEFN 40476 . 41079) (MB.MARGINBAR.DISPLAYFN 41081 . 44142) (MDESCALE 44144 . 44684) (
2628+
MSCALE 44686 . 45016) (MB.MARGINBAR.SHOWTAB 45018 . 47341) (MB.MARGINBAR.TABTRACK 47343 . 48728) (
2629+
MARGINBAR.INIT 48730 . 50123) (\TEDIT.PARALOOKS.TO.MARBAR 50125 . 51391)) (52218 58435 (
2630+
\TEDIT.MENU.START 52228 . 57859) (\TEDIT.MENU.BUTTONEVENTFN 57861 . 58433)) (58754 66676 (
2631+
\TEDIT.MENU.CREATE 58764 . 60575) (\TEDIT.MENU.PARSE 60577 . 64266) (\TEDIT.MENU.NEUTRALIZE 64268 .
2632+
66339) (\TEDITMENU.RECORD.UNFORMATTED 66341 . 66674)) (66742 86825 (\TEDIT.EXPANDEDMENU.CREATE 66752
2633+
. 72047) (\TEDIT.EXPANDEDMENU.START 72049 . 73423) (\TEDIT.EXPANDEDMENU.FN 73425 . 76680) (
2634+
\TEDIT.EXPANDEDMENU.ACTIONFN 76682 . 86266) (TEDIT.MENUSTREAM 86268 . 86823)) (86887 102378 (
2635+
\TEDIT.PARAMENU.CREATE 86897 . 92918) (\TEDIT.PARAMENU.START 92920 . 93786) (\TEDIT.APPLY.PARALOOKS
2636+
93788 . 94840) (\TEDIT.SHOW.PARALOOKS 94842 . 97625) (\TEDIT.PARAMENU.FILLIN 97627 . 102376)) (102497
2637+
128273 (\TEDIT.CHARMENU.CREATE 102507 . 105111) (\TEDIT.CHARMENU.START 105113 . 106144) (
2638+
\TEDIT.CHARMENU.SPEC 106146 . 110595) (\TEDIT.CHARMENU.PARSE 110597 . 113765) (\TEDIT.CHARMENU.FILLIN
2639+
113767 . 118112) (\TEDIT.SHOW.CHARLOOKS 118114 . 121371) (\TEDIT.APPLY.CHARLOOKS 121373 . 122534) (
2640+
\TEDIT.OFFSETTYPE.STATEFN 122536 . 124499) (\TEDIT.OTHER.STATECHANGEFN 124501 . 126146) (
2641+
\TEDIT.OTHER.SELECTFN 126148 . 128271)) (128335 154774 (\TEDIT.PAGEMENU.CREATE 128345 . 135539) (
2642+
\TEDIT.SHOW.PAGELOOKS 135541 . 137336) (\TEDIT.PAGEMENU.FILLIN 137338 . 138888) (
2643+
\TEDIT.PAGEREGION.UNPARSE 138890 . 148080) (\TEDIT.APPLY.PAGELOOKS 148082 . 150009) (
2644+
\TEDIT.CHANGE.PAGELOOKS 150011 . 153930) (\TEDIT.PAGEMENU.CHARLOOKS.STATEFN 153932 . 154772)) (154775
2645+
160578 (\TEDIT.PAGEMENU.CREATE.HEADINGS 154785 . 157597) (\TEDIT.PAGEMENU.HEADINGS.SETSTATEFN 157599
2646+
. 159024) (\TEDIT.PAGEMENU.HEADINGS.STATEFN 159026 . 160576)))))
26462647
STOP

library/tedit/TEDIT-MENU.LCOM

-63 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)