Mark Morgan Lloyd wrote 35 lines
Martin wrote:
> On 25/02/2012 16:48, Mark Morgan Lloyd wrote:
>> Is my understanding correct that in order to get Synedit's replace
>> facility working, one has to write a custom OnReplaceText handler?
>>
>> What does this in the source do:
>>
>> CurReplace:=AReplace;
>> if ssoRegExpr in AOptions then
>> CurReplace:=fTSearch.RegExprReplace;
>>
>> Is there (partial) support for regex-based S&R, and if so how does
>> one use it?
>>
>
> What is wrong with:
> replace one (first after x/y = 1/1)
> SynEdit1.SearchReplaceEx('a(.)', 'b$1', [ssoReplace, ssoRegExpr],
> Point(1,1));
>
> or replace all (after x/y = 1/1)
> SynEdit1.SearchReplaceEx('a(.)', 'b$1', [ssoReplaceAll,
> ssoRegExpr], Point(1,1));
>
> SynEdit has no build-in confirm dialog, if that is what you mean
No, I just mean I don't understand how to use it and can't find any
usage notes. What's supposed to happen- does Synedit call the
OnReplaceText handler and expect this to actually do the
search/replace? Or is the handler there to allow a confirmation
dialogue to be displayed, after which code like you've shown above
should be called explicitly?
(I think I understand the regex usage in your example, thanks for that).
Yes I am aware of the total lack of documentation for SynEdit...
Anyway:
1) you need to use "SyneditTypes"
the options are
TSynSearchOption =
( ssoMatchCase, ssoWholeWord,
ssoBackwards,
ssoEntireScope, ssoSelectedOnly,
ssoReplace, ssoReplaceAll,
ssoPrompt,
ssoSearchInReplacement, // continue search-replace in replacement (with ssoReplaceAll) // replace recursive ssoRegExpr, ssoRegExprMultiLine,
ssoFindContinue // Assume the current selection is the last match, and start search behind selection
// (before if ssoBackward) // Default is to
start at caret (Only SearchReplace / SearchReplaceEx has start/end param)
);
TSynSearchOptions = set of TSynSearchOption;
2) The callback
bPrompt := (ssoPrompt in AOptions);
if bPrompt and Assigned(fOnReplaceText) then begin
nAction := DoOnReplaceText(ASearch,CurReplace,
ptFoundStart.Y,ptFoundStart.X);
// calling your event
TReplaceTextEvent = procedure(Sender: TObject; const ASearch, AReplace:
string; Line, Column: integer; var ReplaceAction:
TSynReplaceAction) of object;
NOTE: if you call BeginUpdate, then SynEdit can not paint. So make sure you have not called it.
The editor will select the found text and move it into the visible area, before it calls the event
your callback can set TSynReplaceAction to:
TSynReplaceAction = (raCancel, raSkip, raReplace, raReplaceAll);
Cancel, aborts the search
ReplaceAll, means no further callbacks