From 12893243e2aaab623762100f5e0ba0fbe7153583 Mon Sep 17 00:00:00 2001 From: Jiri Bobek Date: Thu, 28 Nov 2024 18:06:47 +0100 Subject: [PATCH] 1. fix scrolling when line wrapping is on 2. disable virtual space on wrapped lines except for the last view line 3. fix order of conditions in moveLeft operation --- src/vs/editor/browser/viewParts/viewLines/viewLines.ts | 3 ++- src/vs/editor/common/cursor/cursorMoveOperations.ts | 8 ++++---- src/vs/editor/common/viewModel/viewModelLines.ts | 6 +++++- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/vs/editor/browser/viewParts/viewLines/viewLines.ts b/src/vs/editor/browser/viewParts/viewLines/viewLines.ts index a333fc2b85730..b5fab4f6f756a 100644 --- a/src/vs/editor/browser/viewParts/viewLines/viewLines.ts +++ b/src/vs/editor/browser/viewParts/viewLines/viewLines.ts @@ -634,7 +634,8 @@ export class ViewLines extends ViewPart implements IViewLines { const newScrollLeft = this._computeScrollLeftToReveal(horizontalRevealRequest); if (newScrollLeft) { - if (!this._isViewportWrapping) { + const virtualSpace = this._context.viewModel.model.getOptions().virtualSpace; + if (!this._isViewportWrapping || virtualSpace) { // ensure `scrollWidth` is large enough this._ensureMaxLineWidth(newScrollLeft.maxHorizontalOffset); } diff --git a/src/vs/editor/common/cursor/cursorMoveOperations.ts b/src/vs/editor/common/cursor/cursorMoveOperations.ts index a710ee4389ec9..cbb07368d30df 100644 --- a/src/vs/editor/common/cursor/cursorMoveOperations.ts +++ b/src/vs/editor/common/cursor/cursorMoveOperations.ts @@ -102,12 +102,12 @@ export class MoveOperations { // for possibly negative columns. const clippedPos = MoveOperations.clipPositionColumn(pos, minColumn, maxColumn); const normalizedPos = model.normalizePosition(clippedPos, PositionAffinity.Left); - if (virtualSpace && normalizedPos.column <= minColumn) { - lineNumber = pos.lineNumber; - column = minColumn; - } else if (virtualSpace && pos.column > maxColumn) { + if (virtualSpace && pos.column > maxColumn) { lineNumber = pos.lineNumber; column = pos.column - 1; + } else if (virtualSpace && normalizedPos.column <= minColumn) { + lineNumber = pos.lineNumber; + column = minColumn; } else { const p = MoveOperations.left(config, model, normalizedPos); lineNumber = p.lineNumber; diff --git a/src/vs/editor/common/viewModel/viewModelLines.ts b/src/vs/editor/common/viewModel/viewModelLines.ts index aefc60d34d8e2..79bf149e339a9 100644 --- a/src/vs/editor/common/viewModel/viewModelLines.ts +++ b/src/vs/editor/common/viewModel/viewModelLines.ts @@ -789,6 +789,11 @@ export class ViewModelLinesFromProjectedModel implements IViewModelLines { const lineIndex = r.index; const remainder = r.remainder; + // On wrapped lines, disable virtual space on all but the last view line + const virtualSpace = + this.model.getOptions().virtualSpace + && viewLineNumber === this.projectedModelLineLineCounts.getPrefixSum(lineIndex + 1); + const line = this.modelLineProjections[lineIndex]; const minColumn = line.getViewLineMinColumn(this.model, lineIndex + 1, remainder); @@ -796,7 +801,6 @@ export class ViewModelLinesFromProjectedModel implements IViewModelLines { if (viewColumn < minColumn) { viewColumn = minColumn; } - const virtualSpace = this.model.getOptions().virtualSpace; let viewLeftoverVisibleColumns = 0; if (viewColumn > maxColumn) { viewLeftoverVisibleColumns = virtualSpace ? viewColumn - maxColumn : 0;