diff --git a/apps/client/src/widgets/find_in_code.ts b/apps/client/src/widgets/find_in_code.ts index df413fb30..a66683eee 100644 --- a/apps/client/src/widgets/find_in_code.ts +++ b/apps/client/src/widgets/find_in_code.ts @@ -61,23 +61,7 @@ export default class FindInCode { } async replaceAll(replaceText: string) { - if (!this.findResult || this.findResult.length === 0) { - return; - } const codeEditor = await this.getCodeEditor(); - const doc = codeEditor?.doc; - codeEditor?.operation(() => { - if (!this.findResult) { - return; - } - - for (let currentFound = 0; currentFound < this.findResult.length; currentFound++) { - let marker = this.findResult[currentFound]; - let pos = marker.find(); - doc?.replaceRange(replaceText, pos.from, pos.to); - marker.clear(); - } - }); - this.findResult = []; + codeEditor?.replaceAll(replaceText); } } diff --git a/packages/codemirror/src/find_replace.ts b/packages/codemirror/src/find_replace.ts index 139691e46..493b9e008 100644 --- a/packages/codemirror/src/find_replace.ts +++ b/packages/codemirror/src/find_replace.ts @@ -57,6 +57,18 @@ export class SearchHighlighter { }); } + replaceAll(replacementText: string) { + if (!this.parsedMatches.length) return; + + this.view.dispatch({ + changes: this.parsedMatches.map(change => ({ + from: change.from, + to: change.to, + insert: replacementText + })) + }); + } + scrollToMatch(matchIndex: number) { if (this.parsedMatches.length <= matchIndex) { return; diff --git a/packages/codemirror/src/index.ts b/packages/codemirror/src/index.ts index a9310a220..af1c5ce7e 100644 --- a/packages/codemirror/src/index.ts +++ b/packages/codemirror/src/index.ts @@ -198,6 +198,10 @@ export default class CodeMirror extends EditorView { this.searchPlugin?.replaceActiveMatch(replaceText); } + async replaceAll(replaceText: string) { + this.searchPlugin?.replaceAll(replaceText); + } + cleanSearch() { if (this.searchPlugin) { this.dispatch({