From c935020a8aead42e97614ca875853d26089d5e1a Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 25 Apr 2018 22:23:54 +0200 Subject: [PATCH] Fixes #22688: Always use CRLF for clipboard on Windows --- src/vs/editor/browser/controller/textAreaHandler.ts | 2 +- src/vs/editor/common/viewModel/viewModel.ts | 2 +- src/vs/editor/common/viewModel/viewModelImpl.ts | 6 +++--- .../test/common/viewModel/viewModelImpl.test.ts | 11 ++++++++++- 4 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/vs/editor/browser/controller/textAreaHandler.ts b/src/vs/editor/browser/controller/textAreaHandler.ts index 098af888c20..fb902c2a458 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 c97d919393a..d19255a2ae5 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 5c41e95fffb..4bb9fb3bd76 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 41a7a8d0f7b..e6ee98daa42 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'); + }); + }); });