@@ -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 }
0 commit comments