diff --git a/src/vs/editor/browser/controller/textAreaHandler.ts b/src/vs/editor/browser/controller/textAreaHandler.ts index 098af888c20b13c6e5098d85f73378daf80916e1..fb902c2a458de74571e3aa661cd2cb6f16457dd9 100644 --- a/src/vs/editor/browser/controller/textAreaHandler.ts +++ b/src/vs/editor/browser/controller/textAreaHandler.ts @@ -164,7 +164,7 @@ export class TextAreaHandler extends ViewPart { const textAreaInputHost: ITextAreaInputHost = { getPlainTextToCopy: (): string => { - const rawWhatToCopy = this._context.model.getPlainTextToCopy(this._selections, this._emptySelectionClipboard); + const rawWhatToCopy = this._context.model.getPlainTextToCopy(this._selections, this._emptySelectionClipboard, platform.isWindows); const newLineCharacter = this._context.model.getEOL(); const isFromEmptySelection = (this._emptySelectionClipboard && this._selections.length === 1 && this._selections[0].isEmpty()); diff --git a/src/vs/editor/common/viewModel/viewModel.ts b/src/vs/editor/common/viewModel/viewModel.ts index c97d919393a1f75d7df4269b02868d12f484de6d..d19255a2ae56231f3638ee7a3e6c5647aec26cc6 100644 --- a/src/vs/editor/common/viewModel/viewModel.ts +++ b/src/vs/editor/common/viewModel/viewModel.ts @@ -147,7 +147,7 @@ export interface IViewModel { deduceModelPositionRelativeToViewPosition(viewAnchorPosition: Position, deltaOffset: number, lineFeedCnt: number): Position; getEOL(): string; - getPlainTextToCopy(ranges: Range[], emptySelectionClipboard: boolean): string | string[]; + getPlainTextToCopy(ranges: Range[], emptySelectionClipboard: boolean, forceCRLF: boolean): string | string[]; getHTMLToCopy(ranges: Range[], emptySelectionClipboard: boolean): string; } diff --git a/src/vs/editor/common/viewModel/viewModelImpl.ts b/src/vs/editor/common/viewModel/viewModelImpl.ts index 5c41e95fffbf6d76627b11cbdff9ef6b4ebd4583..4bb9fb3bd7617aa08288ff5ee6e99dfa33fda0d2 100644 --- a/src/vs/editor/common/viewModel/viewModelImpl.ts +++ b/src/vs/editor/common/viewModel/viewModelImpl.ts @@ -570,8 +570,8 @@ export class ViewModel extends viewEvents.ViewEventEmitter implements IViewModel return this.model.getEOL(); } - public getPlainTextToCopy(ranges: Range[], emptySelectionClipboard: boolean): string | string[] { - const newLineCharacter = this.model.getEOL(); + public getPlainTextToCopy(ranges: Range[], emptySelectionClipboard: boolean, forceCRLF: boolean): string | string[] { + const newLineCharacter = forceCRLF ? '\r\n' : this.model.getEOL(); ranges = ranges.slice(0); ranges.sort(Range.compareRangesUsingStarts); @@ -599,7 +599,7 @@ export class ViewModel extends viewEvents.ViewEventEmitter implements IViewModel let result: string[] = []; for (let i = 0; i < nonEmptyRanges.length; i++) { - result.push(this.getValueInRange(nonEmptyRanges[i], EndOfLinePreference.TextDefined)); + result.push(this.getValueInRange(nonEmptyRanges[i], forceCRLF ? EndOfLinePreference.CRLF : EndOfLinePreference.TextDefined)); } return result.length === 1 ? result[0] : result; } diff --git a/src/vs/editor/test/common/viewModel/viewModelImpl.test.ts b/src/vs/editor/test/common/viewModel/viewModelImpl.test.ts index 41a7a8d0f7bf73a7467b5b9b72638a09f8ae7acc..e6ee98daa42bdf3ad3bc7a9df6dac2e788b9c65f 100644 --- a/src/vs/editor/test/common/viewModel/viewModelImpl.test.ts +++ b/src/vs/editor/test/common/viewModel/viewModelImpl.test.ts @@ -7,6 +7,7 @@ import * as assert from 'assert'; import { Range } from 'vs/editor/common/core/range'; import { testViewModel } from 'vs/editor/test/common/viewModel/testViewModel'; +import { EndOfLineSequence } from 'vs/editor/common/model'; suite('ViewModel', () => { @@ -109,7 +110,7 @@ suite('ViewModel', () => { function assertGetPlainTextToCopy(text: string[], ranges: Range[], emptySelectionClipboard: boolean, expected: string | string[]): void { testViewModel(text, {}, (viewModel, model) => { - let actual = viewModel.getPlainTextToCopy(ranges, emptySelectionClipboard); + let actual = viewModel.getPlainTextToCopy(ranges, emptySelectionClipboard, false); assert.deepEqual(actual, expected); }); } @@ -250,4 +251,12 @@ suite('ViewModel', () => { 'line2\nline3\n' ); }); + + test('issue #22688 - always use CRLF for clipboard on Windows', () => { + testViewModel(USUAL_TEXT, {}, (viewModel, model) => { + model.setEOL(EndOfLineSequence.LF); + let actual = viewModel.getPlainTextToCopy([new Range(2, 1, 5, 1)], true, true); + assert.deepEqual(actual, 'line2\r\nline3\r\nline4\r\n'); + }); + }); });