Skip to content

Commit 896de33

Browse files
authored
Merge pull request microsoft#94327 from shskwmt/94173-scroll-when-inserting-suggestion
Feature microsoft#94173: Scroll when inserting suggestion
2 parents 3efa5a6 + 886da60 commit 896de33

2 files changed

Lines changed: 19 additions & 2 deletions

File tree

src/vs/editor/browser/core/editorState.ts

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -156,12 +156,13 @@ export class StableEditorScrollState {
156156
visiblePositionScrollDelta = editor.getScrollTop() - visiblePositionScrollTop;
157157
}
158158
}
159-
return new StableEditorScrollState(visiblePosition, visiblePositionScrollDelta);
159+
return new StableEditorScrollState(visiblePosition, visiblePositionScrollDelta, editor.getPosition());
160160
}
161161

162162
constructor(
163163
private readonly _visiblePosition: Position | null,
164-
private readonly _visiblePositionScrollDelta: number
164+
private readonly _visiblePositionScrollDelta: number,
165+
private readonly _cursorPosition: Position | null
165166
) {
166167
}
167168

@@ -171,4 +172,15 @@ export class StableEditorScrollState {
171172
editor.setScrollTop(visiblePositionScrollTop + this._visiblePositionScrollDelta);
172173
}
173174
}
175+
176+
public restoreRelativeVerticalPositionOfCursor(editor: ICodeEditor): void {
177+
const currentCursorPosition = editor.getPosition();
178+
179+
if (!this._cursorPosition || !currentCursorPosition) {
180+
return;
181+
}
182+
183+
const offset = editor.getTopForLineNumber(currentCursorPosition.lineNumber) - editor.getTopForLineNumber(this._cursorPosition.lineNumber);
184+
editor.setScrollTop(editor.getScrollTop() + offset);
185+
}
174186
}

src/vs/editor/contrib/suggest/suggestController.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { isNonEmptyArray } from 'vs/base/common/arrays';
88
import { onUnexpectedError } from 'vs/base/common/errors';
99
import { KeyCode, KeyMod, SimpleKeybinding } from 'vs/base/common/keyCodes';
1010
import { dispose, IDisposable, DisposableStore, toDisposable, MutableDisposable } from 'vs/base/common/lifecycle';
11+
import { StableEditorScrollState } from 'vs/editor/browser/core/editorState';
1112
import { ICodeEditor } from 'vs/editor/browser/editorBrowser';
1213
import { EditorAction, EditorCommand, registerEditorAction, registerEditorCommand, registerEditorContribution, ServicesAccessor } from 'vs/editor/browser/editorExtensions';
1314
import { EditOperation } from 'vs/editor/common/core/editOperation';
@@ -273,6 +274,8 @@ export class SuggestController implements IEditorContribution {
273274
// keep item in memory
274275
this._memoryService.memorize(model, this.editor.getPosition(), item);
275276

277+
const scrollState = StableEditorScrollState.capture(this.editor);
278+
276279
if (Array.isArray(suggestion.additionalTextEdits)) {
277280
this.editor.executeEdits('suggestController.additionalTextEdits', suggestion.additionalTextEdits.map(edit => EditOperation.replace(Range.lift(edit.range), edit.text)));
278281
}
@@ -290,6 +293,8 @@ export class SuggestController implements IEditorContribution {
290293
adjustWhitespace: !(suggestion.insertTextRules! & CompletionItemInsertTextRule.KeepWhitespace)
291294
});
292295

296+
scrollState.restoreRelativeVerticalPositionOfCursor(this.editor);
297+
293298
if (!(flags & InsertFlags.NoAfterUndoStop)) {
294299
this.editor.pushUndoStop();
295300
}

0 commit comments

Comments
 (0)