Fix cursor moving perf

This commit is contained in:
Andras Schmelczer 2025-08-26 21:17:57 +01:00
parent 6afb828bd9
commit 2ff1384fde
No known key found for this signature in database
GPG key ID: FC8F2C3D3D1A718C

View file

@ -102,39 +102,11 @@ export class RemoteCursorsPluginValue implements PluginValue {
const original = update.startState.doc.toString();
const edited = update.state.doc.toString();
const updatedPositions: number[] = [];
const reconciled = reconcileWithHistory(
RemoteCursorsPluginValue.interpolateRemoteCursorPositions(
original,
{
text: original,
cursors: RemoteCursorsPluginValue.cursors.flatMap(
({ span }, i) => [
{ id: i * 2, position: span.start },
{ id: i * 2 + 1, position: span.end }
]
)
},
edited,
"Character"
edited
);
reconciled.cursors.forEach(({ id, position }) => {
const whereToJump = findWhereToMoveCursor(
position,
reconciled.history
);
if (whereToJump !== null) {
updatedPositions[id] = whereToJump;
} else {
updatedPositions[id] = position;
}
});
RemoteCursorsPluginValue.cursors.forEach(({ span }, i) => {
span.start = updatedPositions[i * 2];
span.end = updatedPositions[i * 2 + 1];
});
const decorations: Range<Decoration>[] = [];
RemoteCursorsPluginValue.cursors.forEach(
@ -207,6 +179,50 @@ export class RemoteCursorsPluginValue implements PluginValue {
this.decorations = Decoration.set(decorations, true);
}
private static interpolateRemoteCursorPositions(
original: string,
edited: string
): void {
if (
original === edited ||
RemoteCursorsPluginValue.cursors.length === 0
) {
return;
}
const updatedPositions: number[] = [];
const reconciled = reconcileWithHistory(
original,
{
text: original,
cursors: RemoteCursorsPluginValue.cursors.flatMap(
({ span }, i) => [
{ id: i * 2, position: span.start },
{ id: i * 2 + 1, position: span.end }
]
)
},
edited
);
reconciled.cursors.forEach(({ id, position }) => {
const whereToJump = findWhereToMoveCursor(
position,
reconciled.history
);
if (whereToJump !== null) {
updatedPositions[id] = whereToJump;
} else {
updatedPositions[id] = position;
}
});
RemoteCursorsPluginValue.cursors.forEach(({ span }, i) => {
span.start = updatedPositions[i * 2];
span.end = updatedPositions[i * 2 + 1];
});
}
}
export const remoteCursorsPlugin = ViewPlugin.fromClass(