chore(code/find): reimplement single replace

This commit is contained in:
Elian Doran 2025-05-12 23:52:41 +03:00
parent 690337ee40
commit b646475018
No known key found for this signature in database
3 changed files with 19 additions and 35 deletions

View File

@ -54,43 +54,12 @@ export default class FindInCode {
codeEditor?.cleanSearch(); codeEditor?.cleanSearch();
codeEditor?.focus(); codeEditor?.focus();
} }
async replace(replaceText: string) {
// this.findResult may be undefined and null
if (!this.findResult || this.findResult.length === 0) {
return;
}
let currentFound = -1;
this.findResult.forEach((marker, index) => {
const pos = marker.find();
if (pos) {
if (marker.className === FIND_RESULT_SELECTED_CSS_CLASSNAME) {
currentFound = index;
return;
}
}
});
if (currentFound >= 0) {
let marker = this.findResult[currentFound];
let pos = marker.find();
const codeEditor = await this.getCodeEditor();
const doc = codeEditor?.doc;
if (doc) {
doc.replaceRange(replaceText, pos.from, pos.to);
}
marker.clear();
let nextFound; async replace(replaceText: string) {
if (currentFound === this.findResult.length - 1) { const codeEditor = await this.getCodeEditor();
nextFound = 0; codeEditor?.replace(replaceText);
} else {
nextFound = currentFound;
}
this.findResult.splice(currentFound, 1);
if (this.findResult.length > 0) {
this.findNext(0, nextFound, nextFound);
}
}
} }
async replaceAll(replaceText: string) { async replaceAll(replaceText: string) {
if (!this.findResult || this.findResult.length === 0) { if (!this.findResult || this.findResult.length === 0) {
return; return;

View File

@ -46,6 +46,17 @@ export class SearchHighlighter {
this.#scrollToMatchNearestSelection(); this.#scrollToMatchNearestSelection();
} }
replaceActiveMatch(replacementText: string) {
if (!this.parsedMatches.length || this.currentFound === 0) return;
const matchIndex = this.currentFound - 1;
const match = this.parsedMatches[matchIndex];
this.view.dispatch({
changes: { from: match.from, to: match.to, insert: replacementText }
});
}
scrollToMatch(matchIndex: number) { scrollToMatch(matchIndex: number) {
if (this.parsedMatches.length <= matchIndex) { if (this.parsedMatches.length <= matchIndex) {
return; return;

View File

@ -194,6 +194,10 @@ export default class CodeMirror extends EditorView {
this.searchPlugin?.scrollToMatch(nextFound); this.searchPlugin?.scrollToMatch(nextFound);
} }
async replace(replaceText: string) {
this.searchPlugin?.replaceActiveMatch(replaceText);
}
cleanSearch() { cleanSearch() {
if (this.searchPlugin) { if (this.searchPlugin) {
this.dispatch({ this.dispatch({