Skip to content

Commit c969d30

Browse files
authored
Fix cursor stability when accepting multi-line suggestions (microsoft#239604)
fixes microsoft#239599
1 parent e72728b commit c969d30

File tree

3 files changed

+20
-8
lines changed

3 files changed

+20
-8
lines changed

src/vs/editor/contrib/inlineCompletions/browser/view/ghostText/ghostTextView.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ export class GhostTextView extends Disposable {
4343
extraClasses?: string[];
4444
syntaxHighlightingEnabled: boolean;
4545
}>,
46+
private readonly _shouldKeepCursorStable: boolean,
4647
@ILanguageService private readonly _languageService: ILanguageService,
4748
) {
4849
super();
@@ -151,7 +152,8 @@ export class GhostTextView extends Disposable {
151152
minReservedLineCount: uiState.additionalReservedLineCount,
152153
targetTextModel: uiState.targetTextModel,
153154
} : undefined;
154-
})
155+
}),
156+
this._shouldKeepCursorStable
155157
)
156158
);
157159

@@ -257,7 +259,8 @@ export class AdditionalLinesWidget extends Disposable {
257259
lineNumber: number;
258260
additionalLines: LineData[];
259261
minReservedLineCount: number;
260-
} | undefined>
262+
} | undefined>,
263+
private readonly shouldKeepCursorStable: boolean
261264
) {
262265
super();
263266

@@ -334,6 +337,10 @@ export class AdditionalLinesWidget extends Disposable {
334337
}
335338

336339
private keepCursorStable(lineNumber: number, heightInLines: number): void {
340+
if (!this.shouldKeepCursorStable) {
341+
return;
342+
}
343+
337344
const cursorLineNumber = this.editor.getSelection()?.getStartPosition()?.lineNumber;
338345
if (cursorLineNumber !== undefined && lineNumber < cursorLineNumber) {
339346
this.editor.setScrollTop(this.editor.getScrollTop() + heightInLines * this.editor.getOption(EditorOption.lineHeight));

src/vs/editor/contrib/inlineCompletions/browser/view/inlineCompletionsView.ts

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,16 @@ export class InlineCompletionsView extends Disposable {
2525
private readonly _stablizedGhostTexts = convertItemsToStableObservables(this._ghostTexts, this._store);
2626
private readonly _editorObs = observableCodeEditor(this._editor);
2727

28-
private readonly _ghostTextWidgets = mapObservableArrayCached(this, this._stablizedGhostTexts, (ghostText, store) => derivedDisposable((reader) => this._instantiationService.createInstance(readHotReloadableExport(GhostTextView, reader), this._editor, {
29-
ghostText: ghostText,
30-
minReservedLineCount: constObservable(0),
31-
targetTextModel: this._model.map(v => v?.textModel),
32-
},
33-
this._editorObs.getOption(EditorOption.inlineSuggest).map(v => ({ syntaxHighlightingEnabled: v.syntaxHighlightingEnabled })))
28+
private readonly _ghostTextWidgets = mapObservableArrayCached(this, this._stablizedGhostTexts, (ghostText, store) => derivedDisposable((reader) => this._instantiationService.createInstance(readHotReloadableExport(GhostTextView, reader),
29+
this._editor,
30+
{
31+
ghostText: ghostText,
32+
minReservedLineCount: constObservable(0),
33+
targetTextModel: this._model.map(v => v?.textModel),
34+
},
35+
this._editorObs.getOption(EditorOption.inlineSuggest).map(v => ({ syntaxHighlightingEnabled: v.syntaxHighlightingEnabled })),
36+
false,
37+
)
3438
).recomputeInitiallyAndOnChange(store)
3539
).recomputeInitiallyAndOnChange(this._store);
3640

src/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/insertionView.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ export class InlineEditsInsertionView extends Disposable implements IInlineEdits
5454
targetTextModel: this._editorObs.model.map(model => model ?? undefined),
5555
},
5656
observableValue(this, { syntaxHighlightingEnabled: true, extraClasses: ['inline-edit'] }),
57+
true,
5758
));
5859

5960
constructor(

0 commit comments

Comments
 (0)