Skip to content

Commit 6190ed9

Browse files
committed
1 parent 33fb4fe commit 6190ed9

2 files changed

Lines changed: 35 additions & 5 deletions

File tree

src/vs/editor/common/viewModel/viewModelImpl.ts

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -628,9 +628,19 @@ export class ViewModel extends viewEvents.ViewEventEmitter implements IViewModel
628628

629629
ranges = ranges.slice(0);
630630
ranges.sort(Range.compareRangesUsingStarts);
631-
const nonEmptyRanges = ranges.filter((r) => !r.isEmpty());
632631

633-
if (nonEmptyRanges.length === 0) {
632+
let hasEmptyRange = false;
633+
let hasNonEmptyRange = false;
634+
for (const range of ranges) {
635+
if (range.isEmpty()) {
636+
hasEmptyRange = true;
637+
} else {
638+
hasNonEmptyRange = true;
639+
}
640+
}
641+
642+
if (!hasNonEmptyRange) {
643+
// all ranges are empty
634644
if (!emptySelectionClipboard) {
635645
return '';
636646
}
@@ -650,9 +660,29 @@ export class ViewModel extends viewEvents.ViewEventEmitter implements IViewModel
650660
return result;
651661
}
652662

663+
if (hasEmptyRange && emptySelectionClipboard) {
664+
// mixed empty selections and non-empty selections
665+
let result: string[] = [];
666+
let prevModelLineNumber = 0;
667+
for (const range of ranges) {
668+
const modelLineNumber = this.coordinatesConverter.convertViewPositionToModelPosition(new Position(range.startLineNumber, 1)).lineNumber;
669+
if (range.isEmpty()) {
670+
if (modelLineNumber !== prevModelLineNumber) {
671+
result.push(this.model.getLineContent(modelLineNumber));
672+
}
673+
} else {
674+
result.push(this.getValueInRange(range, forceCRLF ? EndOfLinePreference.CRLF : EndOfLinePreference.TextDefined));
675+
}
676+
prevModelLineNumber = modelLineNumber;
677+
}
678+
return result.length === 1 ? result[0] : result;
679+
}
680+
653681
let result: string[] = [];
654-
for (const nonEmptyRange of nonEmptyRanges) {
655-
result.push(this.getValueInRange(nonEmptyRange, forceCRLF ? EndOfLinePreference.CRLF : EndOfLinePreference.TextDefined));
682+
for (const range of ranges) {
683+
if (!range.isEmpty()) {
684+
result.push(this.getValueInRange(range, forceCRLF ? EndOfLinePreference.CRLF : EndOfLinePreference.TextDefined));
685+
}
656686
}
657687
return result.length === 1 ? result[0] : result;
658688
}

src/vs/editor/test/common/viewModel/viewModelImpl.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ suite('ViewModel', () => {
210210
new Range(3, 2, 3, 2),
211211
],
212212
true,
213-
'ine2'
213+
['ine2', 'line3']
214214
);
215215
});
216216

0 commit comments

Comments
 (0)